我在Google Cloud Platform上使用docker和kubernetes,使用Kubernetes Engine。 我在app.yaml文件中配置了秘密,如下所示:
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文件中的部署创建新的命名空间。秘密的创建如下:
- 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密钥,并希望对所有命名空间进行更改。
我可以通过在pod上获取shell并运行kubectl edit secret mailjet --namespace=<namespace_name>
我想要的是将新的秘密值发送到将来创建的新pod。当我部署一个新的时,它仍然使用旧的值。
据我所知,gitlab-ci文件使用app.yaml文件用值替换环境变量。但我不明白app.yaml在哪里找到原始值。
感谢您的帮助。
答案 0 :(得分:7)
通常,Kubernetes命名空间旨在为在其中运行的组件提供隔离。出于这个原因,Kubernetes API并非真正用于跨命名空间执行更新操作,或者使命令在命名空间中可用。
话虽如此,有一些事情可以解决这个问题。
从它的外观来看,您正在使用Gitlab CI将各个分支部署到审阅环境(可能是使用Gitlab的Review App功能?)。通过将所有评论应用程序部署到同一名称空间,并使用Helm来管理单个名称空间内同一应用程序的多个部署(Helm-speak中的“发布”),可以实现相同的结果。
在gitlab-ci.yml
中,为新分支创建Helm版本可能与此类似:
script:
- helm upgrade --namespace default --install review-$CI_COMMIT_REF_SLUG ./path/to/chart
当然,这要求您为应用程序定义了Helm chart(实质上它只是一组YAML模板,其中包含一组默认变量,然后可以为各个版本覆盖)。有关创建Helm图表的更多信息,请参阅文档(上面链接)。
我们前一段时间遇到过类似的问题,并使用自定义的Kubernetes控制器来保持名称空间的同步。它是开源的,你可以find it on GitHub(但要谨慎使用)。它基于注释,并提供单一,权威的父秘密的单向传播:
apiVersion: v1
kind: Secret
metadata:
name: mailjet
namespace: some-kubernetes-namespace
annotations:
replicator.v1.mittwald.de/replicate-from: default/mailjet
在群集中部署秘密复制器后,使用此注释会将对mailjet
命名空间中的default
机密所做的所有更改传播到任何带有注释的命名空间中的所有机密,如上图所示。
答案 1 :(得分:0)
现在,存在一种使用ClusterSecret运算符在命名空间之间共享或同步秘密的方法: