應用高可用部署推薦
更新時間 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按照可用區和節點做較為均勻的分布,實現應用的高可用部署。