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

相关推荐
分布式存储与RustFS14 小时前
在 Kubernetes 上用 RustFS Operator 给 Tenant 开 KMS 加密:spec.encryption 实战
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
wdfk_prog15 小时前
大型 Docker 镜像导出导入工程化:可靠性、磁盘与压缩
运维·docker·容器
郝开15 小时前
Docker Compose 模块化多环境配置规范指南:示例搭建Alf Tengine MD2DOC 1.1.1
运维·docker·容器
Albart57516 小时前
Docker Desktop 增量更新失败终极排查:Failed to apply delta update 反复回滚怎么办?
windows·docker·容器·docker部署大模型
sibylyue17 小时前
【云原生系列3】Docker Compose单机多容器编排工具
运维·docker·容器
Seoyoneh17 小时前
呼叫中心系统云原生架构演进:传统自建与云端部署的技术实现对比分析
云原生·架构
2601_9622184717 小时前
万象生鲜系统订单全生命周期追踪实现生鲜企业订单业务数字化可视
大数据·运维·微服务·云原生·架构
java_logo18 小时前
Docker 部署 ArchivesSpace:轻松搭建档案信息管理平台
运维·docker·容器·档案管理·轩辕镜像·archivesspace·特藏
_itgo1 天前
意图识别落地方案
运维·docker·容器
分布式存储与RustFS1 天前
RustFS 1.0 GA 前的生产验收清单:从 rc.1 到 GA 该准备什么
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准