Kubernetes: klasterlər və Helm charts
Kubernetes: klasterlər və Helm charts
1) Klasterin arxitekturası - yuxarıdan baxış
Control Plane: 'kube-apiserver', 'etcd', 'kube-scheduler', 'kube-controller-manager', (idarə olunan buludların bir hissəsi gizlədilir).
Worker: 'kubelet', CRI-rantaym (containerd/CRI-O), CNI-plugin, kube-proxy/ebpf-proxy.
Daxili şəbəkə: Pod-to-Pod, Service-VIP/ClusterIP, DNS CoreDNS.
Saxlama: CSI sürücüləri, dinamik PVC → PV (StorageClass) provizinq.
Imtina sərhədləri: qovşaq/AZ/region. Replikaları zonalara yerləşdirin (TopologySpreadConstraints/anti-affinity).
Tipik rollar
Platforma komandası: CNI/CSI/Ingress, siyasət və GitOps.
Məhsul komandaları: siyahıları/buraxılışları deployur, təhlükəsizlik siyasətlərini və resurslarını izləyir.
2) Klaster həyat dövrü
Yaradılması: kOps, kubeadm, Rancher, EKS/AKS/GKE. Dərhal OIDC autentifikasiyası və auditini açın.
Yeniləmələr: növbə ilə minor versiyaları (control plane → düyünlər), maxUnavailable tərəfindən idarə olunan, steycinq testləri.
Add-ons (hamısı - Helm/GitOps vasitəsilə): CNI (Calico/Cilium), CSI sürücüsü, Ingress-controller (NGINX/Gateway API/Contour/Traefik), Metrics-Server, Cluster Autoscaler, Node-Local DNS, log/metrika/trace.
Backup: etcd snapshot (self-managed), namespace/PVC üçün Velero.
3) Şəbəkələr, xidmətlər və ingress
CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).
Service: 'ClusterIP', 'NodePort', 'LoadBalancer' (L4 bulud balansı), 'ExternalName'.
Ingress/Gateway API: L7-marşrutlaşdırma, TLS, perimetrdə rate-limit/WAF tarixi.
NetworkPolicy: default deny-all + namespace/label.
StatefulSet və Discovery Service üçün Headless-service ('clusterIP: None').
4) Anbarlar (CSI) və hallar
StorageClass: 'reclaimPolicy', 'volumeBindingMode' (daha yaxşı yerləşdirmə üçün 'WaitForFirstConsumer').
StatefulSet: sabit adlar/cildlər ('volumeClaimTemplates'), 'podManagementPolicy: Parallel'.
ReadWriteMany: paylanmış fayllardan (EFS/Filestore) diqqətlə istifadə edin - gizliliyi qiymətləndirin.
Şəkillər: 'VolumeSnapshotClass' + cron-backup.
5) Multi-icarə və siyasət
Məhsul/çərşənbə Namespaces.
RBAC: minimal rollar, fərdi xidmət hesabları, mümkün olan yerlərdə «ClusterRole» əvəzinə «Role »/« RoleBinding».
PSA (Pod Security Admission): 'baseline '/' restricted' (PSP əvəz) rejimləri.
ResourceQuota / LimitRange: потолки CPU/Memory/PVC/LoadBalancer.
OPA Gatekeeper/Kyverno: giriş siyasəti (məsələn, ': latest', 'resources', 'readOnlyRootFilesystem' tələbi).
ImagePolicy/Webhucks: Image imzasını yoxlamaq (cosign/policy-controller).
6) Müşahidə və istismar
Metriklər: Prometheus-yığını, kube-state-metrics, node-ixracatçıları.
Log: Fluent Bit/Vector → obyekt/ES/OpenSearch, düyünlərdə rotasiya.
Treys: OpenTelemetry Collector.
SLO-daşbordları: ingress və əsas xidmətlərdə RED-model.
Avtoskeyl: HPA (tətbiqin metriklərinə görə), arxa plan üçün VPA, qovşaqlar üçün Cluster-Autoscaler.
7) Manifestlərin nümunələri (şparqalka)
Deployment (çıxarış):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 (fraqment):
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, qısaca):
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 - əsasları və strukturu
Chart = şablonlar + dəyərlər + metadata.
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 (nümunə):
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 şablonları - təcrübələr
Helpers in '_ helpers. tpl 'adlar/etiketlər/izahatlar üçün.
Hər yerdə 'resources', 'securityContext', 'readiness/liveness'.
Standartlaşdırılmış sxem ('app. kubernetes. io/`).
'values' (ingress/hpa/pdb/servicemonitor) vasitəsilə xüsusiyyətləri seçin.
'values daxil edin. schema. json '- səhv konfiqurasiya dayandırın.
Həssas məlumatlar üçün - xarici operatorların Secrets (External Secrets, SOPS) və values saxlamaq deyil.
gotmpl
{{- define "api. fullname" -}}
{{- printf "%s-%s".Chart. Name. Release. Name trunc 63 trimSuffix "-" -}}
{{- end -}}
Deployment. tpl (fraqment):
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) Asılılıqlar, anbarlar və OCI
Helm v3 OCI registrlərini dəstəkləyir: 'oci ://registry/org/charts'.
Asılılıq versiyası ('^ 1. 2. 0`, `~1. 2 ') və' helm dependency build '.
Çartı imzalayın (prov), artefaktları CI artefakt-repozitorunda saxlayın.
Library charts: təkrar istifadə üçün ümumi şablonlar (ingress/servicemonitor).
11) Hooks, CRD və əməliyyat proseduru
Hooks: `pre-install`, `post-install`, `pre-upgrade`, `post-upgrade`, `test`. policies ('before-hook-creation', 'hook-succeeded') əlavə edin.
CRD: 'crds/' -ə qoyun (temperatur təyin olunana qədər), CRD yeniləmələrindən qaçın - ayrıca miqrasiya edin.
DB miqrasiyası/başlanğıc - idempotency və vaxt ilə job-hook.
12) Chart və CI test
'helm lint' + sxem validasiyası.
Helm unittest (unit), chart-testing (ct) - CI-də kind/minikube-də montaj/quraşdırma.
Snapshot şablon testləri ('helm template' → etalon ilə müqayisə).
Smoke testləri 'helm test' (yoxlamalarla 'Pod' qaldırın).
13) GitOps (Argo CD/Flux)
Həqiqətin mənbəyi anbardır. Chart HelmRelease/HelmChart (Flux) və ya Application (Argo) kimi saxlanılır.
Sink siyasətləri: prune/self-heal, status və health-checks ilə auto-sync.
Promosyon versiyası: tag-botlar/semver-range, PR-flow.
repo apps (hit) və env (overrides/values) bölünür.
Secret-menecment: SOPS (age/KMS), External Secrets.
14) Təhlükəsizlik: minimum zəruri
PSA restricted: heç bir imtiyaz, heç bir hostPath, məhdud capabilities, read-only rootfs.
ImagePolicy: Yalnız imzalanmış/etibarlı şəkillər.
NetworkPolicy: «Default kilidlidir».
RBAC: per-app xidmət hesabı, namespace-də 'Role '/' RoleBinding'.
Admission-Control: Gatekeeper/Kyverno qaydaları (resources/limits, labels, no latest).
Secrets: SOPS/External Secrets; values/plain Git sirləri qoymayın.
15) Anti-nümunələr
': latest' hit və şəkillərdə; yox 'values. schema. json`.
Modul əvəzinə bir nəhəng «hər şey» nizamnaməsi.
CRD 'templates/' → yenilənmiş xaos şablonları ilə yenilənir.
Şablonlarda sərt kodlanmış adlar/port/namespace.
Resursların/limitlərin və nümunələrin olmaması → gecikmə sürüklənməsi və qeyri-sabitlik.
No PDB → sıfır downtime drain/yeniləmə zamanı mümkün deyil.
şifrələmə olmadan Git sirləri; siyasət-checks olmadan manifestlər.
16) Giriş çek siyahısı (0-45 gün)
0-10 gün
c '_ helpers əsas çart-skelet başlayın. tpl ', labels, probes, resources, PDB/Ingress isteğe bağlıdır.
Включить PSA restricted, NetworkPolicy deny-all, ResourceQuota/LimitRange.
GitOps (Argo/Flux), şəxsi registrini, şəkillərin/siyahıların imzasını konfiqurasiya edin.
11-25 gün
Nizamnaməni modullara/asılılıqlara bölün, 'values əlavə edin. schema. json ', testlər (' helm lint ', unit, ct).
Observability (ServiceMonitor/PodMonitor), log agentləri, OTel.
Yeniləmə prosesini daxil edin: staging → canary → prod, rollback ilə hook-miqrasiya.
26-45 gün
Asılılıq yeniləmələrini avtomatlaşdırın (botlar/semver-ranges + PR).
CI Gatekeeper/Kyverno siyasət və siyasət Reports əlavə edin.
Klaster yeniləməsinin runbook sənədləşdirilməsi, DR prosedurları (Velero/etcd snapshot).
17) Yetkinlik metrikası
Tətbiqlərin 100% -i əl ilə «kubectl apply» olmadan Helm/GitOps vasitəsilə ödənilir.
Bütün hit-paradlarda 'values var. schema. json ', testlər, imza və sabit asılılıq versiyaları.
PSA restricted/NetworkPolicy bütün namespace daxildir.
PDB və HPA bütün kritik xidmətlərdə mövcuddur.
Secure Secrets (SOPS/External Secrets), no latest siyasəti, şəkillərin imzası.
Klaster və çartın yeniləmələri downtime (canary/blue-green) olmadan keçirilir, bərpa testləri müntəzəmdir.
18) Nəticə
Güclü Kubernetes-fundament = etibarlı klaster arxitekturası + ciddi siyasət + GitOps tərəfindən idarə olunan sənaye keyfiyyətli Helm charts. Şablonları standartlaşdırın, PSA/NetworkPolicy/RBAC mühitini qoruyun, values doğrulayın və testləri, imzaları və promosyonları avtomatlaşdırın. Sonra yeniləmələr və buraxılışlar proqnozlaşdırıla bilər, platforma isə davamlı və ərzaq komandaları üçün əlverişli olacaq.