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 反亲和性策略,来实现精细化的调度控制。

相关推荐
稚辉君.MCA_P8_Java1 小时前
豆包 Java的23种设计模式
java·linux·jvm·设计模式·kubernetes
rannn_1112 小时前
【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
笔记·后端·学习·mysql
天上掉下来个程小白2 小时前
Docker-14.项目部署-DockerCompose
运维·docker·微服务·容器
喜欢吃燃面3 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
传奇开心果编程3 小时前
【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
python·学习·ui·前端框架·自动化
星霜笔记6 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb
数据知道8 小时前
容器化部署:用Docker封装机器翻译模型与服务详解
docker·容器·机器翻译
_Kayo_9 小时前
node.js 学习笔记3 HTTP
笔记·学习
CCCC131016312 小时前
嵌入式学习(day 28)线程
jvm·学习
星星火柴93613 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法