Kubernetes: Cluster und Helm-Charts
Kubernetes: Cluster und Helm-Charts
1) Clusterarchitektur - ein Blick von oben
Steuerebene: 'kube-apiserver', 'etcd', 'kube-scheduler', 'kube-controller-manager', (in verwalteten Wolken ist ein Teil versteckt).
Arbeiter: 'kubelet', CRI-rentime (containerd/CRI-O), CNI-Plugin, kube-proxy/ebpf-proxy.
Intra-Cluster-Netzwerk: Pod-to-Pod, Service-VIP/ClusterIP, DNS CoreDNS.
Speicher: CSI-Treiber, dynamisches PVC → PV (StorageClass).
Fehlergrenzen: Knoten/AZ/Region. Platzieren Sie Replikate in Zonen (TopologySpreadConstraints/anti-affinity).
Standardrollen
Plattformteam: Erstellt/aktualisiert Cluster, CNI/CSI/Ingress, Richtlinien und GitOps.
Produktteams: Deployment Charts/Releases, folgen Sicherheitsrichtlinien und Ressourcen.
2) Cluster-Lebenszyklus
Erstellung: kOps, kubeadm, Rancher, EKS/AKS/GKE. Aktivieren Sie OIDC-Authentifizierung und -Audit sofort.
Upgrades: Minor-Versionen der Reihe nach (Control Plane → Nodes), gesteuert von maxUnavailable, Stage-Tests.
Add-ons (alle über Helm/GitOps): CNI (Calico/Cilium), CSI-Treiber, Ingress-Controller (NGINX/Gateway API/Contour/Traefik), Metrics-Server, Cluster-Autoscaler, Node-Local DNS, logging/metrics/trace.
Backups: etcd snapshot (falls selbst verwaltet), Velero für namespace/PVC.
3) Netzwerke, Dienste und ingress
CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).
Service: 'ClusterIP', 'NodePort', 'LoadBalancer' (L4 Cloud Balancing), 'ExternalName'.
Ingress/Gateway API: L7-Routing, TLS, Anamnese Rate-Limit/WAF am Perimeter.
NetworkPolicy: Standardmäßig deny-all + explizite allow durch namespace/label.
Headless-Service ('clusterIP: None') für StatefulSet und Service Discovery.
4) Speicher (CSI) und Zustände
StorageClass: 'reclaimPolicy', 'volumeBindingMode' ('WaitForFirstConsumer' zur besseren Platzierung).
StatefulSet: stabile Namen/Volumes ('volumeClaimTemplates'), 'podManagementPolicy: Parallel' für schnelle Rollouts.
ReadWriteMany: Verwenden Sie verteilte Dateien (EFS/Filestore) vorsichtig - bewerten Sie die Latenz.
Snapshots: 'VolumeSnapshotClass' + cron-Backups.
5) Multi-Leasing und Politik
Namespaces nach Produkt/Medium.
RBAC: Mindestrollen, einzelne Service-Accounts, 'Role '/' RoleBinding' statt 'ClusterRole', wo möglich.
PSA (Pod Security Admission): Modi 'baseline '/' restricted' (Ersatz für PSP).
ResourceQuota / LimitRange: потолки CPU/Memory/PVC/LoadBalancer.
OPA Gatekeeper/Kyverno: Zulassungspolitik (z.B. Verbot': neueste', Anforderung 'Ressourcen', 'readOnlyRootFilesystem').
ImagePolicy/Webhooks: Überprüfung der Bildsignatur (cosign/policy-controller).
6) Beobachtbarkeit und Betrieb
Metriken: Prometheus-Stack, Kube-State-Metriken, Node-Exporteure.
Protokolle: Fluent Bit/Vector → Objekt/ES/OpenSearch, Rotation auf Knoten.
Traces: OpenTelemetry Collector.
SLO-Dashboards: Das RED-Modell auf ingress und Key Services.
Autoscale: HPA (nach Anwendungsmetriken), VPA für Hintergrund, Cluster-Autoscaler für Knoten.
7) Manifestmuster (Spickzettel)
Deployment (Auszug):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 (Fragment):
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, kurz):
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 - Grundlagen und Struktur
Chart = Muster + Werte + Metadaten.
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 (Beispiel):
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 Vorlagen - Praktiken
Verwenden Sie helpers in'_ helpers. tpl 'für Namen/Beschriftungen/Anmerkungen.
Geben Sie überall 'resources', 'securityContext', 'readiness/liveness' an.
Generieren Sie Labels nach einem standardisierten Schema ('app. kubernetes. io/`).
Machen Sie die Fichi optional über 'Werte' (ingress/hpa/pdb/servicemonitor).
Aktivieren Sie' Werte. schema. json'- Schluss mit untreuen Configs.
Für sensible Daten - Secrets von externen Betreibern (External Secrets, SOPS), nicht in Werten gespeichert.
gotmpl
{{- define "api. fullname" -}}
{{- printf "%s-%s".Chart. Name. Release. Name trunc 63 trimSuffix "-" -}}
{{- end -}}
Deployment. tpl (Fragment):
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) Abhängigkeiten, Repositories und OCI
Helm v3 unterstützt OCI-Register: 'oci ://registry/org/charts'.
Die Abhängigkeitsversionen ('^ 1. 2. 0`, `~1. 2') und den „Helm dependency build“ vertreiben.
Unterschreiben Sie die Karte (prov), speichern Sie die Artefakte im CI-Artefakt-Repository.
Bibliothekscharts: Allgemeine Vorlagen (ingress/servicemonitor) zur erneuten Verwendung.
11) Hooks, CRD und die Reihenfolge der Operationen
Hooks: `pre-install`, `post-install`, `pre-upgrade`, `post-upgrade`, `test`. Fügen Sie Richtlinien hinzu ('before-hook-creation', 'hook-succeeded').
CRD: Setzen Sie in 'crds/' (setzen Sie auf die Templates), vermeiden Sie CRD-Updates „on the fly“ - machen Sie Migrationen separat.
DB Migrationen/Initialisierung - Job-Hook mit Idempotency und Timeouts.
12) Chart- und CI-Tests
'helm lint' + Validierung des Schemas.
Helm unittest (Einheit), chart-testing (ct) - Montage/Installation in kind/minikube am CI.
Snapshot-Tests von Vorlagen („Helm-Vorlage“ → mit einer Referenz verglichen werden).
Smoke-Tests' Helm Test'(heben 'Pod' mit Kontrollen).
13) GitOps (Argo CD/Flux)
Die Quelle der Wahrheit ist das Repository. Die Karte wird als HelmRelease/HelmChart (Flux) oder Application (Argo) gespeichert.
Synk-Richtlinien: Auto-Sync mit Prune/Selbstheilung, Status und Gesundheitschecks.
Promotion-Versionen: Tag-Bots/Semver-Bereich, PR-Flow.
Teilen Sie Repo in Apps (Charts) und Env (Overrides/Werte).
Secret Management: SOPS (Alter/KMS), Externe Geheimnisse.
14) Sicherheit: das erforderliche Minimum
PSA restricted: keine Privilegien, kein hostPath, mit eingeschränkten Kapazitäten, read-only rootfs.
ImagePolicy: Nur signierte/vertrauenswürdige Images.
NetworkPolicy: „standardmäßig gesperrt“.
RBAC: Service-Account per-app, 'Role '/' RoleBinding' im Namespace.
Admission-Kontrolle: Gatekeeper/Kyverno Regeln (Ressourcen/Grenzen, Etiketten, keine neuesten).
Geheimnisse: SOPS/Externe Geheimnisse; keine Geheimnisse in Werte/plain Git.
15) Anti-Muster
': neueste' in Charts und Bildern; fehlende' Werte. schema. json`.
Eine riesige Karte „für alles“ statt modular.
CRDs werden mit Vorlagen in 'templates/' aktualisiert → Chaos bei Upgrades.
Hartgesottene Namen/Port/Namespace in Vorlagen.
Mangel an Ressourcen/Grenzen und Proben → Latenzdrift und Instabilität.
Keine PDB → Zero Downtime ist bei Drain/Upgrades nicht möglich.
Geheimnisse in Git ohne Verschlüsselung; Manifeste ohne Policy-Checks.
16) Implementierung Checkliste (0-45 Tage)
0-10 Tage
Starte das Basis-Chart-Skelett mit'_ helpers. tpl', Etiketten, Proben, Ressourcen, PDB/Ingress optional.
Включить PSA restricted, NetworkPolicy deny-all, ResourceQuota/LimitRange.
Konfigurieren Sie GitOps (Argo/Flux), privates Register, Signieren von Bildern/Charts.
11-25 Tage
Teilen Sie die Karte in Module/Abhängigkeiten, fügen Sie' Werte. schema. json', Tests ('helm lint', unit, ct).
Verbinden Sie observability (ServiceMonitor/PodMonitor), log agents, OTel.
Geben Sie den Prozess der Upgrades: staging → canary → prod, hook-Migration mit rollback.
26-45 Tage
Automatisieren Sie Abhängigkeitsupdates (Bots/semver-ranges + PR).
Hinzufügen Gatekeeper/Kyverno Politik und Politik-Berichte zu CI.
Dokumentieren Sie das Runbook des Cluster-Upgrades, DR-Prozeduren (Velero/etcd snapshot).
17) Reifegradkennzahlen
100% der Apps werden über Helm/GitOps deployed, ohne' kubectl apply 'manuell.
Alle Charts haben 'Werte. schema. json', Tests, Signaturen und festgeschriebene Versionen von Abhängigkeiten.
PSA restricted/NetworkPolicy ist in allen namespace enthalten.
PDB und HPA sind bei allen kritischen Diensten vorhanden.
Sichere Geheimnisse (SOPS/External Secrets), „no latest“ -Politik, Bildunterschrift.
Cluster und Chart-Upgrades finden ohne Downtime (Canary/Blue-Green) statt, Restore-Tests sind regelmäßig.
18) Schlussfolgerung
Starke Kubernetes-Stiftung = robuste Clusterarchitektur + strikte Richtlinien + von GitOps verwaltete Helm-Charts in Industriequalität. Standardisieren Sie Vorlagen, schützen Sie die PSA/NetworkPolicy/RBAC-Umgebung, validieren Sie Werte und automatisieren Sie Tests, Signaturen und Werbeaktionen. Dann werden Upgrades und Releases vorhersehbar und die Plattform ist nachhaltig und benutzerfreundlich für Produktteams.