K8S调度
一、List-Watch 机制
controller-manager、scheduler、kubelet 通过 List-Watch 机制监听 apiserver 发出的事件,apiserver 通过 List-Watch 机制监听 etcd 发出的事件
1.scheduler 的调度策略
预选策略/预算策略:通过调度算法过滤掉不满足条件的Node节点,如果没有满足条件的Node节点,Pod会处于Pending状态,直到有符合条件的Node节点出现
PodFitsResources、PodFitsHost、PodFitsHostPorts、PodSelectorMatches、NoDiskConflict
优选策略:根据优先级选项为满足预选策略条件的Node节点进行优先级权重排序,最终选择优先级最高的Node节点来调度Pod
LeastRequestedPriority、BalancedResourceAllocation、ImageLocalityPriority
二、如何将Pod调度到指定节点
1)使用 nodeName 字段指定 Node节点名称
2)使用 nodeSelector 指定 Node节点的标签
3)使用 节点/Pod 亲和性
4)使用 污点+容忍
1.标签的管理
kubectl label <资源类型> <资源名称> 标签key=标签value ##设置标签
kubectl label <资源类型> <资源名称> 标签key=标签value --overwrite ##修改标签
kubectl label <资源类型> <资源名称> 标签key- ##删除标签kubectl get <资源类型> <资源名称> --show-labels ##展示资源名称下的所有标签
kubectl get <资源类型> -l 标签key[=标签value] ##列出符合条件的标签下的资源
2.亲和性
2.1节点亲和性
节点亲和性(nodeAffinity):匹配指定的Node节点标签,将要部署的Pod调度到满足条件的Node节点上
2.2Pod亲和性
拓扑域:具有相同标签的node节点
Pod亲和性(podAffinity):匹配指定的Pod标签,将要部署的Pod调度到与指定Pod所在的Node节点处于 同一个拓扑域 的Node节点上
Pod反亲和性(podAntiAffinity):匹配指定的Pod标签,将要部署的Pod调度到与指定Pod所在的Node节点处于 不同的拓扑域 的Node节点上
2.3亲和性的策略
硬策略(required....):要强制性的满足指定条件,如果没有满足条件的Node节点,Pod会处于Pending状态,直到有符合条件的Node节点出现软策略(preferred....):非强制性的,会优先选择满足条件的Node节点调度,即使没有满足条件的Node节点,Pod依然会完成调度
3.污点(taint)
3.1配置
kubectl taint node <node名称> key=value:effecteffect支持的选项NoSchedule(一定不会被调度)
PreferNoSchedule(尽量不被调度)
NoExecute(不会被调度,并驱逐节点上的Pod)
3.2污点删除
kubectl taint node <node名称> key[=value:effect]-
3.3查看节点有哪些污点
kubectl describe nodes <node名称> | grep Taints
4.容忍 (tolerations)
4.1配置
spec:tolerations:- key: 污点键名operator: Equal|Existsvalue: 污点键值effect: NoSchedule|PreferNoSchedule|NoExecute
5.不可调度(cordon)
kubectl cordon <node名称> ##设置为不可调度kubectl uncordon <node名称> ##解除不可调度
6.不可调度 + 驱逐(drain)
kubectl drain <node名称> --ignore-daemonsets --delete-emptydir-data --force
7.Pod的启动过程
1)通过 scheduler 根据调度算法选择一台在最适合的 Node节点运行 Pod
2)拉取镜像
3)挂载 存储卷 等
4)创建并运行容器
5)根据容器的探针探测结果设置 Pod 状态
8.Pod的生命周期
生命周期状态 | 说明 |
---|---|
Pending | Pod已经创建,但是处于包括Pod还未完成调度到Node节点的过程或者处于镜像拉取过程中、存储卷挂载失败等情况 |
Running | Pod中至少有一个容器正在运行 |
Succeeded | Pod中的所有容器都已经成功退出,且不再重启。(Completed) |
Failed | Pod中的所有容器都已终止,且至少有一个容器异常退出。(Error) |
Unknown | Master节点的 controller-manager 无法获取 Pod 的状态,通常是因为 Master节点与 Pod 所在的 Node 节点通信失联导致的 |
Pod遵循预定义的生命周期,起始于Pending阶段,如果至少其中有一个主要容器正常启动,则进入Running阶段,之后取决于Pod中是否有容器以失败状态结束而进入Succeeded或者Failed阶段。
三、K8S中排障方法
kubectl get pods 查看Pod运行状态
kubectl describe <资源类型|pods> <资源名称> 查看资源的详细信息和事件
kubectl logs <pod名称> [-c <容器名>] [-p] 查看容器的进程日志
kubectl exec -it <pod名称> [-c <容器名>] sh|bash 进入Pod容器,查看容器内部相关状态信息
kubectl debug -it <pod名称> --image=<临时容器的镜像名> --target=<目标容器> 在Pod中创建临时容器进入目标容器进行调试在Pod容器的宿主机使用nsenter转换网络等命名空间,直接在宿主机进入目标容器的命名空间进行调试
查看k8s集群中相关信息
kubectl get nodes 查看Node节点的运行状态
kubectl get cs 查看Master组件的状态
kubectl cluster-info 查看集群信息journalctl -u kubelet -f 跟踪查看Kubelet进程日志
看k8s集群中相关信息
kubectl get nodes 查看Node节点的运行状态
kubectl get cs 查看Master组件的状态
kubectl cluster-info 查看集群信息journalctl -u kubelet -f 跟踪查看Kubelet进程日志