K8s: 在Pod中使用亲和性调度节点

用节点亲和性把 Pods 分配到节点

  • 在 K8s 集群中,如何使用节点亲和性把 Pod 分配到特定节点
  • 机器资源各不相同,配置不同,一些应用对配置有要求的需要部署到相关机器上
  • 应用场景
    • 场景1: 对读写性能要求较高的pod部署到安装ssd的机器上
    • 场景2: 把同一类型的应用部署到一起,比如 db 数据库类的
  • 列出集群中的节点及其标签:$ kubectl get nodes --show-labels
conf 复制代码
NAME         STATUS   ROLES                  AGE   VERSION   LABELS
master.k8s   Ready    control-plane,master   44h   v1.22.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.k8s,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node1.k8s    Ready    <none>                 44h   v1.22.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1.k8s,kubernetes.io/os=linux
node2.k8s    Ready    <none>                 44h   v1.22.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2.k8s,kubernetes.io/os=linux

1 )场景 1

  • 选择一个节点,给它添加一个标签:

  • $ kubectl label nodes <your-node-name> disktype=ssd

    • 这里 是你的一个节点名称,比如: node1.k8s
  • 验证你所选节点具有 disktype=ssd 标签:

    $ kubectl get nodes --show-labels

  • 依据强制的节点亲和性调度 Pod, 下面清单描述了一个 Pod

  • 它有一个节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution , disktype=ssd

  • 这意味着 pod 只会被调度到具有 disktype=ssd 标签的节点上

  • 亲和性有很多类型,这里是一种节点亲和性

  • 创建 affinity.yaml

    yaml 复制代码
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd 
      containers:
      - name: aff-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
  • $ kubectl create -f affinity.yaml

  • $ kubectl describe pod aff-nginx

  • 可以看到非常准确的部署到 设置了 distype=ssd 的那个节点机器上了

  • 如果有移除相关label, 参考: $ kubectl label nodes node2.k8s disktype-

2 )场景2: 将数据库类型的应用部署到 db 类型的节点上

  • 类似的,比如想要把某个数据库应用部署到 node2.k8s上,

  • 为 node2.k8s 设置 相应的 label, 如: $ kubectl label nodes node1.k8s type=db

  • 在 affinity.yaml 中

    yaml 复制代码
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: type
                operator: In
                values:
                - db
  • 这样,应用就会被部署到相应设置节点的机器上

相关推荐
蝎子莱莱爱打怪11 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
阿里云云原生4 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀4 天前
Docker部署Nacos
docker·容器
缓解AI焦虑4 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
阿里云云原生4 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生4 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生4 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生4 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
1candobetter4 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka