标签Labels、Scheduler:调度器、k8s污点与容忍度

labels用于标识和选择 Kubernetes 对象(如 Pod、Deployment、Service、Namespace 等)的键值对

用途:

①分类和组织

②筛选和管理

③自动化操作

使用方法:

①创建资源时,添加标签

通过标签名,筛选pod

kubectl get pod -l app=pod-1

kubectl get pod -l app,env
apiVersion: v1

kind: Pod

metadata:

name: my-pod

labels:

app: my-app

environment: production

spec:

containers:

  • name: my-container

image: nginx

②在资源运行时,添加或修改标签

添加标签

kubectl label pod myapp-2-b6f89777f-r5n7x server=nginx

删除标签

kubectl label pod myapp-2-b6f89777f-r5n7x server-

重新添加标签

kubectl label pod myapp-2-b6f89777f-r5n7x server=apache
apiVersion: apps/v1

kind: Deployment

metadata:

name: my-deployment

spec:

replicas: 3

selector: #标签选择器

matchLabels: #通过键值对绑定标签

app: my-app #需要管理Pod的标签

template: #创建Pod的模板,通过Deployment自动创建Pod

metadata:

labels:

app: my-app #Pod的标签,用于被筛选和管理

spec:

containers:

  • name: my-container

image: nginx

查看一个pod的标签

kubectl describe pod myapp-2-b6f89777f-r5n7x / grep Labels

查看所有pod的标签

kubectl get pod --show-labels

Scheduler:调度器

在创建运行pod时,用于将Pod的创建请求绑定到Pode节点上;

可以满足调度的公平、高效、灵活;

调度过程:

1.过滤掉不满足条件的节点,预选(predicate)

2.按照节点的优先级排序,优选(priority)

3.选择优先级最高的node节点

调度方法:

1.自动调度:Scheduler经过一系列的算法计算得出最优节点;

2.定向调度:

NodeName:指定Node名称进行调度;

NodeSelector:通过Node标签进行选择调度

3.亲和性调度:

NodeAffinity (节点亲和度)

PodAffinity (Pod亲和度)

PodAntiAffinity (Pod反亲和性)

4.污点与容忍度:

Taints 给Node节点打上污点,需要容忍度才能调度

Toleration 在Pod上设置容忍度,才能运行在有污点的Node上

固定调度案例:

apiVersion: apps/v1

kind: Deployment

metadata:

name: myweb

spec:

selector:

matchLabels:

app: myweb

replicas: 6

template:

metadata:

labels:

app: myweb

spec:

nodeName: node-1 #通过指定nodeName,实现固定调度

containers:

  • name: myweb

image: docker.io/nginx

ports:

  • containerPort: 80

污点与容忍度

如果Node节点上有污点,需要Pod有容忍度才能调度运行

污点的三种级别:

NoSchedule:没有容忍的Pod不能新建,已经运行的Pod不受影响;(第二级别)

PreferNoSchedule:没有容忍的Pod尽量不要创建,如果没有其他节点可以选择,也能创建;(最小级别)

NoExecute:驱逐所有Pod应用;(最高级别)

给node打污点:

创建污点

kubectl taint nodes node01 key=value:effect (关键字:taint)

删除污点

kubectl taint nodes node01 key-

给pod添加容忍度:

在 Kubernetes 中,Pod 的容忍度(Tolerations)用于允许 Pod 调度到带有污点(Taints)的节点上。污点和容忍度是 Kubernetes 中用于控制 Pod 调度的一种机制,允许你将某些 Pod 排除在某些节点之外,或者将某些 Pod 明确允许调度到特定的节点上。

