Pod 关联设置在我的部署中无法正常工作

问题描述

我尝试在 k3s 上部署 2 个副本 - 每个副本都部署到不同的节点。根据文档,这应该很容易。但是,我一定是在做一些我找不到的愚蠢错误。当我应用部署文件时,我的两个 Pod 都在运行同一个节点 (node1)。如果我关闭该节点,这些 Pod 将在另外 2 个节点(node2node3)上启动。当我重新启动 node1 并重新部署应用程序时,它会再次在同一个 node1 上运行。 如果有人可以提供建议,我的配置有什么问题,我将不胜感激。 (我在 3 台具有相同硬件配置的服务器上运行全新的 k3s)

apiVersion: apps/v1
kind: Deployment
Metadata:
  name: tbd-node-js-runner
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tbd-node-js-runner
  template:
    Metadata:
      labels:
        app: tbd-node-js-runner
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - tbd-node-js-runner
            topologyKey: topology.kubernetes.io/hostname
      containers:
        - name: tbd-node-js-runner
          image: tabidoo/nodejs-runner:latest
          ports:
          - containerPort: 
          env:
          - name: CONNECTION_STRING
            value: "..."
            ...
          imagePullPolicy: Always
      imagePullSecrets:
        - name: regcred

解决方法

  • 这是由于 topologyKey 不正确,应该是 'kubernetes.io/hostname' 而不是 'topology.kubernetes.io/hostname' 。

  • 所以它会如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tbd-node-js-runner
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tbd-node-js-runner
  template:
    metadata:
      labels:
        app: tbd-node-js-runner
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - tbd-node-js-runner
            topologyKey: "kubernetes.io/hostname"
      containers:
        - name: tbd-node-js-runner
          image: tabidoo/nodejs-runner:latest