knowledge-base

我的知识库 / Kubernetes / 反亲和性提高服务可用性

反亲和性提高服务可用性

在 Kubernetes 中部署服务时,我们通常会部署多副本来提高服务的可用性。但是当这些副本集中部署在一个节点,而且很不幸,该节点出现故障,那么服务很容易陷入不可用状态。

下面介绍一种方法,将服务副本分散部署在不同的节点(把鸡蛋放在不同的篮子里),避免单个节点故障导致服务多副本毁坏,提高服务可用性。

反亲和

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx
              topologyKey: kubernetes.io/hostname
      containers:
        - name: nginx
          image: nginx
          ports:
            - name: tcp
              containerPort: 80

使用 kubernetes.io/hostname 作为拓扑域,查看匹配规则,即同一打有同样标签 app=nginx 的 pod 会调度到不同的节点。

podAntiAffinity 使用场景:

对于亲和性和反亲和性,每种都有三种规则可以设置:

亲和性/反亲和性调度策略比较

调度策略 匹配标签 操作符 拓扑域支持 调度目标
nodeAffinity 主机 In, NotIn, Exists, DoesNotExist, Gt, Lt pod 到指定主机
podAffinity Pod In, NotIn, Exists, DoesNotExist pod 与指定 pod 同一拓扑域
PodAntiAffinity Pod In, NotIn, Exists, DoesNotExist pod 与指定 pod 非同一拓扑域

» apiserver-builder