用节点亲和性把 Pods 分配到节点
- 在 K8s 集群中,如何使用节点亲和性把 Pod 分配到特定节点
- 机器资源各不相同,配置不同,一些应用对配置有要求的需要部署到相关机器上
- 应用场景
- 场景1: 对读写性能要求较高的pod部署到安装ssd的机器上
- 场景2: 把同一类型的应用部署到一起,比如 db 数据库类的
- 列出集群中的节点及其标签:$
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master.k8s Ready control-plane,master 44h v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.k8s,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node1.k8s Ready <none> 44h v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1.k8s,kubernetes.io/os=linux
node2.k8s Ready <none> 44h v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2.k8s,kubernetes.io/os=linux
1 )场景 1
-
选择一个节点,给它添加一个标签:
-
$
kubectl label nodes <your-node-name> disktype=ssd
- 这里 是你的一个节点名称,比如: node1.k8s
-
验证你所选节点具有 disktype=ssd 标签:
$kubectl get nodes --show-labels
-
依据强制的节点亲和性调度 Pod, 下面清单描述了一个 Pod
-
它有一个节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution , disktype=ssd
-
这意味着 pod 只会被调度到具有 disktype=ssd 标签的节点上
-
亲和性有很多类型,这里是一种节点亲和性
-
创建 affinity.yaml
apiVersion: v1 kind: Pod metadata: name: nginx spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd containers: - name: aff-nginx image: nginx imagePullPolicy: IfNotPresent
-
$
kubectl create -f affinity.yaml
-
$
kubectl describe pod aff-nginx
-
可以看到非常准确的部署到 设置了
distype=ssd
的那个节点机器上了 -
如果有移除相关label, 参考: $
kubectl label nodes node2.k8s disktype-
2 )场景2: 将数据库类型的应用部署到 db 类型的节点上
- 类似的,比如想要把某个数据库应用部署到 node2.k8s上,
- 为 node2.k8s 设置 相应的 label, 如: $
kubectl label nodes node1.k8s type=db
- 在 affinity.yaml 中
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: In values: - db
- 这样,应用就会被部署到相应设置节点的机器上