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

假设集群中有一批机器是高性能机器,而有一些需要密集计算的服务,需要部署至这些机器,以提高计算性能,此时可以使用节点亲和力来控制 Pod 尽量或者必须部署至这些节点上。

比如计算服务只能部署在 ssd 或 nvme 的节点上:

环境准备工作:

[root@k8s-master01 ~]# k label node k8s-node01 ssd=true disktype=ssd
[root@k8s-master01 ~]# k label node k8s-node02 disktype=nvme

# 验证
[root@k8s-master01 ~]# kg node k8s-node02 --show-labels | grep disktype
k8s-node02   Ready    <none>   10d   v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=nvme,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,zone=beijing-haidian

[root@k8s-master01 ~]# kg node --show-labels | grep ssd
k8s-node01     Ready    <none>          10d   v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,ssd=true,zone=beijing-chaoyang
[root@k8s-master01 ~]# kg node --show-labels | grep disk
k8s-node01     Ready    <none>          10d   v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,ssd=true,zone=beijing-chaoyang

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

1.查看节点污点情况

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

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

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

4.开始部署

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

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

[root@k8s-master01 ~]# kgp -owide
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-6fcfffd75d-8wtlx   1/1     Running   0          72s   192.168.85.195   k8s-node01   <none>           <none>
compute-6fcfffd75d-d2hqc   1/1     Running   0          72s   192.168.58.207   k8s-node02   <none>           <none>

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

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

# 观察到应用重启后仍然部署到value值为nvme和ssd的node01节点和node02节点
[root@k8s-master01 ~]# kgp -owide
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-7879b9bb75-7k62g   1/1     Running   0          5s    192.168.85.199   k8s-node01   <none>           <none>
compute-7879b9bb75-kmn2q   1/1     Running   0          6s    192.168.58.206   k8s-node02   <none>           <none>

7.环境复原

[root@k8s-master01 ~]# k delete -f podAntiAffinity07.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 podAntiAffinity08.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: compute
  name: compute
spec:
  replicas: 1
  selector:
    matchLabels:
      app: compute
  template:
    metadata:
      labels:
        app: compute
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd
          - weight: 50
            preference:
              matchExpressions:
              - key: disktype
                operator: In
                values:
                - nvme
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        name: compute

4.开始部署

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

5.查看pod状态,观察到pod按照权重被部署到node01节点上

[root@k8s-master01 ~]# kgp -owide 
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-59dbd98958-6zsvr   1/1     Running   0          7s    192.168.85.202   k8s-node01   <none>           <none>

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

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

# 观察到应用重启后仍然部署到node01节点上
[root@k8s-master01 ~]# kgp -owide 
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
compute-bcd89b469-gbz96   1/1     Running   0          2s    192.168.85.204   k8s-node01   <none>           <none>

7.环境复原

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