Kubernetes: кластери та Helm charts
Kubernetes: кластери та Helm charts
1) Архітектура кластера - погляд зверху
Control Plane: 'kube-apiserver','etcd','kube-scheduler','kube-controller-manager', (в керованих хмарах частина захована).
Worker: 'kubelet', CRI-рантайм (containerd/CRI-O), CNI-плагін, kube-proxy/ebpf-proxy.
Внутрішньокластерна мережа: Pod-to-Pod, Service-VIP/ClusterIP, DNS CoreDNS.
Сховища: CSI-драйвери, динамічне провіжінінг PVC → PV (StorageClass).
Межі відмови: вузол/AZ/регіон. Розміщуйте репліки по зонах (TopologySpreadConstraints/anti-affinity).
Типові ролі
Платформна команда: створює/апгрейдит кластери, CNI/CSI/Ingress, політику і GitOps.
Продуктові команди: деплоят чарти/релізи, слідують політикам безпеки і ресурсів.
2) Життєвий цикл кластера
Створення: kOps, kubeadm, Rancher, EKS/AKS/GKE. Відразу включайте OIDC-аутентифікацію і аудит.
Апгрейди: minor-версії по черзі (control plane → вузли), контрольований maxUnavailable, тести на стейджингу.
Add-ons (всі - через Helm/GitOps): CNI (Calico/Cilium), CSI драйвер, Ingress-контролер (NGINX/Gateway API/Contour/Traefik), Metrics-Server, Cluster-Autoscaler, Node-Local DNS, логування/метрики/трейс.
Бекапи: etcd snapshot (если self-managed), Velero для namespace/PVC.
3) Мережі, сервіси та ingress
CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).
Service: 'ClusterIP','NodePort','LoadBalancer'( L4 балансування хмари),'ExternalName'.
Ingress / Gateway API: L7-маршрутизація, TLS, анамнез rate-limit/WAF на периметрі.
NetworkPolicy: за замовчуванням deny-all + явні allow за namespace/label.
Headless-service (`clusterIP: None') для StatefulSet і сервіс-дискавері.
4) Сховища (CSI) і стану
StorageClass: 'reclaimPolicy','volumeBindingMode'('WaitForFirstConsumer'для кращого розміщення).
StatefulSet: стабільні імена/томи ('volumeClaimTemplates'),'podManagementPolicy: Parallel'для швидких розгорток.
ReadWriteMany: використовуйте розподілені файлові (EFS/Filestore) обережно - оцінюйте латентність.
Знімки: 'VolumeSnapshotClass'+ cron-бекапи.
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/вебхуки: перевірка підпису образів (cosign/policy-controller).
6) Спостережуваність і експлуатація
Метрики: Prometheus-стек, kube-state-metrics, node-експортери.
Логи: Fluent Bit/Vector → об'єктне/ES/OpenSearch, ротація на вузлах.
Трейси: OpenTelemetry Collector.
SLO-дашборди: RED-модель на ingress і ключових сервісах.
Автоскейл: HPA (за метриками програми), VPA для бекграунду, Cluster-Autoscaler для вузлів.
7) Патерни маніфестів (шпаргалка)
Deployment (витримка):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 в'_ helpers. tpl'для імен/міток/анотацій.
Скрізь вказуйте'resources','securityContext','readiness/liveness'.
Генеруйте labels за стандартизованою схемою ('app. kubernetes. io/`).
Робіть фічі опціональними через'values'( ingress/hpa/pdb/servicemonitor).
Вмикайте'values. schema. json'- стоп від невірних конфігів.
Для чутливих даних - Secrets від зовнішніх операторів (External Secrets, SOPS), а не зберігати в values.
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-succeeded»).
CRD: кладіть в'crds/' (встановляться до темплейтів), уникайте апдейтів CRD «на льоту» - робіть міграції окремо.
Міграції БД/ініціалізація - job-hook з idempotency і таймаутами.
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, статуси і health-checks.
Промоушен версій: tag-боти/semver-range, PR-флоу.
Поділяйте repo на apps (чарти) і env (overrides/values).
Secret-менеджмент: SOPS (age/KMS), External Secrets.
14) Безпека: мінімум необхідного
PSA restricted: без привілеїв, без hostPath, з обмеженими capabilities, read-only rootfs.
ImagePolicy: тільки підписані/довірені образи.
NetworkPolicy: «за замовчуванням замкнено».
RBAC: сервіс-аккаунт per-app,'Role '/' RoleBinding'в namespace.
Admission-контроль: Gatekeeper/Kyverno правила (resources/limits, labels, no latest).
Секрети: SOPS/External Secrets; не класти секрети в values/plain Git.
15) Анти-патерни
`:latest'в чартах і образах; відсутність'values. schema. json`.
Один величезний чарт «на все» замість модульних.
CRD оновлюються шаблонами в'templates/' → хаос на апгрейдах.
Жорстко захардкожені імена/порт/namespace в шаблонах.
Відсутність ресурсів/лімітів і проб → дрейф латентності і нестабільність.
Немає PDB → нульовий даунтайм неможливий при drain/апгрейдах.
Секрети в Git без шифрування; маніфести без політика-checks.
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).
Підключити observability (ServiceMonitor/PodMonitor), лог-агенти, OTel.
Ввести процес апгрейдів: staging → canary → prod, hook-міграції з rollback.
26-45 днів
Автоматизувати оновлення залежностей (боти/semver-ranges + PR).
Додати Gatekeeper/Kyverno політики і policy-репорти в CI.
Документувати runbook апгрейда кластера, DR-процедури (Velero/etcd snapshot).
17) Метрики зрілості
100% додатків деплояться через Helm/GitOps, без'kubectl apply'вручну.
Всі чарти мають'values. schema. json', тести, підпис і зафіксовані версії залежностей.
PSA restricted/NetworkPolicy включені у всіх namespace.
PDB і HPA присутні у всіх критичних сервісів.
Безпечні секрети (SOPS/External Secrets), політика «no latest», підпис образів.
Апгрейди кластера і чарту проходять без даунтайму (canary/blue-green), restore-тести регулярні.
18) Висновок
Сильний Kubernetes-фундамент = надійна архітектура кластера + сувора політика + Helm-чарти промислової якості під управлінням GitOps. Стандартизуйте шаблони, захистіть оточення PSA/NetworkPolicy/RBAC, валідуйте values і автоматизуйте тести, підпис і промоушен. Тоді апгрейди і релізи стануть передбачуваними, а платформа - стійкою і зручною для продуктових команд.