k8s学习--如何控制pod调度的位置

文章目录

····

在 Kubernetes (K8s)中,Pod 是应用运行的最小单位,而控制 Pod 的调度位置对于应用的性能、可用性和资源利用率有着重要影响。在这篇博客中,将展示通过多种策略和机制来控制 Pod 在集群中的调度位置,以满足特定的业务需求。

一、Pod 调度基础

Kubernetes 集群由多个节点组成,每个节点运行着一个 kubelet 进程,负责管理该节点上的容器。Kubernetes 的调度器(Scheduler)根据资源需求、策略约束等因素,决定将 Pod 调度到哪个节点上。

在默认情况下,Kubernetes 调度器会根据节点的资源可用性、负载情况以及调度策略来自动选择最佳节点。然而,实际应用中,我们通常需要对 Pod 的调度进行更加细粒度的控制,以确保应用的性能和稳定性。

二、通过节点选择器 (Node Selector) 控制调度

节点选择器是最简单的一种调度控制方式。它允许你指定 Pod 只能调度到具备特定标签的节点上。你可以在 Pod 的配置文件中使用 nodeSelector 字段来定义这个约束条件。

添加节点标签

复制代码
kubectl label nodes node2 disk=ssd

上述命令会给 node2 添加一个标签

示例:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-name
spec:
  containers:
  - name: container-name
    image: nginx
  nodeSelector:
    disktype: ssd

在上面的示例中,Pod 将只会被调度到带有标签 disktype=ssd 的节点上。

三、使用节点亲和性 (Node Affinity)

节点亲和性是比节点选择器更灵活的调度策略。它允许你定义软约束和硬约束,以控制 Pod 的调度。节点亲和性通过 nodeAffinity 字段来配置。

示例:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-name
spec:
  containers:
  - name: container-name
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - us-west-1

在这个示例中,requiredDuringSchedulingIgnoredDuringExecution 定义了硬约束条件,Pod 只能调度到 disktype=ssd 的节点上。而 preferredDuringSchedulingIgnoredDuringExecution 定义了软约束条件,尽量将 Pod 调度到 zone=us-west-1 的节点上,但如果没有合适的节点,调度器会忽略这个条件。

四、使用污点和容忍 (Taints and Tolerations)

污点和容忍是一种更为强大的机制,用于控制哪些 Pod 可以调度到某些节点。节点可以设置污点(Taint),只有带有相应容忍(Toleration)的 Pod 才能被调度到该节点。

示例:

复制代码
kubectl taint nodes node1 key=value:NoSchedule

上述命令会给 node1 添加一个污点,使得没有容忍该污点的 Pod 无法被调度到 node1 上。

在 Pod 配置文件中添加容忍:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-name
spec:
  containers:
  - name: container-name
    image: nginx
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"

在这个例子中,Pod 具有了容忍性,可以调度到带有 key=value:NoSchedule 污点的节点上。

五、Pod 反亲和性 (Pod Anti-Affinity)

Pod 反亲和性策略允许你避免将特定的 Pod 调度到相同节点或拓扑域上,以提高高可用性。使用 podAntiAffinity 字段可以配置反亲和性。

示例:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-name
spec:
  containers:
  - name: container-name
    image: nginx
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - my-app
        topologyKey: "kubernetes.io/hostname"

这个配置确保了具有相同 app=my-app 标签的 Pod 不会被调度到相同的主机上,从而提高应用的容错性。

总结

控制 Kubernetes Pod 的调度位置是一个重要的实践,通过合理的调度策略可以提高集群的资源利用率、应用的高可用性和性能。在实际应用中,可以根据具体的业务需求,综合使用节点选择器、节点亲和性、污点与容忍、以及 Pod 反亲和性策略,来实现精细化的调度控制。

相关推荐
该用户已躺平@16 小时前
并网逆变器学习笔记11---并网逆变器学习---SSRF-PLL、DDSRF-PLL、DSOGI-PLL快速上手(结合deepseek脚本快速生成)
笔记·学习
海兰16 小时前
手把手elasticsearch学习之构建 HITL AI 代理
人工智能·学习·elasticsearch
qq_4523962316 小时前
第七篇:《Docker 存储:Volume、Bind Mount 与 tmpfs》
运维·docker·容器
和blue一起变得更好16 小时前
day4 element plus+vue3+vite实现简单学习任务管理
javascript·vue.js·学习
爱喝水的鱼丶17 小时前
SAP-ABAP:条件判断与循环控制语句(7篇)第七篇:性能优化:条件与循环代码的常见性能瓶颈与优化方案
学习·算法·性能优化·sap·abap
tellmewhoisi1 天前
项目部署docker(指令解析和docker-compose基础指令)
docker·容器
dinl_vin1 天前
FastAPI 系列 ·(十二):生产部署——Docker + 配置管理(系列完结)
docker·容器·fastapi
小新同学^O^1 天前
简单学习 --> 模型参数
学习·llm·大模型参数
cdbqss11 天前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb
吃好睡好便好1 天前
创建魔方矩阵和单位矩阵
开发语言·人工智能·学习·线性代数·matlab·矩阵