将工作负载调度至ARM节点
在CCE集群中,可能同时包含ARM和x86节点,为了确保仅兼容ARM的应用被正确调度,或双架构镜像优先使用ARM节点,您可以通过Kubernetes原生调度特性实现,本文为您提供从“强制调度”到“优先调度”的完整方案。
本文提供三种调度配置,您可以按需选择。
| 场景 | 调度意图 | 推荐配置 |
|---|---|---|
| 场景一:纯ARM应用 | 强制调度到ARM节点,不能调度到x86节点。 | nodeSelector或required类型的nodeAffinity |
| 场景二:双架构应用,优先调度至ARM节点 | 优先调度到ARM节点,ARM节点资源不足时可调度到x86节点。 | preferred类型的nodeAffinity |
| 场景三:双架构应用,强制调度至ARM节点 | 必须调度到ARM节点;若无可用的ARM节点,Pod应保持Pending。 | required类型的nodeAffinity |
创建ARM节点池
工作负载调度至ARM节点
场景一:纯ARM应用
Pod只能运行在ARM节点上,您可以使用nodeSelector或required类型的nodeAffinity调度。
- 方法1:使用nodeSelector
apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test image: <your-arm64-only-image:latest> # 替换为实际镜像地址 nodeSelector: kubernetes.io/arch: arm64 # 强制调度到ARM节点 imagePullSecrets: - name: default-secret - 方法2:使用required类型的nodeAffinity
apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test image: <your-arm64-only-image:latest> # 替换为实际镜像地址 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: # 硬约束 nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - arm64 # 强制调度到ARM节点 imagePullSecrets: - name: default-secret
场景二:双架构应用,优先调度至ARM节点
首选ARM节点,但当ARM节点资源不足时,可允许调度到x86节点以保证业务运行。这是多数双架构应用的最佳实践。
配置示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 软约束
- weight: 100 # 权重越高,优先级越高
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
containers:
- name: test
image: <your-multi-arch-image:latest> # 替换为实际镜像地址,镜像需同时支持amd64/arm64
imagePullSecrets:
- name: default-secret 场景三:双架构应用,强制调度至ARM节点
Pod必须运行在ARM节点上,如果集群中没有可用ARM节点,Pod不调度(保持Pending状态)。
配置示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬约束
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
containers:
- name: test
image: <your-multi-arch-image:latest> # 替换为实际镜像地址
imagePullSecrets:
- name: default-secret 该配置与场景一中纯ARM应用的强制调度配置在YAML上完全一样。区别在于镜像:场景三的镜像同时支持双架构,但出于性能或成本原因,仍希望它强制跑在ARM节点上。
常见问题
如何验证Pod是否调度到了ARM节点?
- 查看Pod所在节点。
kubectl get pod <pod-name> -o wide - 进一步查看节点架构
kubectl get node <node-name> -o jsonpath='{.metadata.labels.kubernetes\.io/arch}'输出arm64表示成功调度到了ARM节点。
如何构建双架构镜像?
您可以使用Docker的Manifest List功能构建双架构容器镜像,具体操作请参见CCE中使用x86和ARM双架构镜像。

