CustomResourceDefinition (CRD) în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) Kubernetes 1.16+ (apiextensions.k8s.io/v1)

Adaugă în API-ul Kubernetes un tip nou de obiect (resursă proprie), cu schemă validată, folosit de operatori și controllere.

Sintaxă comandă
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition

Ce face CustomResourceDefinition (CRD)

Un CRD învață clusterul un tip nou de obiect, de exemplu Backup sau Certificate. După aplicarea lui, poți crea, lista și șterge obiecte de acel tip cu kubectl, ca pe orice resursă, iar API-ul le validează după schema OpenAPI din definiție. Gateway API, cert-manager, Argo CD și mulți operatori pentru baze de date sunt construiți pe CRD-uri.

Un CRD singur doar stochează date: nu face nimic cu ele. Comportamentul vine de la un controller (operator) care urmărește obiectele și acționează (de exemplu pornește un Job de backup). Numele CRD-ului este întotdeauna <plural>.<grup>.

Parametri

Parametru Descriere
spec.group Grupul API, de obicei un domeniu deținut (firma.ro).
spec.names kind, plural, singular și shortNames.
spec.scope Namespaced sau Cluster.
spec.versions[].schema.openAPIV3Schema Schema de validare a obiectelor.
versions[].served / storage Dacă versiunea e oferită de API și dacă e cea în care se salvează datele (exact una).
versions[].additionalPrinterColumns Coloane suplimentare afișate de kubectl get.

Exemple

Exemplul 1: Un tip nou: Backup

Obiectele Backup descriu ce bază de date se salvează, după ce program și câte copii se păstrează.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: backups.firma.ro
spec:
  group: firma.ro
  scope: Namespaced
  names:
    kind: Backup
    plural: backups
    singular: backup
    shortNames: [bk]
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              required: [baza, program]
              properties:
                baza: {type: string}
                program: {type: string}
                pastrare: {type: integer, minimum: 1, default: 7}
      additionalPrinterColumns:
        - name: Program
          type: string
          jsonPath: .spec.program
        - name: Pastrare
          type: integer
          jsonPath: .spec.pastrare

Exemplul 2: Crearea și listarea obiectelor de tip nou

Câmpul pastrare lipsește, deci primește valoarea implicită 7 din schemă. Un obiect fără program ar fi refuzat.

kubectl apply -f backup-crd.yaml
kubectl apply -n magazin -f - <<'EOF'
apiVersion: firma.ro/v1
kind: Backup
metadata:
  name: baza-zilnic
spec:
  baza: postgres-magazin
  program: "0 2 * * *"
EOF
kubectl get bk -n magazin

Ieșire în terminal

customresourcedefinition.apiextensions.k8s.io/backups.firma.ro created
backup.firma.ro/baza-zilnic created
NAME          PROGRAM     PASTRARE   AGE
baza-zilnic   0 2 * * *   7          4s

Greșeli frecvente

  • Ștergerea unui CRD „ca să-l reinstalezi”: kubectl delete crd șterge și toate obiectele de acel tip din tot clusterul.
  • Așteptarea ca obiectele să facă ceva fără controller: un Backup creat doar cu CRD-ul nu pornește niciun backup. Verifică dacă operatorul care îl folosește este instalat și rulează.

Comenzi înrudite

  • Gateway API: Gateway și GatewayClass: Punctul de intrare în cluster din Gateway API, succesorul lui Ingress: definește porturile, protocoalele și certificatele TLS.
  • Obiectul ServiceAccount: Identitatea cu care un Pod se autentifică la API-ul Kubernetes; primește drepturi prin RBAC și un token de scurtă durată.