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
  • 这样,应用就会被部署到相应设置节点的机器上

相关推荐
张忠琳20 分钟前
【NPU】Ascend Docker Runtime v26.0.1 之二 runtime/process/process.go — 超深度逐行分析
云原生·容器·架构·kubernetes·npu·docker-runtime
Kevin Wang7274 小时前
Nvidia-AGX-spark部署手册——课堂质量诊断(jetpack:r36)
python·docker·容器
回眸不遇6 小时前
将 Docker虚拟磁盘文件ext.vhdx迁移出C盘 ,更换到D盘
c语言·docker·容器
雨辰AI7 小时前
K8s人大金仓主从高可用搭建|容器化集群自动同步+故障切换(生产完整版)
云原生·容器·kubernetes
潘正翔8 小时前
k8s基础_kubeadm搭建k8s集群
linux·运维·docker·云原生·容器·kubernetes
Echo flower8 小时前
Docker 容器中 Puppeteer 僵尸进程排查与修复
运维·docker·容器·puppeteer
潘正翔9 小时前
k8s进阶_Harbor镜像仓库
git·云原生·容器·kubernetes·gitee·github
江湖有缘9 小时前
Docker实战 | 使用Docker部署Donetick任务与家务管理应用
运维·docker·容器
乐启国际旅行社有限公司9 小时前
微服务高可用实战:Resilience4j熔断降级解决文旅节假日流量雪崩问题
微服务·云原生·架构
键盘鼓手苏苏11 小时前
AI 音频生成流水线:异步任务要有进度和取消
云原生·kubernetes·k8