《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在OpenShift 4.10环境中进行验证。
场景说明
当新的 Worker 节点加入 OpenShift 集群后,通常只有在原有集群的 Worker 节点的资源比较吃紧的时候, 分布在原有集群的 Worker 节点的 Pod 才会被强制重新调度新节点上,否则只有新创建的 Pod 才会被调度到新节点上。
为了能将集群中已有 Pod 重新分配到新 Worker 节点上,可以使用 OpenShift 提供的 Kube Deschedule Operator,并配置对应策略。这样可以让应用负载尽快地、合理地分布在集群中的 Worker 节点之间。
验证 Descheduler
说明:验证环境的 OpenShift 集群有 3个 Worker 节点。另外,为了能够验证新节点加入进群的过程,我们使用了通过 IPI 安装的 OpenShift 具备的 MachineSet 自动创建新节点来替换故障节点的功能。实现方法参见《OpenShift 4 - 5 分钟自动替换 OpenShift 集群故障节点 》。
部署测试应用
- 部署测试应用,并将 pod 数量调整到 20。
oc new-project hello
oc new-app openshift/hello-openshift
oc scale --replicas=20 deployment/hello-openshift
- 执行命令,确认 pod 是分布在 3 个 worker 节点中运行的。
oc get pod -o wide
关闭一个 Machine
- 根据《OpenShift 4 - 5 分钟自动替换 OpenShift 集群故障节点 》,先通过机器集减少一个 worker 机器,完成后再增加一个 worker 机器。
- 执行命令,确认 pod 已经分布在 2 个 worker 节点中运行了。
oc get pod -o wide | grep Running
安装配置 Kube Deschedule Operator
- 进入 OpenShift 控制台的 “管理”-“命名空间” 菜单,新建 openshift-kube-descheduler-operator 命名空间。
- 在 OpenShift 的 OpeartorHub 中找到 Kube Descheduler Operator,然后将其安装到 openshift-kube-descheduler-operator 项目中。
- 在安装好的 Kube Descheduler Operator 中创建一个 Kube Descheduler 实例,将 Descheduling Interval Seconds 设为 300,Profiles 设为 TopologyAndDuplicates(可以让 pod 尽量分布在所有允许的节点上)。
- 可以查看这个新建的 Kube Descheduler 实例包括的 Kubernetes 对象。
确认重新调度结果
反复执行以下命令,最后确认 pod 再次运行在 3 个 worker 节点中了。
oc get pod -o wide
演示视频
参考
https://www.qikqiak.com/post/k8s-cluster-balancer/
https://github.com/kubernetes-sigs/descheduler