Kubernetes: მტევანი და Helm ქარტიები
Kubernetes: მტევანი და Helm ქარტიები
1) კლასტერის არქიტექტურა - ზემოდან ხედი
Control Plane: 'kube-apiserver', 'etcd', 'kube-scheduler', 'kube-Controller მენეჯერი', (კონტროლირებად ღრუბლებში, ნაწილი იმალება).
Worker: 'kubelet', CRI rantime (Containerd/CRI-O), CNI მოდულის, kube-proxy/ebpf-proxy.
Interclaster ქსელი: Pod-to-Pod, Service-VIP/ClusterIP, DNS CORDNS.
საცავი: CSI დრაივერები, დინამიური PVC-PV დრაივერი (StorageClass).
უარის თქმის საზღვრები: კვანძი/AZ/რეგიონი. განათავსეთ შენიშვნები ზონების მიხედვით (TopologySpreadConstraints/anti affinity).
ტიპიური როლები
პლატფორმის გუნდი: მტევანი, CNI/CSI/Ingress, პოლიტიკა და GitOps ქმნის/გაგრილდება.
სასურსათო გუნდები: ჩარტები/გამოშვებები, მიჰყვება უსაფრთხოების და რესურსების პოლიტიკოსებს.
2) ცხოვრების კლასტერის ციკლი
შექმნა: kOps, kubeadm, Rancher, EKS/AKS/GKE. დაუყოვნებლივ ჩართეთ OIDC ავთენტიფიკაცია და აუდიტი.
Apgrades: minor ვერსიები თავის მხრივ (control plane - კვანძები), რომელსაც აკონტროლებენ maxUnavailable, ტესტები staging.
Add-ons (ყველაფერი Helm/GitOps- ის საშუალებით): CNI (Calico/Cilium), CSI მძღოლი, Ingress კონტროლერი (NGINX/Gateway API/Contour/TraeFourour), MaNaTaNane, me, me, Med-st-Sed-Sed-Sed-SaSed, CaTiGiGiGiGiGanAutoscaler, Node-Local DNS, ლოგიკა/მეტრიკა/ტრეისი.
Bacaps: etcd snapshot (თუ self მენეჯმენტი), Velero for namespace/PVC.
3) ქსელები, მომსახურება და ინგრედიენტები
CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).
სერვისი: 'ClusterIP', 'NodePort', 'LoadBalancer' (L4 ღრუბლის დაბალანსება), 'ExternalName'.
Ingress/Gateway API: L7 მარშრუტი, TLS, ანამნეზი საბინაო-ლიმიტი/WAF პერიმეტრზე.
ქსელის პოლიტიკა: სტანდარტულად, deny-all + აშკარა ალოუ namespace/label.
Headless Service ('clusterIP: None') for StatefulSet და discovery.
4) შენახვა (CSI) და მდგომარეობა
StorageClass: 'reclaimPolicy', 'volumeBindingMode' ('WaitForFirStSumer' უკეთესი განთავსებისთვის).
StatefulSet: სტაბილური სახელები/ტომი ('volumeClaimTemplates'), 'podSolicy Policy: Parallel' სწრაფი განლაგებისთვის.
ReadWriteMany: გამოიყენეთ განაწილებული ფაილები (EFS/Filestore) ფრთხილად - შეაფასეთ ლატენტობა.
სურათები: 'VolumeSnapshotClass' + cron-bacaps.
5) მრავალფეროვნება და პოლიტიკა
Namespaces საკვები/ოთხშაბათს.
RBAC: მინიმალური როლები, ინდივიდუალური სერვისული ანგარიშები, 'Role '/' RoleBinding' ნაცვლად 'ClusterRole ", სადაც შესაძლებელია.
PSA (Pod Security Admission): 'baseline '/' restricted' რეჟიმები (ჩანაცვლება PSP).
ResourceQuota / LimitRange: потолки CPU/Memory/PVC/LoadBalancer.
OPA Gatekeeper/Kyverno: დაშვების პოლიტიკა (მაგალითად, აკრძალვა ': latest', მოთხოვნა 'resources', 'readOnlyRootFilesystem').
ImagePolicy/webhuks: სურათების ხელმოწერის შემოწმება (cosign/პოლიტიკის კონტროლი).
6) დაკვირვება და ექსპლუატაცია
მეტრიკი: Prometheus-steck, kube-state-metrics, node-ექსპორტიორი.
Logs: Fluent Bit/Vector - ობიექტის/ES/OpenSearch, როტაცია კვანძებში.
ტრეისი: OpenTelemetry Collector.
SLO დაშბორდები: RED მოდელი ingress და საკვანძო სერვისებში.
Autoskale: HPA (პროგრამის მეტრიკის მიხედვით), VPA ფონი, Cluster-Autoscaler კვანძებისთვის.
7) მანიფესტების ნიმუშები (ყალბი ფურცელი)
გამოქვეყნება (ჩამკეტი):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 }
StatefulSet (ფრაგმენტი):
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 - საფუძვლები და სტრუქტურა
სქემა = შაბლონები + მნიშვნელობები + მეტამონაცემები.
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 in '_ helpers. tpl 'სახელების/ეტიკეტების/ვიდეოებისთვის.
ყველგან მიუთითეთ 'resources', 'Kontext', 'readiness/liveness'.
ჩამოაყალიბეთ labels სტანდარტიზებული სქემის მიხედვით ('app. kubernetes. io/`).
გააკეთეთ ჩიპები სურვილისამებრ 'values' (ingress/hpa/pdb/servicemonitor).
ჩართეთ 'values. schema. json '- არასწორი ჩამორთმევის გაჩერება.
მგრძნობიარე მონაცემებისთვის - საიდუმლოებები გარე ოპერატორებისგან (External Secrets, SOPS), და არა შენახვა ვალებში.
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 dependence build '.
ხელი მოაწერეთ ჩარტს (prov), შეინახეთ ნივთები CI არტეფაქტურ საცავებში.
ბიბლიოთეკის ქარტიები: ზოგადი შაბლონები (ingress/servicemonitor) ხელახალი გამოყენებისთვის.
11) Hooks, CRD და ოპერაციების რიგი
Hooks: `pre-install`, `post-install`, `pre-upgrade`, `post-upgrade`, `test`. დაამატეთ პოლიტიკა ('before-hook-creation', 'hook-succeeded').
CRD: ჩადეთ 'crds/' - ში (დამონტაჟდება Templates- ზე), თავიდან აიცილეთ CRD apdates „ფრენაზე“ - გააკეთეთ ცალკე მიგრაცია.
BD მიგრაცია/ინიციალიზაცია - job-hook idempotence და Timauts.
12) სქემის და CI ტესტირება
'helm lint' + მიკროსქემის შესაბამისობა.
Helm unittest (unit), chart-testing (ct) - შეკრება/ინსტალაცია kind/minikube- ში CI- ში.
შაბლონების Snapshot ტესტები ('helm template' სტანდარტთან შედარებით).
Smoke ტესტები 'helm test' (აღმართეთ 'Pod' ჩეკებით).
13) GitOps (Argo CD/Flux)
ჭეშმარიტების წყარო საცავებია. სქემა ინახება როგორც HelmRelease/HelmChart (Flux) ან Application (Argo).
ცისფერი პოლიტიკოსები: auto-sync ერთად prune/self-heal, სტატუსები და ჯანმრთელობის შემოწმებები.
ვერსიების პოპულარიზაცია: tag-bots/semver-range, PR flow.
გაყოფილი რეპო (ჩარტები) და env (overrides/values).
საიდუმლო მენეჯმენტი: SOPS (age/KMS), ექსტრემალური საიდუმლოებები.
14) უსაფრთხოება: მინიმალური
PSA restricted: პრივილეგიების გარეშე, hostPath- ის გარეშე, შეზღუდული capabilities, read-only rootfs.
ImagePolicy: მხოლოდ ხელმოწერილი/სანდო სურათები.
ქსელის პოლიტიკა: „სტანდარტულად ჩაკეტილია“.
RBAC: სერვისული ანგარიში per-app, 'Role '/' RoleBinding' namespace- ში.
ადმისიის კონტროლი: Gatekeeper/Kyverno წესები (resources/limits, labels, no latest).
საიდუმლოებები: SOPS/External Secrets; არ დააყენოთ საიდუმლოებები values/plain Git.
15) ანტი შაბლონები
': latest' ჩარტებში და სურათებში; 'values- ის არარსებობა. schema. json`.
მოდულური ნაცვლად ერთი უზარმაზარი გრაფიკი „ყველაფრისთვის“.
CRD განახლებულია შაბლონებით 'templates/' - ზე.
მკაცრად დაცული სახელები/პორტი/namespace შაბლონებში.
რესურსების/ლიმიტების და ნიმუშების არარსებობა არის ლატენტობის დრიფტი და არასტაბილურობა.
არ არსებობს PDB - ნულოვანი დაშლა შეუძლებელია დალაგების/განახლებისთვის.
საიდუმლოებები Git- ში დაშიფვრის გარეშე; მანიფესტები პოლიტიკის შემოწმების გარეშე.
16) განხორციელების სიის სია (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).
დაუკავშირდით ობსერვატორიას (დარეკეთ Monitor/PodMonitor), ლოგოს აგენტებს, OTel.
შემოიღეთ გაფართოების პროცესი: staging - canary, hook მიგრაცია rollback- დან.
26-45 დღე
დამოკიდებულების განახლებების ავტომატიზაცია (ბოტები/სემვერ-რანგები + PR).
დაამატეთ Gatekeeper/Kyverno პოლიტიკოსები და პოლიტიკური რეპორტები CI- ში.
კლასტერის runbook განახლება, DR პროცედურები (Velero/etcd snapshot).
17) სიმწიფის მეტრიკა
აპლიკაციების 100% გამოიყენება Helm/GitOps- ის საშუალებით, 'kubectl appy' ხელით.
ყველა გრაფიკს აქვს 'values. schema. json ', ტესტები, ხელმოწერა და დამოკიდებულების ჩაწერილი ვერსიები.
PSA restricted/NetworkPolicy შედის ყველა namespace- ში.
PDB და HPA წარმოდგენილია ყველა კრიტიკულ მომსახურებაში.
უსაფრთხო საიდუმლოებები (SOPS/External Secrets), პოლიტიკა „no latest“, სურათების ხელმოწერა.
კლასტერისა და გრაფიკის განახლება ხდება დაუცველობის გარეშე (კანარი/ცისფერი-მწვანე), რეგულარული ტესტები რეგულარულია.
18) დასკვნა
ძლიერი Kubernetes საძირკველი = საიმედო კლასტერის არქიტექტურა + მკაცრი პოლიტიკა + სამრეწველო ხარისხის Helm სქემები GitOps- ის კონტროლის ქვეშ. სტანდარტიზებული შაბლონები, დაიცავით გარემო PSA/NetworkPolicy/RBAC, დალაგება values და ავტომატიზირებული ტესტები, ხელმოწერა და პოპულარიზაცია. შემდეგ განახლება და გამოშვებები გახდება პროგნოზირებული, ხოლო პლატფორმა სტაბილური და მოსახერხებელია სასურსათო გუნდებისთვის.