CKA认证 | Day5 K8s调度

第五章 Kubernetes调度

1、创建一个Pod的工作流程

Kubernetes基于 list-watch 机制的控制器架构,实现组件间交互 的解耦。

其他组件监控自己负责的资源,当这些资源发生变化时,kube-apiserver会通知这些组件,这个过程类似于发布与订阅。

工作流程详解:

① 首先用户通过 Kubectl 提交创建 Pod 的 Yaml 的文件,向Kubernetes 系统发起资源请求,该资源请求被提交到 Kubernetes 系统中,由 APIServer 负责接收客户端发送的“POST” 创建 Pod 请求。

② APIServer 接收到请求后把创建 Pod 的信息存储到 Etcd 中,从集群运行那一刻起,资源调度系统 Scheduler 就会定时去监控 APIServer。

③ 通过 APIServer 得到创建 Pod 的信息,Scheduler 采用 watch 机制,一旦 Etcd 存储 Pod 信息成功便会立即通知 APIServer,APIServer会立即把Pod创建的消息通知Scheduler,Scheduler发现 Pod 的属性中 Dest Node 为空时(Dest Node=””)便会立即触发调度流程进行调度。而这一个创建Pod对象,在调度的过程当中有3个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点

  1. 节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
  2. 节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
  3. 节点选定:从优先级排序结果中挑选出优先级最高的节点运行Pod,当这类节点多于1个时,则进行随机选择

 

2、Pod中影响调度的主要属性

① 资源请求和限制(resources):

定义了 CPU 和内存的请求和限制,确保调度器能够根据资源需求选择合适的节点。

② 节点选择器(nodeSelector):

指定了 Pod 应该调度到带有 disktype=ssd 标签的节点上。

③ Pod 反亲和性(podAntiAffinity):

定义了 Pod 应该尽量避免调度到同一个节点上的其他相同标签的 Pod,以提高可用性。

④ 污点容忍(tolerations):

定义了 Pod 可以容忍带有特定污点的节点,允许 Pod 调度到这些节点上。

YAML示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
...
     containers:
     - image: lizhenliang/java
-demo
       name: java
-demo
       imagePullPolicy: Always
       livenessProbe:
         initialDelaySeconds: 30
         periodSeconds: 20
         tcpSocket:
            port: 8080
       resources: {}                     //资源调度依据
     restartPolicy: Always
     ## 调度策略 
     schedulerName: default-scheduler    //调度器
     nodeName: ""    
     nodeSelector: {}                    //标签选择器
     affinity: {}                        //亲和性
     tolerations: []                     //污点容忍

3、资源限制对Pod调度的影响

1)容器资源限制:

  • resources.limits.cpu
  • resources.limits.memory

2)容器使用的最小资源需求,作为容器调度时资源分配的依据:

  • resources.requests.cpu
  • resources.requests.memory

K8s会根据Request的值去查找有足够资源的Node来调度此Pod

补充:CPU单位:可以写m(毫核)也可以写浮点数,例如0.5=500m,1=1000m


例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: web
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        срu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

备注:可以通过查看节点的详细描述,来得知是否还有资源可供分配

[root@k8s-master-1-71 ~]# kubectl describe node
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests     Limits
  --------           --------     ------
  cpu                350m (8%)    0 (0%)
  memory             200Mi (11%)  0 (0%)
  ephemeral-storage  0 (0%)       0 (0%)
  hugepages-1Gi      0 (0%)       0 (0%)
  hugepages-2Mi      0 (0%)       0 (0%)
...

总结:

  1. 容器资源请求值(requests) :告诉k8s最小分配的资源,分配的节点必须能够满足requests指定的值;否则将无法进行正常调度;
  2. 容器资源限制值(limits) :允许最大的使用资源;
  3. requests 必须小于 limits, 建议一个理论值:requests值小于limits的20%-30%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小安运维日记

Hey~ 感谢您的充电支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值