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:effect

effect支持的选项

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|Exists
    value: 污点键值
    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的生命周期

生命周期状态说明
PendingPod已经创建,但是处于包括Pod还未完成调度到Node节点的过程或者处于镜像拉取过程中、存储卷挂载失败等情况
RunningPod中至少有一个容器正在运行
SucceededPod中的所有容器都已经成功退出,且不再重启。(Completed)
FailedPod中的所有容器都已终止,且至少有一个容器异常退出。(Error)
UnknownMaster节点的 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进程日志
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