用节点亲和性把 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: disktypeoperator: Invalues:- ssd containers:- name: aff-nginximage: nginximagePullPolicy: 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: typeoperator: Invalues:- db
- 这样,应用就会被部署到相应设置节点的机器上