本页展示了如何在 Kubernetes 集群中使用节点亲和性(Node Affinity)将 Kubernetes Pod 分配给特定的节点。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
你的 Kubernetes 服务器版本必须不低于 v1.10。要检查版本,请输入 kubectl version。
列出集群中的节点及其标签
kubectl get nodes --show-labels
输出类似于此
NAME STATUS ROLES AGE VERSION LABELS
worker0 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker0
worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1
worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2
选择一个节点,并为其添加标签
kubectl label nodes <your-node-name> disktype=ssd
其中 <your-node-name> 是你所选节点的名字。
验证你选择的节点是否拥有 disktype=ssd 标签
kubectl get nodes --show-labels
输出类似于此
NAME STATUS ROLES AGE VERSION LABELS
worker0 Ready <none> 1d v1.13.0 ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1
worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2
在上述输出中,你可以看到 worker0 节点拥有 disktype=ssd 标签。
此清单描述了一个 Pod,它具有 requiredDuringSchedulingIgnoredDuringExecution 节点亲和性,即 disktype: ssd。这意味着该 Pod 将仅被调度到拥有 disktype=ssd 标签的节点上。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
应用该清单以创建被调度到你所选节点上的 Pod
kubectl apply -f https://k8s.io/examples/pods/pod-nginx-required-affinity.yaml
验证 Pod 是否正在您选择的节点上运行
kubectl get pods --output=wide
输出类似于此
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 13s 10.200.0.4 worker0
此清单描述了一个 Pod,它具有 preferredDuringSchedulingIgnoredDuringExecution 节点亲和性,即 disktype: ssd。这意味着 Pod 将优先选择拥有 disktype=ssd 标签的节点。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
应用该清单以创建被调度到你所选节点上的 Pod
kubectl apply -f https://k8s.io/examples/pods/pod-nginx-preferred-affinity.yaml
验证 Pod 是否正在您选择的节点上运行
kubectl get pods --output=wide
输出类似于此
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 13s 10.200.0.4 worker0
详细了解 节点亲和性。