Kubernetes 'կլաստերներ և Helm charts
Kubernetes 'կլաստերներ և Helm charts
1) Պերեստրոյկայի ճարտարապետությունը վերևի հայացքն է
Disl Plane: «kube-apiserver», «etcd», «kube-scheduler», «kube-entler-2019» (կառավարվող ամպերում մի մասը թաքնված է)։
Worker: «kubelet», CRI-rantaim (CRI-O), CNI-plagin, kube-proxy/ebpf-proxy։
Ներերակային ցանցը ՝ Pod-to-Pod, System-VIP/ClusterIP, RTO NO։
Մոսկվա: CSI վարորդներ, PVC 24PV (Storts Class) դինամիկ պրովիզինինգը։
Հրաժարման սահմանները 'հանգույց/AZ/տարածք։ Տեղադրեք օրինակներ գոտիներով (TopologySpreadConstrainment/anti-affinity)։
Տիպիկ դերեր
Պլատֆորմենային թիմը 'ստեղծում է/ապգրադավորում կլաստերներ, CNI/CSI/Ingress, քաղաքականություն և GitOps։
Ապրանքային թիմերը 'ավելացնում են գծապատկերները/օրինագծերը, հետևում են անվտանգության և ռեսուրսների քաղաքականություններին։
2) Կյանքի ցիկլը
Ստեղծում ՝ kOps, kubeadm, Rancher, EKS/AKS/GKE։ Անմիջապես միացրեք OIDC-վավերացումը և աուդիտը։
Apgraids: minor-տարբերակները հերթով (www.l plane), որը վերահսկվում է Unavailable-ի կողմից, սթեյջինգի թեստերը։
Add-ons (բոլորը Helm/GitoPs): CNI (Calico/Cil.ru), CSI վարորդ, Ingress վերահսկիչ (NGINX/Gateway API/Wintour/Traefik), Metrice-Server-Server, Cerver-Autoscaler, Node-Internal III, տրամաբանությունը/մետրերը/թրեյսը։
Bakaps: etcd entapshot (եթե www.f-inted), Velero namespace/PVC-ի համար։
3) Ցանցեր, ծառայություններ և ingress
CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).
Մոսկվա: «ClusterIP», «NodePox», «LoadBalancer» (L4 ամպերի հավասարակշռություն), «ExternalName»։
Ingress/Gateway API: L7-միկրոօրգանիզացիա, TSA, anamnez rate-limit/WAF պարագծի վրա։
NetworkPolicy: լռելյայն deny-all + ակնհայտ allow namespace/label։
Headless-2019 ("clusterIP: None ') StatefullPro-ի և դիսկերի ծառայության համար։
4) Մոսկվան (CSI) և վիճակը
Storts Class: «reclaimPolicy», «volumeBindingMode» («WaitFirStonsumer»)։
StatefullPro: Կայուն անուններ/հատորներ («volumeClaimTemplates»), «podJ Policy: Parallel» արագ տեղակայման համար։
ReadWrance Many: օգտագործեք բաշխված ալյումինե (EFC/Investore) զգուշորեն գնահատեք լատենտությունը։
Նկարները '«VolumeDiapshotClass» + cast-bakaps։
5) Բազմաբնույթ և քաղաքականություն
Namespaces-ը ապրանքներ/միջատներ։
RBAC 'նվազագույն դերեր, առանձին հաշիվներ, «Role »/« RoleBinding» փոխարեն «ClusterRole», որտեղ հնարավոր է։
PMS (Pod You Admission): «baseline »/« restricted» ռեժիմները (PSA փոխարինումը)։
ResourceQuota / LimitRange: потолки CPU/Memory/PVC/LoadBalancer.
OPA Gatekeeper/Kyverno 'թույլատրման քաղաքականություն (օրինակ արգելքը' latest ', պահանջը' resources "," readOnlyRootem ")։
Imault Policy/webhuki: Պատկերների ստորագրման ստուգում (cos.ru/policy-winler)։
6) Դիտողությունն ու շահագործումը
Մետրիկները ՝ Prometheus-stek, kube-state-metrance, node-օպերատորներ։
Լոգներ ՝ Fluent Bit/Vector-ը օբյեկտի/ES/OpenSearch-ն, հանգույցների վրա։
Թրեյսները ՝ OpenTelemetry Collector։
SLO-dashbords: RED մոդելը ingress-ի և հիմնական ծառայությունների վրա։
Autokrail: HPA (ծրագրի մետրերով), SNA բեքգրադի, Cluster-Autoscaler-ի համար հանգույցների համար։
7) Մանիֆեստների պատրանքները (լրտեսություն)
Deploy.ru (կանգնել)
yaml apiVersion: apps/v1 kind: Deployment metadata: { name: api, labels: { app: api } }
spec:
replicas: 3 strategy: { type: RollingUpdate, rollingUpdate: { maxUnavailable: 0, maxSurge: 1 } }
selector: { matchLabels: { app: api } }
template:
metadata:
labels: { app: api }
spec:
serviceAccountName: api-sa securityContext: { runAsNonRoot: true, fsGroup: 2000 }
containers:
- name: api image: registry. example. com/api:1. 2. 3 ports: [{ containerPort: 8080 }]
resources: { requests: { cpu: "200m", memory: "256Mi" }, limits: { cpu: "1", memory: "512Mi" } }
readinessProbe: { httpGet: { path: /healthz, port: 8080 }, periodSeconds: 5 }
livenessProbe: { httpGet: { path: /livez, port: 8080 }, initialDelaySeconds: 20 }
StatefullExpress (հատված)
yaml apiVersion: apps/v1 kind: StatefulSet metadata: { name: db }
spec:
serviceName: db replicas: 3 podManagementPolicy: Parallel selector: { matchLabels: { app: db } }
template:
metadata: { labels: { app: db } }
spec:
containers:
- name: db image: postgres:16-alpine volumeMounts: [{ name: data, mountPath: /var/lib/postgresql/data }]
volumeClaimTemplates:
- metadata: { name: data }
spec:
accessModes: ["ReadWriteOnce"]
resources: { requests: { storage: 100Gi } }
storageClassName: fast-ssd
PDB (PodDisruptionBudget):
yaml apiVersion: policy/v1 kind: PodDisruptionBudget metadata: { name: api-pdb }
spec:
minAvailable: 2 selector: { matchLabels: { app: api } }
Ingress (Nginx, հակիրճ)
yaml apiVersion: networking. k8s. io/v1 kind: Ingress metadata:
name: api annotations:
nginx. ingress. kubernetes. io/proxy-read-timeout: "30"
spec:
tls: [{ hosts: ["api. example. com"], secretName: api-tls }]
rules:
- host: api. example. com http:
paths:
- path: /
pathType: Prefix backend: { service: { name: api, port: { number: 80 } } }
8) Helm v3 - հիմքեր և կառուցվածք։
Chart = + արժեքներ + մետատվյալներ։
mychart/
Chart. yaml # name, version (semver), type (application/library), dependencies values. yaml # default values. schema. json # (recommended) validation values templates/# .yaml. gotmpl (Deployment, Service, Ingress, …)
templates/tests/ # helm tests (smoke)
charts/# local dependencies (or OCI dependencies)
Chart. yaml (օրինակ)
yaml apiVersion: v2 name: api description: API service type: application version: 1. 4. 0 # chart version (semver)
appVersion: "1. 2. 3" # dependencies application version:
- name: redis version: 17. x.x repository: "oci://registry. example. com/charts"
9) Helm ձևանմուշները 'պրակտիկա
Օգտագործեք helpers '_ helpers։ tpl 'անունների/պիտակների/ծանոթությունների համար։
Ամենուր նշեք «resources», «Windows Express», «readiness/liveness»։
Արտադրեք labels համաձայն ստանդարտացված սխեմայի ("app. kubernetes. io/`).
Դարձրեք ֆիչին «values» (ingress/hpa/pdb/servicemonitor)։
Միացրեք 'values։ schema. json '- սխալ եզրերից հոտ։
Զգայուն տվյալների համար Secrets-ը արտաքին օպերատորներից (External Secrets, SOPS), ոչ թե values-ում։
Օրինակ '_ helpers։ tpl '(հատված)։
gotmpl
{{- define "api. fullname" -}}
{{- printf "%s-%s".Chart. Name. Release. Name trunc 63 trimSuffix "-" -}}
{{- end -}}
Deployment. tpl (հատված)
gotmpl apiVersion: apps/v1 kind: Deployment metadata:
name: {{ include "api. fullname". }}
labels: {{- include "api. labels". nindent 4 }}
spec:
replicas: {{.Values. replicaCount }}
strategy:
rollingUpdate:
maxSurge: 1 maxUnavailable: 0 selector:
matchLabels: {{- include "api. selectorLabels". nindent 6 }}
template:
metadata:
labels: {{- include "api. selectorLabels". nindent 8 }}
spec:
serviceAccountName: {{ include "api. serviceAccountName". }}
securityContext: {{- toYaml. Values. podSecurityContext nindent 8 }}
containers:
- name: {{.Chart. Name }}
image: "{{.Values. image. repository }}:{{.Values. image. tag }}"
imagePullPolicy: IfNotPresent ports: [{ containerPort: {{.Values. service. port }} }]
resources: {{- toYaml. Values. resources nindent 10 }}
envFrom:
- secretRef: { name: {{.Values. secretsRef }} }
10) Կախվածություն, չափումներ և OCI
Helm v3 աջակցում է OCI-գրանցումները ՝ «oci : //registry/org/charts»։
Փայլեք կախվածության տարբերակները ("^ 1։ 2. 0`, `~1. 2 ') և թողեք' helm dependency build '։
Ստորագրեք աղյուսակը (prov), պահեք արտեֆակտները CI արտեֆակտում։
Library charts: Ընդհանուր օրինակները (ingress/servicemonitor) վերարտադրման համար։
11) Hooks, CRD և վիրահատությունների կարգը
Hooks: `pre-install`, `post-install`, `pre-upgrade`, `post-upgrade`, `test`. Ավելացրեք policies («before-hook-creation», «hook-succeeeded»)։
CRD 'դրեք "crds/' (տեղադրվում են մինչև մթնշաղ), խուսափեք CRD դեղատներից" ամռան վրա ", արեք առանձին։
NoBD/նախաձեռնումը job-hook-ն է idempotency-ով և թայմաուտներով։
12) Չարտի և CI փորձարկումը
«helm lint» + սխեմայի վալիդացիա։
Helm unittest (unit), chart-testing (ct) - հավաքումը/տեղադրումը kind/minikube-ում CI-ում։
Diapshot թեստերը («helm template») համեմատել ստանդարտի հետ։
Smoke-թեստերը 'helm test "(բարձրացնում են" Pod "ստուգումներով)։
13) GitOps (Argo CD/Flux)
Ճշմարտության աղբյուրը ռեպոզորիա է։ Չարթը պահպանվում է որպես HelmRele.ru/HelmChart (Flux) կամ Apport (Argo)։
Սինկայի քաղաքական գործիչները ՝ 108-108 nc prune/www.f-heal, կարգավիճակներ և health-winks։
Պրոմոուշեն տարբերակներ ՝ 108-բոտներ/semver-range, PR-ֆլոու։
Բաժանեք repo (charts) և env (overrides/values)։
Secret-ղեկավարությունը 'SOPS (age/KEA), External Secrets-ը։
14) Անվտանգություն ՝ առնվազն անհրաժեշտ
PMS restricted: առանց արտոնությունների, առանց hostPath, սահմանափակ capabilities, read-only rootics։
Imault Policy: միայն ստորագրված/վստահելի պատկերներ։
NetworkPolicy: «Լռելյայն փակված»։
RBAC 'per-app ծառայություն, «Role »/« RoleBinding» namespace-ում։
Admission-վերահսկումը 'Gatekeeper/Kyverno կանոնները (resources/limits, labels, www.latest)։
Գաղտնիքները ՝ SOPS/External Secrets; գաղտնիքները չփակցնել values/plain Git-ում։
15) Anti-patterna
Մեկ հսկայական աղյուսակ «ամեն ինչի» փոխարեն մոդուլային։
CRD-ն նորարարվում է «templates/» wwww.haos apgraides-ում։
Կոշտ թաղված անուններ/պորտ/namespace ձևանմուշներով։
Ռեսուրսների/լիմիթների և փորձարկումների բացակայությունը բացատրվում է լատենտության և անկայունության միջոցով։
Ոչ PDB-ը զրոյական dauntaim-ը անհնար է antain/apgraid-ով։
Գաղտնիքները Git-ում առանց մրցույթի; մանիֆեստներ առանց քաղաքական քաղաքականության։
16) Chek-Show-( 0-45 օր)
0-10 օր
Կառուցել հիմնական գծապատկերային կմախքը '_ helpers-ի հետ։ tpl ', labels, probes, resources, PDB/Ingress օբյեկտիվ։
Включить PSA restricted, NetworkPolicy deny-all, ResourceQuota/LimitRange.
Տեղադրեք GitOps (Argo/Flux), մասնավոր գրանցում, պատկերների/գծերի ստորագրություն։
11-25 օր
Կիսել աղյուսակը մոդուլների/կախվածության վրա, ավելացնել 'values։ schema. json ', թեստեր («helm lint», unit, ct)։
Միացրեք observability (WindoMonitor/PodMonitor), log-2019, OTel։
Ներմուծել apgrads գործընթացը 'staging www.canary, hook-2019 rollback-ից։
26-45 օր
Ավտոմատիզացնել կախվածության նորարարությունները (բոտեր/semver-ranges + PR)։
Ավելացնել Gatekeeper/Kyverno քաղաքականությունը և policy հաղորդագրությունները CI-ում։
Փաստաթղթավորել runbook apgraid 2019, DR ընթացակարգերը (Velero/etcd depshot)։
17) Հասունության մետրերը
Դիմումների 100 տոկոսը հավաքվում են Helm/GitOps-ի միջոցով, առանց «kubectl apply» ձեռքով։
Բոլոր գծապատկերները ունեն «values»։ schema. json ', թեստեր, ստորագրություններ և կախվածության արձանագրված տարբերակներ։
PMS resricted/NetworkPolicy-ը ներառված է բոլոր namespace-ում։
PDB և HPA-ն ներկա են բոլոր քննադատական ծառայություններում։
Անվտանգ գաղտնիքները (SOPS/External Secrets), «www.latest» քաղաքականությունը, պատկերների ստորագրությունը։
Մրցույթի և աղյուսակի ապգրադները անցնում են առանց duntima (canary/blue-green), restore թեստերը։
18) Եզրակացություն
Ուժեղ Kubernetes-հիմքը = հուսալի ճարտարապետությունը + խիստ քաղաքականությունը + Helm-charts արդյունաբերական որակի տակ GitOps-ի ղեկավարությամբ։ Ստանդարտացրեք ձևանմուշները, պաշտպանեք PFC/NetworkPolicy/RBAC-ի շրջապատը, վալիդիրուսացրեք և ավտոմատիզացրեք թեստերը, ստորագրությունները և բացթողումները։ Այդ ժամանակ apgraids և ալգորիթմները կդառնան կանխատեսելի, իսկ պլատֆորմը կայուն և հարմար է սննդի թիմերի համար։