1. 污点(Taints)和容忍度(Tolerations)的基本概念
  • 污点(Taints):是一种节点属性,用于阻止某些 Pod 调度到该节点上。污点由键(key)、值(value)和效果(effect)组成。

    • effect 的值可以是:

      • NoSchedule:不允许新的 Pod 调度到该节点,但已调度的 Pod 不受影响。

      • PreferNoSchedule:尽量避免将新的 Pod 调度到该节点,但不是强制的。

      • NoExecute:不允许新的 Pod 调度到该节点,并且会驱逐已存在的 Pod。

  • 容忍度(Tolerations):是一种 Pod 属性,用于允许 Pod 调度到带有特定污点的节点上。容忍度也由键(key)、值(value)和效果(effect)组成。

2. 给 Pod 添加容忍度

在 Pod 的定义中,可以通过 tolerations 字段来添加容忍度。以下是一个示例:

示例 Pod 定义
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  tolerations:
  - key: "node-type"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

在这个例子中:

  • keynode-type,表示容忍的污点键。

  • operatorEqual,表示键和值必须匹配。

  • valuegpu,表示容忍的污点值。

  • effectNoSchedule,表示容忍的污点效果。

3. 示例场景

假设你有一些节点带有以下污点:

复制代码
kubectl taint nodes node1 node-type=gpu:NoSchedule

如果没有添加容忍度,Pod 将无法调度到带有该污点的节点上。通过在 Pod 定义中添加上述容忍度,Pod 就可以被调度到带有 node-type=gpu:NoSchedule 污点的节点上。

4. 其他容忍度配置
a. 匹配所有污点

如果你希望 Pod 容忍所有类型的污点,可以使用以下配置:

复制代码
tolerations:
- operator: "Exists"
  effect: "NoSchedule"
b. 容忍特定效果

如果你只想容忍特定效果的污点,可以指定 effect

复制代码
tolerations:
- key: "node-type"
  operator: "Equal"
  value: "gpu"
  effect: "NoSchedule"
- key: "node-type"
  operator: "Equal"
  value: "gpu"
  effect: "PreferNoSchedule"
5. 动态添加容忍度

如果你已经创建了 Pod,但需要动态添加容忍度,可以通过修改 Pod 的 YAML 文件并重新应用来实现:

复制代码
kubectl get pod my-pod -o yaml > my-pod.yaml

编辑 my-pod.yaml 文件,添加 tolerations 部分,然后重新应用:

复制代码
kubectl apply -f my-pod.yaml
6. 注意事项
  • 污点和容忍度的匹配:Pod 的容忍度必须与节点的污点完全匹配(键、值和效果),才能允许调度。

  • 动态更新:动态更新 Pod 的容忍度可能需要重新调度 Pod,这可能会导致 Pod 的重启。

  • 多节点调度:如果多个节点带有相同的污点,Pod 仍然会根据其他调度策略(如资源需求)选择最适合的节点。

通过合理配置污点和容忍度,你可以更好地控制 Pod 的调度行为,优化资源利用和隔离策略。

相关推荐
岚天start2 小时前
KubeSphere在线安装单节点K8S集群
docker·容器·kubernetes·k8s·kubesphere·kubekey
xyhshen2 小时前
记录一次K8S跨命名空间访问 xxx.xxx.svc.cluster.local 类似内部服务不通的问题
云原生·容器·kubernetes
来来走走2 小时前
Android开发(Kotlin) 扩展函数和运算符重载
android·开发语言·kotlin
栗子~~2 小时前
shell-基于k8s/docker管理容器、监控模型训练所消耗的最大CPU与最大内存脚本
docker·容器·kubernetes
海鸥812 小时前
在k8s中部署seaweedfs,上传文件到seaweedfs方法
云原生·容器·kubernetes
半梦半醒*2 小时前
k8s——pod详解2
linux·运维·docker·容器·kubernetes·负载均衡
zz-zjx2 小时前
云原生LVS+Keepalived高可用方案(二)
开发语言·php·lvs
wuwu_q2 小时前
用通俗易懂 + Android 开发实战的方式,详细讲解 Kotlin Flow 中的 retryWhen 操作符
android·开发语言·kotlin
AAA小肥杨2 小时前
K8s从Docker到Containerd的迁移全流程实践
docker·容器·kubernetes