第五章 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个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点
- 节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
- 节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
- 节点选定:从优先级排序结果中挑选出优先级最高的节点运行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%)
...
总结:
- 容器资源请求值(requests) :告诉k8s最小分配的资源,分配的节点必须能够满足requests指定的值;否则将无法进行正常调度;
- 容器资源限制值(limits) :允许最大的使用资源;
- requests 必须小于 limits, 建议一个理论值:requests值小于limits的20%-30%