如何让同一K8s Deployment文件适配云端与本地单节点集群?
适配云端与本地单节点K8s的Deployment反亲和方案
方案1:将硬性反亲和改为软性规则
云端多节点环境下,硬性反亲和(requiredDuringSchedulingIgnoredDuringExecution)能强制Pod分散到不同节点,但本地单节点时会因无法满足规则导致Pod调度失败。将规则改为软性优先级(preferredDuringSchedulingIgnoredDuringExecution),可兼顾两种场景:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app-deployment spec: replicas: 3 selector: matchLabels: app: your-app-name template: metadata: labels: app: your-app-name spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - your-app-name topologyKey: kubernetes.io/hostname containers: - name: your-app-container image: your-app-image:latest
- 云端多节点:K8s会优先将Pod调度到不同节点,满足分散需求
- 本地单节点:无法满足反亲和时,会直接将Pod调度到唯一节点,避免调度阻塞
方案2:通过模板工具动态切换规则(Helm/Kustomize)
如果需要在不同环境保留不同规则强度,可借助Helm或Kustomize的模板能力,根据集群类型动态配置:
Helm示例
在values.yaml中定义集群类型参数:
clusterType: "cloud" # 可选值:cloud / local
Deployment模板中根据参数切换规则:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deployment spec: replicas: 3 selector: matchLabels: app: {{ .Release.Name }} template: metadata: labels: app: {{ .Release.Name }} spec: affinity: podAntiAffinity: {{- if eq .Values.clusterType "cloud" }} requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - {{ .Release.Name }} topologyKey: kubernetes.io/hostname {{- else }} preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - {{ .Release.Name }} topologyKey: kubernetes.io/hostname {{- end }} containers: - name: {{ .Release.Name }}-container image: your-app-image:latest
部署时指定环境:
- 云端:
helm install your-app ./chart(默认cloud) - 本地:
helm install your-app ./chart --set clusterType=local
方案3:结合节点标签与亲和性优先级
给本地节点添加专属标签,配置节点亲和性优先调度到该节点,同时保留软性反亲和:
- 给本地节点打标签:
kubectl label nodes <your-local-node-name> node-type=local
- Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app-deployment spec: replicas: 3 selector: matchLabels: app: your-app-name template: metadata: labels: app: your-app-name spec: affinity: # 优先调度到本地节点(仅本地集群有该标签) nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: node-type operator: In values: - local # 软性反亲和,尽量分散Pod podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - your-app-name topologyKey: kubernetes.io/hostname containers: - name: your-app-container image: your-app-image:latest
这种方式既保证云端多节点的Pod分散,又让本地单节点能正常调度所有Pod。
内容的提问来源于stack exchange,提问作者bbd
相关产品推荐
相关产品推荐

