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

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

实现步骤

定义 Deployment:

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

设置标签选择器:

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

设置拓扑键:

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

案例

假设有两个 Deployment,分别是 deployment-A 和 deployment-B,它们的 Pod 标签分别为 app: app-a 和 app: 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 在主机级别互斥部署。

相关推荐
川石课堂软件测试4 小时前
JMeter异步接口测试实战
数据库·python·jmeter·mysql·kubernetes·测试用例·prometheus
禁默4 小时前
玩客云部署EasyVoice实战:HiNas、Docker、ARMv7、9001与固定地址访问(1)
docker·容器·语音识别·cpolar
fengkai45454 小时前
2、Kubernetes 介绍+安装+卸载
运维·容器·kubernetes
羑悻的小杀马特4 小时前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
运维·网络·docker·容器
小马同学-5 小时前
K8s 节点管理:查看、维护与集群删除操作
容器·kubernetes
艾伦_耶格宇1 天前
【DOCKER容器实战】-5 Docker容器镜像的构建
运维·docker·容器
分布式存储与RustFS1 天前
RustFS 该跟 stable 还是 nightly?两条版本线的分工、风险与回退,一张表说清
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
ggaofeng1 天前
k8s中的dns
云原生·容器·kubernetes
我不会起名字3222 天前
K8s Ingress 返回 502 但后端日志正常:4 类上游断连与排查链
kubernetes·k8s·ingress·502·keepalive
姜鱼问生2 天前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器