在Kubernetes中,调度策略是指如何将Pod调度到节点上的规则。亲和性(Affinity)和反亲和性(Anti-Affinity)是两种常见的调度策略,它们可以帮助您控制Pod的分布,以提高应用的性能和可靠性。
亲和性和反亲和性策略
节点亲和性(Node Affinity):控制Pod应该调度到哪些节点。
节点反亲和性(Node Anti-Affinity):控制Pod不应该调度到哪些节点。
Pod亲和性(Pod Affinity):控制Pod应该与哪些Pod共同调度到同一节a点。
Pod反亲和性(Pod Anti-Affinity):控制Pod不应该与哪些Pod共同调度到同一节点。
通过控制台配置负载亲和/反亲和调度策略
1、登录CCE控制台,单击集群名称进入集群。
2、在集群控制台左侧导航栏中选择**“工作负载"**,切换至“无状态”页签,点击"创建Deployment"。
3、在创建deployment中,点击显示高级设置,选择负载亲和性调度的策略类型。
4、配置亲和性调度规则,亲和性调度规则又分为必须满足(强制pod调度到某些节点上)和尽量满足(优先pod调度到某些节点上)。
5、待一切配置完成后,单机"提交",创建完成。
6、查看亲和状态调度到相同节点。
7、删除亲和性规则,添加反亲和性规则。反亲和性规则也分为强制分散调度(强制pod调度在不同节点上)和优先分散调度(优先pod调度在不同节点上)。
8、查看反亲和性分配在不同的节点上。
通过命令行设置
设置节点亲和性
节点亲和性允许您基于节点的标签来控制Pod的调度。以下是一个示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: my-container
image: my-repo/my-image:latest
在上述示例中,节点必须具有标签disktype=ssd,Pod才会被调度到这些节点上。
设置节点反亲和性
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: NotIn
values:
- ssd
containers:
- name: my-app-container
image: my-app-image:latest
ports:
- containerPort: 8080
注意上述示例中,将确保 my-app 的 Pod 不会调度到标记为 disktype=ssd 的节点上,从而实现节点反亲和性。
设置Pod亲和性
Pod亲和性允许您基于其他Pod的标签来控制Pod的调度。以下是一个示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
matchLabels:
app: my-app
topologyKey: "kubernetes.io/hostname"
containers:
- name: my-container
image: my-repo/my-image:latest
注意在上述示例中,新创建的Pod将被调度到与具有标签app=my-app的Pod相同的节点上。
设置Pod反亲和性
Pod反亲和性允许您基于其他Pod的标签来避免Pod被调度到相同的节点。以下是一个示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
matchLabels:
app: my-app
topologyKey: "kubernetes.io/hostname"
containers:
- name: my-container
image: my-repo/my-image:latest
注意在上述示例中,新创建的Pod将避免与具有标签app=my-app的Pod调度到相同的节点上。
应用配置并验证
应用配置
使用以下命令应用配置文件:
kubectl apply -f my-deployment.yaml
验证Pod分布
使用以下命令查看Pod的分布情况:
kubectl get pods -o wide
确认Pod被调度到了期望的节点上。
常见问题和解决方法
Pod未按预期调度
确保节点和Pod的标签正确无误。
检查调度器事件日志,找出调度失败的原因。
调度失败
确保集群中有符合条件的节点。
调整亲和性和反亲和性的规则,确保其合理且不冲突。