1.4.4. pod拓扑分布约束¶
拓扑分布约束来控制pod在集群内故障域之间的分布。例如区域(region),可用区(zone)这样有利于实现高可用并提升资源使用率。
1.4.4.1. 先决条件¶
可以给节点所在的区域进行拓扑标记。
# 给其中一个节点进行标记,标记为region区域, zone 可用区
kubectl label node zkdemo-1.epc.duxiaoman.com region=beijing zone=a
# 确认下
kubectl get node --show-labels=true
这里我没有那么多机器,应该根据实际部署的位置进行标记, 这里我们假定我有2个区域,每个区域都有2个可用区。 一共4个work节点。
拓扑标记建议使用如下标签名字: topology.kubernetes.io/region和 topology.kubernetes.io/zone. 这个如果有cloud-coller-manager的时候应该会自动设置的。
1.4.4.2. pod分布约束¶
1kind: Pod
2apiVersion: v1
3metadata:
4 name: mypod
5 labels:
6 foo: bar
7spec:
8 topologySpreadConstraints:
9 - maxSkew: 1
10 topologyKey: zone
11 whenUnsatisfiable: DoNotSchedule
12 labelSelector:
13 matchLabels:
14 foo: bar
15 containers:
16 - name: pause
17 image: k8s.gcr.io/pause:3.1
先说明下几个字段
topologySpreadConstraints: 指定拓扑约束的, 可以有多个约束规则的。
maxSkew: 描述分布不均匀程度,是2个拓扑域差值
topologyKey: 拓扑标签的key,这里我们使用了zone
whenUnsatisfiable: 如果pod不满足分布约束的时候如何处理, donotschedule是不要调度,scheduleanyway是继续调度,进行偏差最小化。
labelSelector: 用于查找匹配的po,根据这个来统计各个拓扑域的pod数量。
1.4.4.3. 设置集群级别的默认约束¶
apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration
profiles:
- pluginConfig:
- name: PodTopologySpread
args:
defaultConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
defaultingType: List