如何将相同的卷挂载到 kubernetes 命名空间中的所有 pods

How to mount same volume on to all pods in a kubernetes namespace

我们在 kubernetes 中有一个命名空间,我希望一些秘密(文件如 jks、properties、ts 等)可供所有 pods 中的所有容器使用(我们有一个 JVM每个容器和每个 pod 类型的部署一个容器)。

我已经使用 kustomization 创建了 secrets,并计划将其用作每个 Deployment 规范的卷,然后为该 Deployment 的容器使用 volumeMount。我希望将此卷安装到我们命名空间中部署的每个容器上。

我想知道 kustomize(或其他任何东西)是否可以帮助我将此卷挂载到此命名空间中的所有部署上?

我试过以下patchesStrategicMerge

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: myNamespace
spec:
  template:
    spec:
      imagePullSecrets:
        - name: pull-secret
      containers:
        - volumeMounts:
          - name: secret-files
            mountPath: "/secrets"
            readOnly: true
      volumes:
      - name: secret-files
        secret:
          secretName: mySecrets
          items:
          - key: key1
            path: ...somePath
          - key: key2
            path: ...somePath

它需要 metadata 部分中的名称,这对我没有帮助,因为我所有的部署都有不同的名称。

要将 secret 安装为卷,您需要更新 pod/deployment 清单文件的 yaml 结构并重建它们。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-secret-volume
          mountPath: /etc/secretpath
  volumes:
    - name: my-secret-volume
      secret:
        secretName: my-secret

kustomize(或其他任何东西)不会为您安装它。

Inject Information into Pods Using a PodPreset

您可以使用 PodPreset 对象在创建时将机密、卷安装和环境变量等信息注入 pods。

更新:2021 年 2 月。PodPreset 功能仅进入 alpha 阶段。它在 kubernetes 的 v1.20 中被删除。请参阅发行说明 https://kubernetes.io/docs/setup/release/notes/

The v1alpha1 PodPreset API and admission plugin has been removed with no built-in replacement. Admission webhooks can be used to modify pods on creation. (#94090, @deads2k) [SIG API Machinery, Apps, CLI, Cloud Provider, Scalability and Testing]

PodPresent (https://kubernetes.io/docs/tasks/inject-data-application/podpreset/) 是执行此操作的一种方法,但为此,您命名空间中的所有 pods 都应与您在 PodPresent 规范中指定的标签相匹配。

另一种方法(最流行)是使用动态准入控制(https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)并在您的集群中编写一个 Mutating webhook,它将编辑您的 pod 规范并添加您想要挂载的所有秘密。使用它,您还可以在 Pod 规范中进行其他更改,例如安装卷、添加标签等等。

独立的 kustomize 支持许多资源的补丁。这是一个示例 Patching multiple resources at once。 kubectl 中内置的 kustomize 不支持此功能。