GH GambleHub

Kubernetes:群集和Helm圖表

Kubernetes: 群集和Helm圖表

1)群集體系結構-從上方看

控制平面:「kube-apiserver」,「etcd」,「kube-scheduler」,「kube-controller-Manager」(隱藏在受控雲中)。
工作者:「kubelet」,CRI-rantime(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認證和審核。
升級:次要版本(控制平面→節點),由maxUnavailable控制,站立測試。
附加組件(均通過Helm/GitOps):CNI(Calico/Cilium),CSI驅動程序,Ingress控制器(NGINX/Gateway API/Contour/Traefik),Metrics-Server,Cluster-Auto oscaler,Node-Local DNS,生成/度量/跟蹤。
Backaps: etcd snapshot(如果自我管理),Velero for namespace/PVC。

3)網絡,服務和ingress

CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-фичи).

服務:「ClusterIP」,「NodePort」,「LoadBalancer」(L4雲平衡),「ExternalName」。
Ingress/Gateway API: L7路由、TLS、周長處的rate-limit/WAF歷史記錄。
NetworkPolicy:默認情況下,deny-all+通過namespace/label 進行顯式allow。
StatefulSet和服務發現的無頭服務(「clusterIP:none」)。

4)存儲(CSI)和狀態

StorageClass:「reclaimPolicy」,「volumeBindingMode」(「WaitForFirstConsumer」以獲得更好的位置)。
StatefulSet:穩定名稱/卷(「volumeClaimTemplates」),「podManagementPolicy: Parallel」用於快速部署。
ReadWriteMany:謹慎使用分布式文件(EFS/Filestore)-評估潛伏期。
快照:「VolumeSnapshotClass」+cron-backaps。

5)多重性與政策

Namespaces按產品/環境。
RBAC:最低限度的角色,單獨的服務帳戶,「Role」/「RoleBinding」而不是「ClusterRole」。
PSA (Pod Security Admission): 「baseline」/「restricted」模式(PSP替代)。

ResourceQuota / LimitRange: потолки CPU/Memory/PVC/LoadBalancer.

OPA Gatekeeper/Kyverno:入場政策(例如,禁止「:最新」,要求「資源」,「readOnlyRootFilesystem」)。
ImagePolicy/Webhook:映像簽名驗證(cosign/policy-controller)。

6)可觀察性和操作

度量:Prometheus堆棧,kube-state-metrics,node出口商。
Logs:Fluent Bit/Vector → 對象/ES/OpenSearch,節點旋轉。

Traces: OpenTelemetry Collector.

SLO-dashbords: RED模型在ingress和關鍵服務上。
自動軌道:HPA(按應用程序度量),背景的VPA,節點的Cluster-Autoscaler。

7)清單模式(spargalka)

部署(摘錄):
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'用於名稱/標簽/註釋。
在任何地方都指定「資源」、「securityContext」、「readiness/liveness」。

使用標準化電路('app.kubernetes.io/`).

通過「values」 (ingress/hpa/pdb/servicemonitor)選購fici。
包括'values。schema.json'是來自錯誤的configs的停止。
對於敏感數據-來自外部語句的秘密(外部秘密,SOPS),而不是存儲在價值中。

示例'_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存儲庫工件中。
圖書館圖:用於重新使用的一般模板(ingress/servicemonitor)。

11) Hooks, CRD和操作順序

Hooks: `pre-install`, `post-install`, `pre-upgrade`, `post-upgrade`, `test`.添加政策(「before-hook-creation」,「hook-succeed」)。
CRD:放入「crds/」(設置為templates)中,避免「即時」加入CRD-分別進行遷移。
DB遷移/初始化是具有idempotency和taymouth的求職者。

12)圖表和CI測試

「helm lint」+驗證電路。
Helm unittest(單位),圖表測試(ct)是CI中kind/minikube中的裝配/安裝。
Snapshot模式測試(「helm template」 →與基準進行比較)。
煙霧測試「幫助測試」(通過檢查提高「Pod」)。

13) GitOps (Argo CD/Flux)

真相來源是一個存儲庫。該圖表存儲為HelmRelease/HelmChart(Flux)或Application(Argo)。
Sink Policy: auto-sync with prune/self-heal, statuses and health-checks。
促銷版本:標簽機器人/semver-range,PR流。
將repo分為apps(圖表)和env (overrides/values)。
秘密管理:SOPS(age/KMS),外部秘密。

14)安全: 最低限度所需的

PSA受限制:沒有特權,沒有hostPath,機會有限,只讀rootfs。
ImagePolicy:僅簽名/受信任的映像。
NetworkPolicy:「默認情況下鎖定」。
RBAC:按應用程序服務帳戶,namespace中的「Role」/「RoleBinding」。
管理控制:Gatekeeper/Kyverno規則(資源/限制,標簽,不最新)。
秘密:SOPS/外部秘密;不要在values/plain Git中散布秘密。

15)反模式

圖表和圖像中的「: 最新」;沒有價值。schema.json`.

一個巨大的圖表是「全部」而不是模塊化。
CRD在「templates/」中以模板更新,→升級中的混亂。
模板中僵硬的名稱/端口/namespace。
缺乏資源/限制和樣品→潛伏期漂移和不穩定性。
沒有PDB → drain/upgrade不可能為零。
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', tests ('helm lint',unit, ct).

連接observability (ServiceMonitor/@@PodMonitor)、日誌代理、OTel。
引入升級過程:staging → canary → prod, hook從滾回遷移。

26-45天

自動執行依賴關系更新(bots/semver-ranges+PR)。
在CI中添加Gatekeeper/Kyverno政策和政策報告。
記錄群集升級的運行手冊,DR過程(Velero/etcd snapshot)。

17)成熟度量

100%的應用程序將通過Helm/GitOps丟棄,而無需手動使用「kubectl apply」。
所有圖表均具有「價值」。schema.json'、測試、簽名和記錄的依賴版本。
PSA 受限制/NetworkPolicy包含在所有命名空間中。
PDB和HPA存在於所有關鍵服務中。
安全秘密(SOPS/Oxternal Secrets)、「無最新」策略、圖像簽名。
群集和圖表的升級在沒有市區的情況下(金絲雀/藍綠色)進行,恢復測試是常規的。

18)結論

強大的Kubernetes基礎=強大的集群架構+嚴格的政策+由GitOps 管理的工業質量Helm圖表。標準化模板,保護PSA/NetworkPolicy/RBAC環境,驗證價值並自動化測試、簽名和促銷活動。然後,升級和發布將變得可預測,平臺將是可持續的,對產品團隊友好。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。