Kubernetes Pod亲和与互斥调度策略

Pod 亲和与互斥的调度具体做法:

通过在Pod 的定义上增加topologyKey属性,来声明对应的目标拓扑区域内几种相关联的Pod 要“在一起或不在一起”,与节点亲和相同,Pod亲和与互斥的条件设置也是requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedlingIgnoredDuringExecution。 Pod 的亲和性被定义于PodSpec的affinity字段的podAffinity 子字段中。Pod 间的互斥性则被定义于同一层次的podAntiAffinity 子字段中。

下面通过实例来说明Pod 间的亲和性和互斥策略设置。

1. 参考目标Pod

首先,创建一个名pod-flag 的Pod ,带有标签security = S1 和 app = nginx ,后面的例子将使用pod-flag 作为Pod 亲和与互斥的目标Pod:

apiVersion: v1
kind: Pod
metadata: 
  name: pod-flag
  labels: 
    security: "S1"
    app: "nginx"
spec: 
  containers: 
  - name: nginx
    image: nginx

创建运行该Pod

[root@k8s-master ~]# kubectl create -f pod-flag.yaml 
pod/pod-flag created

查看pods ,在标签栏显示我们设置的标签

[root@k8s-master ~]# kubectl get pods --show-labels
NAME                                READY   STATUS    RESTARTS       AGE    LABELS
pod-flag                            1/1     Running   0              109s   app=nginx,security=S1

2. Pod 的亲和性调度

下面创建第2个Pod 来说明Pod的亲和性调度,这里定义的亲和性标签是“security=S1” 对应上面的Pod “pod-flag” , topologyKey 的值 被设置为 “kubernetes.io/hostname”:

apiVersion: v1
kind: Pod
metadata: 
  name: pod-affinity
spec: 
  affinity: 
    podAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
      - labelSelector: 
          matchExpressions: 
          - key: security
            operator: In
            values: 
            - S1
        topologyKey: kubernetes.io/hostname
  containers:
  - name: with-pod-affinity
    image: gcr.io/google_containers/pause:2.0      

创建Pod 之后,使用kubectl get pods -o wide 命令可以看到这两个Pod 在同一个Node 上运行。

[root@k8s-master ~]# kubectl get pods -o wide
NAME                                READY   STATUS         RESTARTS       AGE     IP               NODE         NOMINATED NODE   READINESS GATES
pod-affinity                        0/1     ErrImagePull   0              25s     10.244.140.118   k8s-node-2   <none>           <none>
pod-flag                            1/1     Running        0              5m22s   10.244.140.117   k8s-node-2   <none>           <none>

注意的是这个status 字段是失败的,我通过如下命令查看日志,发现报错了,不过这里的报错不用管,因为我们这里讲不是这个内容,我们看到这两个Pod都在同一个Node 上。

[root@k8s-master ~]# kubectl logs pod-affinity
Error from server (BadRequest): container "with-pod-affinity" in pod "pod-affinity" is waiting to start: image can't be pulled

3. Pod 的互斥性调度

创建第3个Pod ,我们希望它不与目标Pod 运行在同一个Node 上:

apiVersion: v1
kind: Pod
metadata: 
  name: anti-affinity
spec: 
  affinity: 
    podAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
      - labelSelector: 
          matchExpressions: 
          - key: security
            operator: In
            values: 
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
      - labelSelector: 
          matchExpressions: 
          - key: app
            operator: In
            values: 
            - nginx
        topologyKey: topology.kubernetes.io/hostname
  containers:
  - name: anti-affinity
    image: gcr.io/google_containers/pause:2.0     

这里要求这个新Pod与security=S1 的Pod 为同一个zone , 但是不与app=nginx 的Pod 为同一个Node,创建Pod 之后,同样用kubectl get pods -o wide 来查看,会看到新的Pod被调度到了同一个 Zone 内的不同Node 上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝颜~岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值