调度算法

在这里插入图片描述


node标签

# 查看节点标签
kubectl get node --show-labels=true

# 添加标签 key=value
kubectl label nodes node1 node=node1

# 去除标签 key-
kubectl label nodes node1 node-

node标签选择器

如果同时指定了 nodeSelectornodeAffinity,两者必须都要满足, 才能将 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-节点亲和性

K8S高级调度方式

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

pod 亲和性 的示例

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)。

Logo

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

更多推荐