下篇:实战K8S POD亲和性、反亲和性。

开篇

《上篇:POD亲和性、反亲和性以及场景举例》中,相信你已经搞清楚了什么是POD亲和性、反亲和性、以及基本的使用场景。接着,本篇将通过一个实战案例来演示如何在K8S集群中配置亲和性和反亲和性规则,以实现更灵活的POD调度。

测试环境

在本次实战中,我们将使用以下K8S集群环境:

节点 主机名 IP
主节点 k8s-b-master 192.168.11.100
工作节点1 k8s-b-node01 192.168.11.101
工作节点2 k8s-b-node02 192.168.11.102
工作节点3 k8s-b-node03 192.168.11.103
工作节点4 k8s-b-node04 192.168.11.104
工作节点5 k8s-b-node05 192.168.11.105
工作节点6 k8s-b-node06 192.168.11.106

提示:我的测试环境使用的是单Master多Worker节点的基本集群架构,大家可根据自己的实际情况进行调整。

开始实战

在本篇实战案例中,假设有两类POD:web和db,并模拟了两个实战场景:

  • 实战场景1:web POD 调度到和 db POD 在同一个节点上,以提高它们之间的网络通信性能,这时候,就可以使用亲和性调度来约束POD的调度行为。
  • 实战场景2:将同一类POD分散到不同的节点上,将web POD调度到不同的节点上,以提高容错性和可用性。这时候,就可以为web POD配置反亲和性规则。

节点设置标签

给节点设置label:

kubectl label nodes k8s-b-node02 app=db
kubectl label nodes k8s-b-node05 app=web

场景1:使用亲和性调度POD

首先为db PODs 配置一个亲和性规则,以将它们调度到具有相同标签的节点上。在这里,假设db POD的标签为app=db。创建一个名为db-affinity.yaml的亲和性规则文件,并将以下内容添加到文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  labels:
    app: db
  namespace: goweb
spec:
  replicas: 3
  selector:
    matchLabels:
      app: db
  template:
    metadata:
      labels:
        app: db
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - db
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: db-container
        image: 192.168.11.253/library/db:latest

保存并应用:

kubectl apply -f db-affinity.yaml

查看db POD的调度结果:

[root@k8s-b-master ~]# kubectl get pod -o wide
NAME                                      READY   STATUS              RESTARTS       AGE   IP               NODE           NOMINATED NODE   READINESS GATES
db-7d686fdd7d-g6z4t                       1/1     Running             0              6s    10.244.232.191   k8s-b-node02   <none>           <none>
db-7d686fdd7d-ktpk2                       1/1     Running             0              6s    10.244.232.180   k8s-b-node02   <none>           <none>
db-7d686fdd7d-rbbkd                       1/1     Running             0              6s    10.244.232.132   k8s-b-node02   <none>           <none>

接着,准备web的yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - db
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-container
        image: 192.168.11.253/library/goweb:latest

保存并应用:

kubectl apply -f web-affinity.yaml 

查看调度结果:

[root@k8s-b-master ~]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
db-7d686fdd7d-b45l2    1/1     Running   0          6m17s   10.244.232.139   k8s-b-node02   <none>           <none>
db-7d686fdd7d-nmtx9    1/1     Running   0          6m17s   10.244.232.140   k8s-b-node02   <none>           <none>
db-7d686fdd7d-zfhdj    1/1     Running   0          6m17s   10.244.232.142   k8s-b-node02   <none>           <none>
web-596c4f9bdb-595rv   1/1     Running   0          19s     10.244.232.147   k8s-b-node02   <none>           <none>
web-596c4f9bdb-l6k9r   1/1     Running   0          19s     10.244.232.145   k8s-b-node02   <none>           <none>
web-596c4f9bdb-sl4rl   1/1     Running   0          19s     10.244.232.143   k8s-b-node02   <none>           <none>
[root@k8s-b-master ~]

场景2:使用反亲和性调度POD

创建一个名为web-anti-affinity.yaml的反亲和性规则文件,并将以下内容添加到文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 6
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - web
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-container
        image: 192.168.11.253/library/goweb:latest

保存并应用反亲和性规则:

kubectl apply -f web-anti-affinity.yaml

查看调度结果:

[root@k8s-b-master ~]# kubectl get pod -o wide
web-8474989c7d-42pcz                      1/1     Running             0              7m16s   10.244.25.84     k8s-b-node05   <none>           <none>
web-8474989c7d-965nb                      1/1     Running             0              7m16s   10.244.151.20    k8s-b-node06   <none>           <none>
web-8474989c7d-gvgj2                      1/1     Running             0              7m16s   10.244.199.145   k8s-b-node03   <none>           <none>
web-8474989c7d-j79dk                      1/1     Running             0              7m16s   10.244.51.208    k8s-b-node01   <none>           <none>
web-8474989c7d-kz5ss                      1/1     Running             0              7m16s   10.244.232.131   k8s-b-node02   <none>           <none>
web-8474989c7d-sskdw                      1/1     Running             0              7m16s   10.244.7.127     k8s-b-node04   <none>           <none>

最后

最后说明一下,Pod的亲和性和反亲和性规则也是有两种类型:

  • requiredDuringSchedulingIgnoredDuringExecution(也可以说是硬策略,适用于必须满足亲和性规则的情况)
  • preferredDuringSchedulingIgnoredDuringExecution(软策略,适用于对亲和性有偏好但不是必需的情况。)

本篇的实战场景中并未使用到软策略,有兴趣可自行测试效果。在实际工作中,可以根据应用的需求和调度策略选择适当的亲和性类型。


原文始发于微信公众号(不背锅运维):下篇:实战K8S POD亲和性、反亲和性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/149402.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!