k8s 配置两个deployment主机级别互斥部署

在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。

实现步骤

定义 Deployment

为每个 Deployment 定义 podAntiAffinity,指定它们不能与另一个 Deployment 的 Pod 部署在同一个节点上。

设置标签选择器

使用 labelSelector 来匹配另一个 Deployment 的 Pod 标签。

设置拓扑键

使用 topologyKey 设置为 kubernetes.io/hostname,表示基于节点的互斥。

案例

假设有两个 Deployment,分别是 deployment-Adeployment-B,它们的 Pod 标签分别为 app: app-aapp: app-b

Deployment A
复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-a
spec:
  replicas: 2
  selector:
    matchLabels:
      app: app-a
  template:
    metadata:
      labels:
        app: app-a
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - app-b
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
Deployment B
复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-b
spec:
  replicas: 2
  selector:
    matchLabels:
      app: app-b
  template:
    metadata:
      labels:
        app: app-b
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - app-a
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

说明

  • podAntiAffinity:定义 Pod 之间的互斥关系。

  • requiredDuringSchedulingIgnoredDuringExecution:硬性规则,必须满足,否则 Pod 不会被调度。

  • labelSelector:匹配另一个 Deployment 的 Pod 标签。

  • topologyKey :设置为 kubernetes.io/hostname,表示基于节点的互斥。

验证

部署完成后,可以使用以下命令查看 Pod 的调度情况:

复制代码
kubectl get pods -o wide

这将显示每个 Pod 所在的节点,确保两个 Deployment 的 Pod 不在同一节点上。但此种部署方式需要保证节点不少于应用数,否则会出现pod无法调度的情况,比如集群只有1个节点,Deployment A成功调度到唯一节点上,那么Deployment A就无法成功调度;

通过以上配置,可以实现两个 Deployment 的 Pod 在主机级别互斥部署。

相关推荐
舰长11510 小时前
k8s 持久化存储方案-PVC
云原生·容器·kubernetes
南方以南_11 小时前
对比k8s的service和kube-proxy
云原生·容器·kubernetes
爱宇阳12 小时前
从零开始部署 GitLab CE 18.4.2:Docker Compose 新手教程
docker·容器·gitlab
斯普信专业组12 小时前
基于k8s环境的mongodb多副本高可用方案
mongodb·容器·kubernetes
AKAMAI13 小时前
Linebreak赋能实时化企业转型:专业系统集成商携手Akamai以实时智能革新企业运营
人工智能·云原生·云计算
博睿谷IT99_14 小时前
K8s 核心架构是什么?组件怎么协同工作的?
云原生·kubernetes·k8s·k8s pod 设计原理·容器编排与集群管理
能不能别报错15 小时前
K8s学习笔记(二十一) RBAC
笔记·学习·kubernetes
久绊A15 小时前
Kubernetes(k8s)版本查看
云原生·容器·kubernetes
007php00715 小时前
Docker 实战经验之关键文件误删恢复指南(一)
jvm·docker·云原生·容器·面试·职场和发展·eureka
Do_GH15 小时前
【Docker】06.通过WSL部署Docker Desktop
运维·docker·容器