Kubernetes Pod 亲和性

和节点亲和性类似,Pod亲和性主要用于限制调度器工作,顾名思义,Pod亲和性是参考pod运行来调度的

而不是像节点亲和性那样根据节点来控制调度

Kubernetes 节点亲和性 中我们创建了nginx的deploy

可以看到 nginx全部 运行在 129 上

这里我们尝试让 nginx2 跟随 nginx 调度在同一个节点上

使用

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hello-deployment2
  namespace: lizhe
  labels:
    app: nginx-hello2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-hello2
  template:
    metadata:
      labels:
        app: nginx-hello2
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx-hello
            topologyKey: numberCores
      containers:
      - name: nginx-hello2
        image: nginx
        ports:
        - containerPort: 80

结果发现 nginx2 不仅被调度在了 129 上,还被调度在了 139 上

这就不得不说一说 topologyKey 了,由于我们的3个node都指定了 numberCores=6

也就是说,

  1. 运行了 pod app=nginx-hello 的 node上,带有numberCores, 且值为 6
  2. 则 只要是带有 numberCores 为 6 的 node,都可以运行 nginx2

我们把numberCores在 129 上改为 7 ,这样就只有 129的 numberCores 是 7 ,其余node 都是 6

这样,nginx2 为了跟随 nginx的7,只能被调度在 129上

由于亲和性配置在 已经创建的 pod 上不能重新生效(因为已经被调度完成了)

所以这里我们删除原 dep 重新创建

这一次可以看到,因为只有 129带有7,所以nginx 被全部调度在了 129 上

那如果你想要让 pod A 只被调度在已经运行了 pod B 的节点上,只需要把

topologyKey 写成 kubernetes.io/hostname

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hello-deployment2
  namespace: lizhe
  labels:
    app: nginx-hello2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-hello2
  template:
    metadata:
      labels:
        app: nginx-hello2
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx-hello
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx-hello2
        image: nginx
        ports:
        - containerPort: 80

Send a Message