Skip to content

topologyKey

topology 就是拓扑的意思,是一个范围的概念,比如一个 Node、一个机柜、一个机房或者是一个地区(如杭州、上海)等,实际上对应的还是 Node 上的标签。

这里的 topologyKey 对应的是 Node 上的标签的 Key(没有Value)

# 这是master节点拥有的标签

k get nodes --show-labels

beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=master
kubernetes.io/os=linux
node-role.kubernetes.io/control-plane=
node-role.kubernetes.io/master=

其实 topologyKey 就是用于筛选 Node 的。通过这种方式,我们就可以将各个 Pod 进行跨集群、跨机房、跨地区的调度了。

比如 topologyKey: "kubernetes.io/hostname" 按照节点名称的不同,分散Pod到各个节点上面。

这里 Pod 的亲和性规则是:

这个 Pod 要调度到的 Node 必须有一个标签为 app:dp-demo 的 Pod(说白了,每个Node要保证只有一个app:dp-demo的Pod)。 且该 Node 必须有一个 Key 为 kubernetes.io/hostname 的标签,即 Node 必须属于 kubernetes.io/hostname 拓扑域。

这里有个有趣的现象,由于我这里只有两个 node,而 replicas: 3,造成一个Pod始终处于 pending 状态

dp-demo-6544cdf96-bscdt   1/1     Running   0          15m   10.233.70.5    master   <none>           <none>
dp-demo-6544cdf96-kzwlv   1/1     Running   0          15m   10.233.68.62   vm2      <none>           <none>
dp-demo-6544cdf96-zgqd2   0/1     Pending   0          15m   <none>         <none>   <none>           <none>
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dp-demo
spec:
  selector:
    matchLabels:
      app: dp-demo
  replicas: 3
  template:
    metadata:
      labels:
        app: dp-demo
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - dp-demo
            topologyKey: "kubernetes.io/hostname"
        #  反亲和度    
        podAntiAffinity:
          # 尽量让 Pod 不要调度到这样的 Node
          # 其中包含一个 Key 为 kubernetes.io/hostname 的标签,且该 Node 上有标签为 security: S2 的 Pod。
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: security
                  operator: In
                  values:
                  - S2
              topologyKey: kubernetes.io/hostname      
      containers:
      - name: nginx
        image: nginx-alpine