Kubernetes:如何配置一组 pods 部署在同一节点上?

Kubernetes: How to config a group of pods to be deployed on the same node?

用例是这样的:

所以我们有几个 pods 使用相同的 persistentVolumeClaimaccessMode 设置为 ReadWriteOnce(因为 [=15 的存储 class =] 仅支持 ReadWriteOnce).

来自 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

ReadWriteOnce -- the volume can be mounted as read-write by a single node

所以这些pods应该部署在同一个节点上才能访问PVC(否则会失败)。

请问有什么方法可以配置部署yaml文件,让他们部署在同一个节点上吗?或者有什么办法可以解决这个问题?

Chin 已经提到 inter-pod affinity 这是一个有效的解决方案,但我想再提一个解决方案,可能有点争议但在相同情况下仍然有效。

如果您必须将所有容器 运行 放在一个节点上,您可以将所有这些容器放在一个 pod 中,它们将始终在一起,最重要的是,您可以挂载持久卷没有任何麻烦。请记住,过度使用被认为是不好的做法;总是喜欢每个 pod 一个容器而不是每个 pod 多个容器,尽管你的用例可能不符合该规则,但我很难说,因为我对这些一无所知 pods.

阅读更多有关 How pods manage multiple container

的内容

根据Chin建议的pod间亲和性解决方案,我能够解决问题:

以下是我的Deploymentyaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-go
  namespace: stage
  labels:
    app: test-go
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-go
  template:
    metadata:
      labels:
        app: test-go
        service: git
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: service
                operator: In
                values:
                - git
            topologyKey: kubernetes.io/hostname
      containers:
      - name: test-go
        image: registry.gitlab.com/xxxxxxx/test-go
      imagePullSecrets:
        - name: registry-pull-secret

Deploymentyaml文件中,在pod模板中设置一个标签spec.template.metadata.labels,然后根据添加的标签添加podAffinity配置,设置topologyKeykubernetes.io/hostname 这样 pods 将部署在同一节点上。