Kubernetes 中 kube-scheduler 组件负责 新建 Pod 或者伸缩 Pod 的调度,对每一个新创建的 Pod 或者是未被调度的 Pod,kube-scheduler 都会通过自身的一系列的调度算法选择一个最优的节点来创建和运行这个 Pod。kube-scheduler 给一个 Pod 做调度选择包含过滤和打分两个步骤。过滤阶段会将所有满足 Pod 调度需求的节点都选出来,在打分阶段 kube-scheduler 会给每一个可调度节点进行优先级打分,最后 kube-scheduer 会将 Pod 调度到得分最高的节点上,如果存在多个得分最高的节点,kube-scheduler 会从其中随机选取一个。
在打分优先级中节点调度均衡(BalancedResourceAllocation)只是其中一项,还有其他打分项会导致分布不均匀。想要让多个Pod尽可能的均匀分布在各个节点上,可以考虑使用工作负载反亲和特性,让 Pod 之间尽量互斥,这样就能尽量均衡的分布在各个节点上。
柔性约束下反亲和性部署如下:
kind: Deployment
apiVersion: apps/v1
metadata:
name: pod-antiaffnity-preferred
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
ctlr: pod-antiaffinity-preferred
template:
metadata:
labels:
app: nginx
ctlr: pod-antiaffinity-preferred
spec:
containers:
- name: container-0
image: nginx:alpine
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
affinity:
podAntiAffinity: # Pod工作负载反亲和
preferredDuringSchedulingIgnoredDuringExecution: # 尽量满足如下条件
- podAffinityTerm:
labelSelector: # 选择Pod的标签,与工作负载本身反亲和
matchExpressions:
- key: app
operator: In
values:
- nginx
- {key: ctlr, operator: In, values: ["pod-antiaffinity-preferred"]}
namespaces:
- default
topologyKey: kubernetes.io/hostname # 在节点上起作用
imagePullSecrets:
- name: default-secret
强制反亲和约束下的部署:
kind: Deployment
apiVersion: apps/v1
metadata:
name: pod-antiaffnity-required
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
ctlr: pod-antiaffinity-required
template:
metadata:
labels:
app: nginx1
ctlr: pod-antiaffinity-required
spec:
containers:
- name: container-0
image: nginx:alpine
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
affinity:
podAntiAffinity: # Pod工作负载反亲和
requiredDuringSchedulingIgnoredDuringExecution: # 必须满足如下条件
- podAffinityTerm:
labelSelector: # 选择Pod的标签,与工作负载本身反亲和
matchExpressions:
- key: app
operator: In
values:
- nginx
- {key: ctlr, operator: In, values: ["pod-antiaffinity-preferred"]}
namespaces:
- default
topologyKey: kubernetes.io/hostname # 在节点上起作用
imagePullSecrets:
- name: default-secret
本文介绍Kubernetes中如何使用Pod反亲和性确保应用实例在集群内均匀分布,通过设置不同级别的反亲和规则实现负载均衡。
1127

被折叠的 条评论
为什么被折叠?



