如何将相同的卷挂载到 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 不支持此功能。
我们在 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 不支持此功能。