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
Backupcreat 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ă.