K8S调度

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的生命周期

生命周期状态 说明
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进程日志
相关推荐
zfoo-framework21 小时前
docker compose安装gitea实现公司内部开发git私有仓库
docker·容器·gitea
无巧不成书021821 小时前
基于WSL 2的Docker远程开发全栈实战指南
运维·docker·容器·docker desktop·wsl 2·vs code远程开发·容器化开发
Renhao-Wan21 小时前
Docker 核心原理详解:镜像、容器、Namespace、Cgroups 与 UnionFS
java·后端·docker·容器
Eloudy21 小时前
docker pull ubuntu:22.04 失败的解决记录
运维·docker·容器
taWSw5OjU1 天前
Docker] Docker中`overlay2`磁盘占用爆满的清理方案
docker·容器·eureka
Ashmcracker1 天前
Azure Key Vault 证书如何在 AKS 中同步为 Kubernetes Secret?附权限配置与 YAML 示例
kubernetes·flask·azure
掘根2 天前
【微服务即时通讯项目】系统联调
微服务·云原生·架构
DONG9992 天前
配置docker代理
docker·容器
怎么就重名了2 天前
docker可以动态修改端口映射吗
运维·docker·容器
JEECG低代码平台2 天前
敲敲云零代码平台一键部署实战:命令安装 vs Docker 安装
运维·docker·容器