在 k8s 中,pod 會通過 kube-scheduler 按照節占先有的資源平均的排程到這些節點上,但有時候,我們需要将某個應用的pod排程到特定的節點上,
比如:兩個應用需要頻繁的進行通訊,那麼我們希望将它們部署到同一個節點。或者希望通路一些類似需要ssd這樣特殊資源的節點等應用場景。
最簡單的方法是使用
nodeSelector
,但它比較簡單粗暴,使用起來不能靈活排程,這個在後續版本中也會慢慢過實,是以我們一般用
nodeAffinity
來實作這些需求。
具體示範如下:
# 列出叢集所有節點
-[[email protected] ~]$ kubectl get no
NAME STATUS ROLES AGE VERSION
. Ready <none> d v1.
. Ready <none> d v1.
. Ready <none> d v1.
# 删除之前打過的标簽 tester=chenqiang
-[[email protected] ~]$ kubectl label no . tester-
node "10.130.14.67" labeled
# 重新打标簽 tester=chenqiang
-[[email protected] ~]$ kubectl label no . tester=chenqiang
node "10.130.14.67" labeled
# 檢視所有标簽
-[[email protected] ~]$ kubectl get no --show-labels
NAME STATUS ROLES AGE VERSION LABELS
. Ready <none> d v1. beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress-nginx=true,kubernetes.io/hostname=.,tester=chenqiang
. Ready <none> d v1. beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress-nginx=true,kubernetes.io/hostname=.
. Ready <none> d v1. beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=.
# 通過特定标簽進行過濾節點
-[[email protected] ~]$ kubectl get no -l tester=chenqiang
NAME STATUS ROLES AGE VERSION
. Ready <none> d v1.
如果我不希望pod排程到打了
tester=chenqiang
這個标簽的 node,那麼需要使用
NotIn
這個介詞,否則使用
In
。
假設不希望排程,則添加如下的 nodeAffinity:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tester
operator: NotIn
values:
- chenqiang
一個完整的例子如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hello-deployment
namespace: chenqiang-ns1
labels:
app: nginx-hello
spec:
replicas: 2
selector:
matchLabels:
app: nginx-hello
template:
metadata:
labels:
app: nginx-hello
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tester
operator: NotIn
values:
- chenqiang
containers:
- name: nginx-hello
image: docker-registry.saicstack.com/chenqiang/nginx-hello:v2.0
ports:
- containerPort:
imagePullSecrets:
- name: regcred
從測試結果看,果然沒有排程到
10.130.14.67
這個節點。
-[[email protected] ~]$ kubectl -n chenqiang-ns1 get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-hello-deployment-f99df9d-fvz / Running m . .
nginx-hello-deployment-f99df9d-mj6xs / Running m . .