金鱼哥RHCA回忆录:DO280管理应用部署--pod调度控制

举报
金鱼哥 发表于 2022/08/28 22:48:05 2022/08/28
【摘要】 第七章 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在默认项目中定义。

通常可通过以下两个步骤实现:

  1. 使用region=infra标签标记专用节点;

  2. 为缺省名称空间配置缺省节点选择器。

要配置项目的默认节点选择器,可使用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 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。