一、计算服务不部署到低性能机器

假如已知集群中有一些机器可能性能不佳或者其他因素的影响,需要控制某个服务尽量不部署至这些机器,此时只需要把 operator 改为 NotIn 即可:

比如计算服务不能部署在带有performance=low的节点上:

环境准备工作:

[root@k8s-master01 ~]# k label node k8s-master01 performance=low

# 验证
[root@k8s-master01 ~]# kg node --show-labels | grep master01
k8s-master01   Ready    control-plane   10d   v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,performance=low,zone=beijing-haidian

1.1 计算服务必须不部署到低性能机器

1.查看节点污点情况

[root@k8s-master01 ~]# kubectl describe node | grep Taint            
Taints:             <none>
Taints:             <none>
Taints:             <none>
Taints:             <none>

2.定义一个名为podAntiAffinity09的yaml文件

[root@k8s-master01 Affinity]# vim podAntiAffinity09.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: compute-intensive
  name: compute-intensive-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: compute-intensive
  template:
    metadata:
      labels:
        app: compute-intensive
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions: 
              - key: performance
                operator: NotIn
                values:
                - low
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: compute-intensive

4.开始部署

[root@k8s-master01 ~]# kaf podAntiAffinity09.yaml 

5.查看pod状态,观察到pod被部署到node01和node02节点上,没有部署到master01节点上

[root@k8s-master01 ~]# kgp -owide
NAME                                     READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
compute-intensive-app-6b486f499b-bqpg4   1/1     Running   0          107s   192.168.85.203   k8s-node01   <none>           <none>
compute-intensive-app-6b486f499b-hnkqw   1/1     Running   0          107s   192.168.58.208   k8s-node02   <none>           <none>
compute-intensive-app-6b486f499b-wfqn9   1/1     Running   0          107s   192.168.58.210   k8s-node02   <none>           <none>

6.重启应用,再次进行验证

# 重启应用
[root@k8s-master01 ~]# k rollout restart deploy compute-intensive-app

# 观察到应用重启后仍然部署到node01节点和node02节点上,没有部署到master01节点上
[root@k8s-master01 ~]#  kgp -owide
NAME                                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-intensive-app-7b7cb44b8b-hhmgr   1/1     Running   0          4s    192.168.58.212   k8s-node02   <none>           <none>
compute-intensive-app-7b7cb44b8b-mbn4b   1/1     Running   0          2s    192.168.58.211   k8s-node02   <none>           <none>
compute-intensive-app-7b7cb44b8b-q8twh   1/1     Running   0          3s    192.168.85.205   k8s-node01   <none>           <none>

7.环境复原

[root@k8s-master01 ~]# k delete -f podAntiAffinity09.yaml 

1.2 计算服务尽量不部署到低性能机器

1.查看节点污点情况

[root@k8s-master01 ~]# kubectl describe node | grep Taint            
Taints:             <none>
Taints:             <none>
Taints:             <none>
Taints:             <none>

2.定义一个名为podAntiAffinity08的yaml文件

[root@k8s-master01 Affinity]# vim podAntiAffinity10.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: compute-intensive
  name: compute-intensive-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: compute-intensive
  template:
    metadata:
      labels:
        app: compute-intensive
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: performance
                operator: NotIn
                values:
                - low
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        name: compute-intensive

4.开始部署

[root@k8s-master01 ~]# kaf podAntiAffinity08.yaml 

5.查看pod状态,观察到pod只部署到了node01节点和node02节点

[root@k8s-master01 ~]# kgp -owide
NAME                                    READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-intensive-app-f8c8d785c-9c4hf   1/1     Running   0          9s    192.168.58.214   k8s-node02   <none>           <none>
compute-intensive-app-f8c8d785c-r2xff   1/1     Running   0          9s    192.168.85.201   k8s-node01   <none>           <none>
compute-intensive-app-f8c8d785c-v9tgz   1/1     Running   0          36s   192.168.58.213   k8s-node02   <none>           <none>

6.重启应用,再次进行验证

# 重启应用
[root@k8s-master01 ~]# k rollout restart deploy compute-intensive-app

# 观察到应用重启后仍然部署到node01节点和node02节点上
[root@k8s-master01 ~]# kgp -owide 
NAME                                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-intensive-app-6f689b8d7d-fslgj   1/1     Running   0          4s    192.168.85.206   k8s-node01   <none>           <none>
compute-intensive-app-6f689b8d7d-j7nw7   1/1     Running   0          6s    192.168.58.216   k8s-node02   <none>           <none>
compute-intensive-app-6f689b8d7d-n82vj   1/1     Running   0          4s    192.168.58.215   k8s-node02   <none>           <none>

7.环境复原

[root@k8s-master01 ~]# k delete -f podAntiAffinity10.yaml