金鱼哥RHCA回忆录:DO280管理应用部署--pod调度控制
🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
📜pod调度控制
📑pod调度算法
pod调度程序确定新pod在OpenShift集群中的节点上的位置。该调度算法被设计为可高度配置和适应不同集群。OCP 3.9附带的默认配置通过使用node label、affinity rules,anti-affinity rules中的定义来支持zone和regions的调用。
在OCP以前的版本中,安装程序master节点标记为污点标记,表示不允许在master上部署pod。在新版的OCP 3.9中,在安装和升级过程中,master会自动标记为可调度的。使得可以通过deploy调度pod至maste节点。而不仅仅是作为master的组件运行。
默认节点selector是在安装和升级期间默认设置的。它被设置为node-role.kubernetes.io/compute=true
,除非使用osm_default_node_selector
的Ansible变量覆盖它。
在安装和升级期间,不管osm_default_node_selector配置如何,都会对库存文件中定义的主机执行以下自动标记。
compute节点配置non-master、non-dedicated的角色(默认情况下,具有region=infra标签的节点),节点使用node-role.kubernetes.io/compute=true
标记。
master节点被标记为node-role.kubernetes.io/master=true
,从而分配master节点角色。
📑调度算法步骤
- 过滤节点
调度程序根据节点资源(如主机端口)的可用性筛选正在运行的节点列表,然后进一步根据节点selector和来自pod的资源请求筛选。最终的缩小是可运行pod的候选node列表。
pod可以定义与集群节点中的标签匹配的节点选择器,标签不匹配的节点视为不合格。
pod还可以为计算资源(如CPU、内存和存储)定义资源请求,没有足够的空闲计算机资源的节点视为不合格。
- 对过滤后的节点列表进行优先级排序
候选节点列表使用多个优先级标准进行评估,这些标准加起来就是权重,权重值较高的节点更适合运行pod。
其中有affinity(亲和规则)和anti-affinity(反亲和规则),pod亲和力较高的节点得分较高,而anti-affinity较高的节点权重低。
affinity的一个常见用法是:出于性能原因,将相关的pod安排得彼此亲和。例如,需要保持彼此同步的pod使用相同的网络栈。
anti-affinity的一个常见用法是:为了获得高可用性,将相关的pod安排的尽量分散。例如,避免将所有pod从同一个应用程序调度到同一个节点。
- 选择最合适的节点。
根据权重对候选列表进行排序,并选择权重最高的节点来承载pod。如果多个节点得分相同,则随机选择一个节点。
调度程序配置文件位于/etc/original/master/scheduler.json,其定义了一组predicates,用作过滤器或优先级函数。通过这种方式,可以将调度程序配置为支持不同的集群。
📑调度拓扑
对于大型数据中心,例如云提供商,一个常见的拓扑结构是将主机组织成regions和zones:
region:是一个地理区域内的一组主机,这保证了它们之间的内网高速连接;
zone:也称为可用区,是一组主机,它们可能一起失败,因为它们共享公共的关键基础设施组件,比如网络、存储或电源。
OpenShift pod调度器可支持根据region和zone标签在集群内调度,如:
-
从相同的RC创建的或从相同的DC创建的pod副本调度至具有相同region标签值的节点中运行。
-
副本Pod调位至具有不同zone标签的节点中运行。
实例图如下:
要实现上图中的样例拓扑,可以使用集群管理员通过以下命令oc label:
$ oc label node1 region=us-west zone=power1a --overwrite
$ oc label node node2 region=us-west zone=power1a --overwrite
$ oc label node node3 region=us-west zone=power2a --overwrite
$ oc label node node4 region=us-west zone=power2a --overwrite
$ oc label node node5 region=us-east zone=power1b --overwrite
$ oc label node node6 region=us-east zone=power1b --overwrite
$ oc label node node7 region=us-east zone=power2b --overwrite
$ oc label node node8 region=us-east zone=power2b --overwrite
每个节点必须由其完全限定名(FQDN)标识,为了简洁,如上命令使用了简短的名称。
对区域标签的更改需要–overwrite选项,因为OCP 3.9高级安装方法默认情况下使用region=infra标签配置节点。
示例:要检查分配给节点的标签,可以使用oc get node命令和–show-labels选项。
$ oc get node node1.lab.example.com --show-labels
注意,一个节点可能有一些OpenShift分配的默认标签,包含kubernetes.io后缀键值的标签,此类标签不应由集群管理员人为更改,因为它们由调度程序在内部使用。
集群管理员还可以使用-L选项来确定单个标签的值。
示例:
$ oc get node node1.lab.example.com -L region
$ oc get node node1.lab.example.com -L region -L zone #支持oc get跟多个-L选项
📑UNSCHEDULABLE节点
有时候,集群管理员需要关闭节点进行维护,如节点可能需要硬件升级或内核安全更新。要在对OpenShift集群用户影响最小的情况下关闭节点,管理员应该遵循两个步骤。
将节点标记为不可调度,从而防止调度程序向节点分配新的pod。
$ oc adm manage-node --schedulable=false node2.lab.example.com
Drain节点,这将销毁在pod中运行的所有pod,并假设这些pod将通过DC在其他可用节点中会重新创建。
$ oc adm drain node2.lab.example.com
维护操作完成后,使用oc adm management -node命令将节点标记为可调度的。
$ oc adm manage-node --schedulable=true node2.lab.example.com
📑控制pod位置
有些应用程序可能需要在一组指定的node上运行。例如,某些节点为某些类型的工作负载提供硬件加速,或者集群管理员不希望将生产应用程序与开发应用程序混合使用。此类需求,都可以使用节点标签和节点选择器来实现。
node selector是pod定义的一部分,但建议更改dc,而不是pod级别的定义。要添加节点选择器,可使用oc edit命令或oc patch命令更改pod定义。
示例:配置myapp的dc,使其pods只在拥有env=qa标签的节点上运行。
$ oc patch dc myapp --patch '{"spec":{"template":{"nodeSelector":{"env":"qa"}}}}'
此更改将触发一个新的部署,并根据新的节点选择器调度新的pod。
如果集群管理员不希望让开发人员控制他们pod的节点选择器,那么应该在项目资源中配置一个默认的节点选择器。
📑管理默认项目
生产环境一个常见实践是指定一组节点来运行OCP的系统基础Pod,比如route和内部仓库。这些pod在默认项目中定义。
通常可通过以下两个步骤实现:
-
使用region=infra标签标记专用节点;
-
为缺省名称空间配置缺省节点选择器。
要配置项目的默认节点选择器,可使用openshift.io/node-selector
键值向名称空间资源添加注释。可以使用oc edit或oc annotate命令。
$ oc annotate --overwrite namespace default \
openshift.io/node-selector='region=infra'
OCP 3.9 quick installer和advanced installer的Ansible playbook都支持Ansible变量,这些变量控制安装过程中分配给节点的标签,也控制分配给每个基础设施pod的节点选择器。
安装OCP子系统(如metrics子系统)的剧本还支持这些子系统节点选择器的变量。
📜课本练习
📑环境准备
[student@workstation ~]$ lab install-prepare setup
[student@workstation ~]$ cd /home/student/do280-ansible
[student@workstation do280-ansible]$ ./install.sh
提示:若已经拥有一个完整环境,可不执行。
📑本练习准备
[student@workstation ~]$ lab schedule-control setup
[student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
📑查看region
[student@workstation ~]$ oc get nodes -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 6d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 infra
node2.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 infra
📑创建project
[student@workstation ~]$ oc new-project schedule-control
📑创建应用
[student@workstation ~]$ oc new-app --name=hello \
--docker-image=registry.lab.example.com/openshift/hello-openshift
📑扩展应用
[student@workstation ~]$ oc scale dc hello --replicas=5
deploymentconfig "hello" scaled
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-1-4rg68 1/1 Running 0 4s 10.129.1.2 node2.lab.example.com
hello-1-g8jhl 1/1 Running 0 4s 10.129.1.3 node2.lab.example.com
hello-1-jcnxg 1/1 Running 0 4s 10.128.0.191 node1.lab.example.com
hello-1-tqbcs 1/1 Running 0 58s 10.128.0.190 node1.lab.example.com
hello-1-v7ghf 1/1 Running 0 4s 10.129.1.1 node2.lab.example.com
📑修改节点label
[student@workstation ~]$ oc label node node2.lab.example.com region=apps --overwrite=true
[student@workstation ~]$ oc get nodes -L region #确认修改
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 6d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 infra
node2.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 apps
📑导出dc
[student@workstation ~]$ oc get dc hello -o yaml > dc.yaml
📑修改node2调度策略
添加dc.yaml中的调度策略,使pod调度至apps标签的node。
[student@workstation ~]$ vim dc.yaml
……
template:
……
spec:
nodeSelector: #添加节点选择器
region: apps
……
📑应用更新
[student@workstation ~]$ oc apply -f dc.yaml
📑确认验证
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-2-4h79l 1/1 Running 0 29s 10.129.1.8 node2.lab.example.com
hello-2-7kx6k 1/1 Running 0 31s 10.129.1.7 node2.lab.example.com
hello-2-7kz6r 1/1 Running 0 33s 10.129.1.6 node2.lab.example.com
hello-2-jptzf 1/1 Running 0 33s 10.129.1.5 node2.lab.example.com
hello-2-rwjkw 1/1 Running 0 29s 10.129.1.9 node2.lab.example.com
# 验证是否触发了新的部署,并等待所有新的应用pod都准备好并运行。所有5个pod都应该调度至node2。
📑修改node1调度策略
[student@workstation ~]$ oc label node node1.lab.example.com region=apps --overwrite=true
[student@workstation ~]$ oc get node -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 2d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 2d v1.9.1+a0ce1bc657 apps
node2.lab.example.com Ready compute 2d v1.9.1+a0ce1bc657 apps
📑终止node2
[student@workstation ~]$ oc adm manage-node --schedulable=false node2.lab.example.com
NAME STATUS ROLES AGE VERSION
node2.lab.example.com Ready,SchedulingDisabled compute 6d v1.9.1+a0ce1bc657
📑删除pod
删除node2的pod,并使用node1创建的pod替换。
[student@workstation ~]$ oc adm drain node2.lab.example.com --delete-local-data
📑查看pod
[student@workstation ~]$ oc get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-2-6bzn5 1/1 Running 0 35s 10.128.0.194 node1.lab.example.com
hello-2-88drl 1/1 Running 0 35s 10.128.0.196 node1.lab.example.com
hello-2-b8255 1/1 Running 0 35s 10.128.0.197 node1.lab.example.com
hello-2-kfcgq 1/1 Running 0 35s 10.128.0.193 node1.lab.example.com
hello-2-kkrff 1/1 Running 0 35s 10.128.0.195 node1.lab.example.com
📑清除实验并还原
[student@workstation ~]$ oc adm manage-node --schedulable=true node2.lab.example.com
[student@workstation ~]$ oc label node node1.lab.example.com region=infra --overwrite=true
[student@workstation ~]$ oc label node node2.lab.example.com region=infra --overwrite=true
[student@workstation ~]$ oc get nodes -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 6d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 infra
node2.lab.example.com Ready compute 6d v1.9.1+a0ce1bc657 infra
[student@workstation ~]$ oc delete project schedule-control
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第七章 DO280管理应用部署–pod调度控制 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)