应用高可用部署推荐
 
                  更新时间 2024-04-22 17:31:23
                 
 
                    最近更新时间: 2024-04-22 17:31:23
                  
 本节介绍云容器引擎的最佳实践: 应用高可用部署推荐。
 基本原则
可参考如下几点,实现容器应用高可用部署:
- 集群控制节点高可用,控制节点数大于等于3;
 - 集群需有多个属于不同可用区的节点,业务根据自身需求合理配置调度策略,以实现多可用区部署及资源均匀分配;
 - 创建多个在不同可用区的节点池,通过节点池做节点伸缩;
 - 工作负载实例数需大于等于2;
 - 配置工作负载的亲和性规则,让Pod尽量分布在不同可用区、不同节点上。
 
操作步骤
假设集群3个控制节点和3个工作节点,工作节点可用区分布如下所示:
$ kubectl get node -L topology.kubernetes.io/zone | grep -v master
NAME                   STATUS   ROLES    AGE   VERSION   ZONE
ccseagent-1b54ffbc17  Ready    <none>   40m   v1.25.6   cn-xinan1-1A
ccseagent-59ab9e7689  Ready    <none>   38m   v1.25.6   cn-xinan1-2A
ccseagent-a7527e3e80  Ready    <none>   36m   v1.25.6   cn-xinan1-3A
创建工作负载,如下所示,定义两条podAntiAffinity反亲和性规则:
- 
工作负载多实例配置可用区反亲和,参数设置如下:
- 权重weight:权重值越高会被优先调度,本示例设置为50;
 - 拓扑域topologyKey:为节点标签,用于指定调度时的作用域,下述示例为topology.kubernetes.io/zone,该标签用于识别节点在哪个可用区。
 - 标签选择labelSelector:选择Pod的标签,与工作负载本身反亲和。
 
 - 
工作负载多实例配置节点反亲和,参数设置如下:
- 权重weight:设置为50;
 - 拓扑域topologyKey:为标签kubernetes.io/hostname,该标签值为节点名;
 - 标签选择labelSelector:即工作负载多个实例Pod的标签,实例间反亲和。
 
 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: container-0
          image: nginx:latest
          resources:
            limits:
              cpu: 300m
              memory: 512Mi
            requests:
              cpu: 400m
              memory: 512Mi
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 50
              podAffinityTerm:
                labelSelector:                             # 配置Pod标签,工作负载实例间反亲和
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - demo
                namespaces:
                  - default
                topologyKey: topology.kubernetes.io/zone   # 拓扑域为可用区
            - weight: 50
              podAffinityTerm:
                labelSelector:                             # 配置Pod标签,工作负载实例间反亲和
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - demo
                namespaces:
                  - default
                topologyKey: kubernetes.io/hostname        # 拓扑域为节点
创建该工作负载,查看创建的Pod:
$ kubectl get pod -owide
NAME                    READY   STATUS    RESTARTS   AGE   IP             NODE
demo-3hjgd8bb64-aawck   1/1     Running   0          21s   192.168.0.32   ccseagent-1b54ffbc17
demo-3hjgd8bb64-plary   1/1     Running   0          21s   192.168.1.25   ccseagent-a7527e3e80
将实例数扩容到3,可见新建Pod被调度到另一个节点,3个实例所在3个节点属3个不同可用区。
$ kubectl scale deploy/demo --replicas=3
deployment.apps/demo scaled
$ kubectl get pod -owide
NAME                    READY   STATUS    RESTARTS   AGE   IP             NODE
demo-3hjgd8bb64-aawck   1/1     Running   0          3s    192.168.0.32   ccseagent-1b54ffbc17
demo-3hjgd8bb64-plary   1/1     Running   0          45s   192.168.1.25   ccseagent-a7527e3e80
demo-3hjgd8bb64-ccgum   1/1     Running   0          45s   192.168.2.16   ccseagent-59ab9e7689
根据上述工作负载反亲和性规则,可将Pod按照可用区和节点做较为均匀的分布,实现应用的高可用部署。