基本原则
可参考如下几点,实现容器应用高可用部署:
- 集群控制节点高可用,控制节点数大于等于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按照可用区和节点做较为均匀的分布,实现应用的高可用部署。