gpt4 book ai didi

docker - 如何更新所有命名空间的 Kubernetes secret

转载 作者:行者123 更新时间:2023-12-02 11:33:57 26 4
gpt4 key购买 nike

我在 Google Cloud Platform 上使用 docker 和 kubernetes,以及 Kubernetes Engine。
我在 app.yaml 文件中配置了 secret ,如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
namespace: $CI_COMMIT_REF_SLUG
labels:
app: app
spec:
replicas: 1
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: gcr.io/engagement-org/app:$CI_COMMIT_SHA
imagePullPolicy: Always
ports:
- containerPort: 9000
env:
- name: MAILJET_APIKEY_PUBLIC
valueFrom:
secretKeyRef:
name: mailjet
key: apikey_public
- name: MAILJET_APIKEY_PRIVATE
valueFrom:
secretKeyRef:
name: mailjet
key: apikey_private

每次我推送一个新分支时,都会通过我的 gitlab-ci 文件中的部署创建一个新的命名空间。 secret 是这样创建的:
 - kubectl create secret generic mailjet --namespace=$CI_COMMIT_REF_SLUG --from-literal=apikey_public=$MAILJET_APIKEY_PUBLIC --from-literal=apikey_private=$MAILJET_APIKEY_PRIVATE || echo 'Secret already exist'; 

现在,我已经更新了我的 mailjet api key 并希望对所有命名空间进行更改。
我可以通过在 pod 上获取一个 shell 并运行 kubectl edit secret mailjet --namespace=<namespace_name> 来编辑每个命名空间上的 secret 。

我想要的是将新的 secret 值发送到将来创建的新 pod。当我部署一个新的时,它仍然使用旧值。

据我了解,gitlab-ci 文件使用 app.yaml 文件将环境变量替换为值。但我不明白 app.yaml 在哪里找到原始值。

感谢您的帮助。

最佳答案

通常,Kubernetes 命名空间旨在为在其中运行的组件提供隔离。出于这个原因,Kubernetes API 并不是真正设计为跨命名空间执行更新操作,或使 secret 跨命名空间可用。

话虽如此,有几件事可以解决这个问题。

1. 使用单个命名空间和 Helm 版本而不是单独的命名空间

从它的外观来看,您正在使用 Gitlab CI 来部署各个分支来审查环境(大概是使用 Gitlab 的 Review App 功能?)。通过将所有评论应用程序部署到同一个命名空间并使用 Helm 可以获得相同的结果。在单个命名空间内管理同一应用程序的多个部署(Helm 中的“发布”)。

gitlab-ci.yml ,为新分支创建 Helm 版本可能类似于:

script:
- helm upgrade --namespace default --install review-$CI_COMMIT_REF_SLUG ./path/to/chart

当然,这需要你已经定义了一个 Helm chart用于您的应用程序(本质上只是一组带有一组默认变量的 YAML 模板,然后可以为各个版本覆盖这些变量)。有关创建 Helm 图表的更多信息,请参阅文档(上面链接)。

2. 跨命名空间保持 secret 同步

不久前,我们遇到了类似的问题,于是求助于编写一个自定义的 Kubernetes Controller ,该 Controller 可以跨命名空间保持 secret 同步。它是开源的,你可以 find it on GitHub (不过请谨慎使用)。它基于注释并提供来自单个权威父 key 的更改的单向传播:
apiVersion: v1
kind: Secret
metadata:
name: mailjet
namespace: some-kubernetes-namespace
annotations:
replicator.v1.mittwald.de/replicate-from: default/mailjet

在集群中部署 secret 复制器后,使用此注释将传播对 mailjet 所做的所有更改。 secret 在 default命名空间到任何命名空间中的所有 secret ,如上图所示。

关于docker - 如何更新所有命名空间的 Kubernetes secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com