k8s节点调度
设置指定的node为不可用# 查看node状态kubectl get nodes# 将node标记为不可调度状态kubectl cordon node名# drain清空node## --delete-local-data 清空本地数据## --ignore-daemonsets 忽略daemonsets错误## --force 强制执行kubectl drain node名 --delete-l
k8s节点调度
调度算法

node标签
# 查看节点标签
kubectl get node --show-labels=true
# 添加标签 key=value
kubectl label nodes node1 node=node1
# 去除标签 key-
kubectl label nodes node1 node-
node标签选择器
如果同时指定了 nodeSelector 和 nodeAffinity,两者必须都要满足, 才能将 Pod 调度到候选节点上。
如果指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,满足一个 nodeSelectorTerms ,pod将可以调度到节点上。
指定了多个与 nodeSelectorTerms 关联的 matchExpressions,满足所有 matchExpressions ,Pod 才会可以调度到节点上。
由于IgnoredDuringExecution,改变labels不会影响已运行的pod.

nodeSelector
参考: 将 Pod 分配给节点
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
# 选择node标签为disktype=ssd的node
nodeSelector:
disktype: ssd
Node亲和性调度affinity
理解 Kubernetes 的亲和性调度
官方doc-节点亲和性
requiredDuringSchedulingIgnoredDuringExecution: 硬策略/硬需求–必须满足preferredDuringSchedulingIgnoredDuringExecution: 软策略/软需求–尽量满足
支持的操作符有:In , 包含NotIn , 不包含,一般用来做反亲和(Anti-Affinity)Exists , 存在DoesNotExist ,不存在Gt , (greater than), label 的值大于某个值,int类型Lt , (less than),label 的值小于某个值,int类型
name in( redis-master, redis-salve)# 匹配所有带有标签name=master或者name=salve的资源
name not in ( php)#匹配所有不具有标签name=php的资源对象
亲和度示例yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp
spec:
# 亲和性
affinity:
# 节点亲和度
nodeAffinity:
# 硬策略/硬需求
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# 匹配所有带有标签disktype=ssd或者disktype=shd的资源
- key: disktype
operator: In
values:
- ssd
- shd
# 软策略/软需求(尽量匹配标签的资源,不满足时会找其他的资源)
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 权重值/(加分项,1-100,100是最高分),能提高匹配概率,不用太关注
preference: # 固定语法,意为偏爱
matchExpressions:
# 尽可能匹配标签为disktye=ssd2的资源
- key: disktype
operator: In
values:
- ssd2
containers:
- name: myapp
image: <Image>
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: <Port>
nodeName
参考: pod 调度到一个指定节点
nodeName不会通过调度器,即使node有污点也能直接运行pod.一般用于测试.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
nodeName: node1 # 让pod运行在指定node上,nodeName不会通过调度器
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
node调度故障诊断排查
# 显示给定节点的度量值
kubectl top node my-node
# 显示主控节点和服务的地址
kubectl cluster-info
# 将当前集群状态转储到标准输出
kubectl cluster-info dump
# 将当前集群状态输出到 /path/to/cluster-state
kubectl cluster-info dump --output-directory=/path/to/cluster-state
常见调度失败原因
- CPU不足
- 没有匹配到节点标签
- 所有的节点有污点,但你没有配置污点容忍
pod一直是pending
参考: https://cloud.tencent.com/document/product/457/42948
当Pod处在Pending的时候,可能是由于如下哪个问题造成的。
资源不足,造成无法调度;
Pod尚未进入调度阶段;
Pod正在拉取镜像;
看kubelet日志.
# 查看pod详情
kubectl describe po pod名
## 显示pod已经调度到node2,但一直是pending
查看node资源是否足够
# 查看node资源是否足够
kubectl describe node <node-name>
# 或kubectl top node
在返回信息中,请注意关注以下内容:Allocatable:表示此节点能够申请的资源总和。Allocated resources:表示此节点已分配的资源(Allocatable 减去节点上所有 Pod 总的 Request)。
更多推荐



所有评论(0)