ЁЯдЦ рдзрдбрд╛ 25 тАФ CRDs рдЖрдгрд┐ operators: office рд▓рд╛ рдирд╡реЗ рд╢рдмреНрдж рд╢рд┐рдХрд╡рдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 25 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-24-cluster-upgrades ┬╖ рдкреБрдвреАрд▓: lesson-26-observability
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рдЕрд░реНрдзреНрдпрд╛ cloud-native рдЬрдЧрд╛рдорд╛рдЧрдЪреА рд╡рд┐рд╕реНрддрд╛рд░-рдпрдВрддреНрд░рдгрд╛: CustomResourceDefinitions рдЖрдгрд┐ operator pattern.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдЪреЗ office (L13) рдПрдХ рдард░рд▓реЗрд▓рд╛ рд╢рдмреНрджрдХреЛрд╢ рдмреЛрд▓рддреЗ: Pod, Deployment, ServiceтАж рдкрдг Kubernetes рдЪреА рд╕рд░реНрд╡рд╛рдд рдЦреЛрд▓ рдпреБрдХреНрддреА рд╣реА тАФ рддреБрдореНрд╣реА рддреНрдпрд╛рд▓рд╛ рдирд╡реЗ рд╢рдмреНрдж рд╢рд┐рдХрд╡реВ рд╢рдХрддрд╛ ЁЯУЦтЬи:
- рд╢рдмреНрдж рд╢рдмреНрджрдХреЛрд╢рд╛рдд рдЬреЛрдбрд╛ (рдПрдХ CRD): "рдЖрддрд╛
BackupPlanрдирд╛рд╡рд╛рдЪреА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ, рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ fields рдЪрд╛ рдЕрд░реНрде рд╣рд╛ рдЖрд╣реЗ." рд▓рдЧреЗрдЪkubectl get backupplansрдЪрд╛рд▓рддреЗ, рдЗрдЪреНрдЫрд╛ рдиреЛрдВрджрд╡рд╣реАрдд (etcd) рд╕рд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, RBAC рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╡рд░ рдлрд╛рдЯрдХ рд▓рд╛рд╡реВ рд╢рдХрддреЗ (L17)тАж рдЖрдгрд┐ рдмрд╛рдХреА рдХрд╛рд╣реАрдЪ рдШрдбрдд рдирд╛рд╣реА. рдХреЛрдгрд╛рд▓рд╛рдЪ рди рдХрд│рдгрд╛рд░рд╛ рд╢рдмреНрдж рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдлрд╛рдИрд▓рдордзреНрдпреЗ рдареЗрд╡рд▓реЗрд▓реЗ рдХрд╛рдЧрдж. - рддреНрдпрд╛ рд╢рдмреНрджрд╛рд╡рд░ рдХрд╛рдо рдХрд░рдгрд╛рд░рд╛ robot рдиреЗрдорд╛ (рдПрдХ controller): рддреЛ рдиреЛрдВрджрд╡рд╣реАрдд
BackupPlanрдЗрдЪреНрдЫрд╛рдВрд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рддреЛ рдЖрдгрд┐ рд╡рд╛рд╕реНрддрд╡ рд╕рддрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рдЬреБрд│рд╡рдд рд░рд╛рд╣рддреЛ тАФ рдзрдбрд╛ 03 рдЪреНрдпрд╛ рд╡рд░реНрдЧ-monitor рд╕рд╛рд░рдЦрд╛рдЪ reconcile loop, рдлрдХреНрдд рддреБрдореНрд╣реА рд╢реЛрдзрд▓реЗрд▓реНрдпрд╛ рд╢рдмреНрджрд╛рд╕рд╛рдареА.
CRD + controller + рдЖрдд рдмрд╕рд╡рд▓реЗрд▓реЗ рдХреМрд╢рд▓реНрдп = operator тАФ рдПрдХ robot рдХрд░реНрдордЪрд╛рд░реА рдЬреЛ software рдПрдЦрд╛рджрд╛ рдорд╛рдирд╡реА рддрдЬреНрдЬреНрдЮ рдЪрд╛рд▓рд╡реЗрд▓ рддрд╕реЗ рдЪрд╛рд▓рд╡рддреЛ:
- рддреБрдореНрд╣реА рдПрдХ рдЖрдзреАрдЪ рд╡рд╛рдкрд░рд▓рд╛ рдЖрд╣реЗ: ArgoCD!
Applicationрд╣рд╛ CRD рдЖрд╣реЗ; рддреНрдпрд╛рдЪрд╛ controller рдореНрд╣рдгрдЬреЗ рдХрд╛рд│рдЬреАрд╡рд╛рд╣реВ robot. рддреЛ "рдЖрдгрдЦреА рдПрдХ Application file" workflow? рд╣реАрдЪ рдпрдВрддреНрд░рдгрд╛. - cert-manager:
CertificateрдЪреА рдЗрдЪреНрдЫрд╛ рдХрд░рд╛ тЖТ robot TLS рдорд┐рд│рд╡рддреЛ рдЖрдгрд┐ рдХрд╛рдпрдо renew рдХрд░рддреЛ. - CloudNativePG:
ClusterрдЪреА рдЗрдЪреНрдЫрд╛ рдХрд░рд╛ (Postgres, 3 replicas) тЖТ robot replication, failover, backups рдХрд░рддреЛ тАФ L22 рдиреЗ рджрд╛рдЦрд╡рд▓реЗрд▓реЗ "рдЧреНрд░рдВрдердкрд╛рд▓ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЖрддрдЪ рдиреЗрдорд╛" рд╣реЗ рдЙрддреНрддрд░.
рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛рдпрдЪрд╛ pattern: Kubernetes рдордзреНрдпреЗ, рд╕рдЧрд│реЗ рдХрд╛рд╣реА тАФ рдЕрдВрдЧрднреВрдд рдЕрд╕реЛ рд╡рд╛ рд╢реЛрдзрд▓реЗрд▓реЗ тАФ рдиреЛрдВрджрд╡рд╣реАрддрд▓рд╛ рдПрдХ рд╢рдмреНрдж рдЖрдгрд┐ рддреЛ рдЦрд░рд╛ рдХрд░рдгрд╛рд░рд╛ рдПрдХ robot рдЕрд╕рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
crd["ЁЯУЦ CRD<br/>new word: BackupPlan<br/>+ its grammar (fields)"]
api["ЁЯПв office / etcd<br/>stores BackupPlan wishes<br/>kubectl & RBAC just work"]
cr["ЁЯУД your wish<br/>kind: BackupPlan<br/>nightly: true"]
ctrl["ЁЯдЦ controller<br/>watches the word,<br/>reconciles forever (= L03 loop)"]
real["тЬЕ reality<br/>CronJobs created,<br/>buckets configuredтАж"]
crd -->|"1 teach"| api
cr -->|"2 file a wish"| api
ctrl -->|"3 reads wishes"| api
ctrl -->|"4 makes true"| real
тЭУ рдХрд╛рдп
- CRD group/version/kind + рдПрдХ OpenAPI schema рдард░рд╡рддреЛ (validation рдореЛрдлрдд). Instances ("custom resources") рдХреЛрдгрддреНрдпрд╛рд╣реА object рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрддрд╛рдд: YAML, GitOps-рдпреЛрдЧреНрдп (ArgoCD рдХреЛрд░реНрд╕ CRs рдЖрдирдВрджрд╛рдиреЗ deploy рдХрд░рддреЛ), RBAC-рдпреЛрдЧреНрдп.
- Controllers рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд programs (рд╕рд╣рд╕рд╛ cluster рдордзрд▓реЗ Deployments), рдЬреЗ watch API рд╡рд╛рдкрд░рддрд╛рдд; рддрдпрд╛рд░ рдЕрд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ kubebuilder/operator-sdk рдиреЗ рд╕реНрд╡рддрдГрдЪрд╛ рд▓рд┐рд╣рд╛ тАФ рдХрд┐рдВрд╡рд╛ рдХрдзреАрдЪ рдирд╛рд╣реА, рдмрд╣реБрддреЗрдХ teams рдлрдХреНрдд operators рд╡рд╛рдкрд░рддрд╛рдд.
- Operators stateful/рддрдЬреНрдЬреНрдЮ software рд╕рд╛рдареА рдЪрдордХрддрд╛рдд (databases, queues, certs, service meshes). Install рдХрд░рдгреНрдпрд╛рдЖрдзреА рдкрд╛рд░рдЦрд╛: рд╣реЗ рдЬрд╡рд│рдЬрд╡рд│ cluster-admin рдЕрд╕рд▓реЗрд▓реЗ software рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ upgrade (L24) рдЖрдгрд┐ monitor (L26) рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ тАФ trade-offs рдкрд╛рди рд▓рд╛рдЧреВ рд╣реЛрддреЗ!
- рдкреНрд░рддреНрдпрдХреНрд╖ рдЬрдЧрд╛рдд рдУрд│рдЦрд╛: рдХрд╛рд╣реАрддрд░реА рд░реЛрдЪрдХ install рдХреЗрд▓реНрдпрд╛рд╡рд░
kubectl get crdsтАФ рдПрдХрдЯрд╛ ArgoCD office рд▓рд╛ рдЕрдиреЗрдХ рдирд╡реЗ рд╢рдмреНрдж рд╢рд┐рдХрд╡рддреЛ.
ЁЯдФ рдХрд╛
"рд╕рдЧрд│реЗ Kubernetes рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рди рдмрд╛рдВрдзрддрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд░ рдХрд╛ рдмрд╛рдВрдзрддрд╛рдд" рдпрд╛рдЪреЗ рд╣реЗ рдЙрддреНрддрд░ рдЖрд╣реЗ: рдПрдХ рдиреЛрдВрджрд╡рд╣реА, рдПрдХ reconcile pattern, рдПрдХ CLI, рдПрдХ RBAC тАФ рдХреЛрдгреАрд╣реА рдХрдзреАрд╣реА рд╢реЛрдзрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓реНрдкрдиреЗрд╕рд╛рдареА. CRDs рд╕рдордЬрд▓реНрдпрд╛рдореБрд│реЗ ArgoCD, cert-manager рдЖрдгрд┐ CloudNativePG рд╕рд╛рд░рдЦреА tools рдЬрд╛рджреВ рди рд░рд╛рд╣рддрд╛ "рдПрдХ рд╢рдмреНрдж рдЖрдгрд┐ рдПрдХ robot" рдмрдирддрд╛рдд тАФ рдЖрдгрд┐ рд╣реЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбреЗрд▓ рд╣реАрдЪ рдЦрд░реА рдкрджрд╡реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ robot рд╢рд┐рд╡рд╛рдп рдПрдХ рд╢рдмреНрдж рд╢рд┐рдХрд╡рд╛, рдЖрдгрд┐ рд╢рд╛рдВрддрддрд╛ рдЕрдиреБрднрд╡рд╛
kubectl apply -f - <<'EOF'
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata: { name: backupplans.school.example.com }
spec:
group: school.example.com
scope: Namespaced
names: { kind: BackupPlan, plural: backupplans, singular: backupplan }
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
nightly: { type: boolean }
EOF
kubectl apply -f - <<'EOF'
apiVersion: school.example.com/v1
kind: BackupPlan
metadata: { name: my-wish, namespace: school }
spec: { nightly: true }
EOF
kubectl -n school get backupplans # your word, first-class citizen!
# ...and nothing else happens, ever тАФ no robot knows the word. THAT gap
# (wish stored тЙа wish fulfilled) is exactly what a controller fills. ЁЯдЦ
kubectl -n school delete backupplan my-wish
kubectl delete crd backupplans.school.example.com
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get crd ┬╖ kubectl explain ┬╖ kubectl api-resources | grep school
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯдЦ ArgoCD рд╢рд╛рд│рд╛ L07 (Application рдореНрд╣рдгрдЬреЗ рдиреЗрдордХреЗ рд╣реЗрдЪ)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
CRD рдирдВрддрд░ kubectl get backupplans рдЪрд╛рд▓рддреЗ; kubectl explain backupplan рддреБрдордЪрд╛ schema рдЫрд╛рдкрддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
kubectl delete crd backupplans.school.io рддреЛ рд╢рдмреНрдж рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ object рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- controller рдирд╕рд▓реЗрд▓рд╛ CRD рдЖрдгрд┐ рдХрд╛рд╣реАрддрд░реА рдШрдбреЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛
- CronJob + Deployment рдЖрдзреАрдЪ рдЬреЗ рдХрд░рддрд╛рдд рддреНрдпрд╛рд╕рд╛рдареА operator рд▓рд┐рд╣рд┐рдгреЗ
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛: рд╣реЗ рд╕рдЧрд│реЗ рдЪрд╛рд▓рддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд░реЛрдЦрд░ рджрд┐рд╕рддреЗ рдХрд╛? рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ, рджреИрдирдВрджрд┐рдиреА рдЖрдгрд┐ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛: observability.
git checkout lesson-26-observability