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