如何更新所有名称空间的Kubernetes机密

时间:2018-02-16 18:17:09

标签: docker kubernetes google-cloud-platform gitlab-ci

我在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在哪里找到原始值。

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

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

话虽如此,有一些事情可以解决这个问题。

1。使用单个命名空间&amp; Helm发布而不是单独的名称空间

从它的外观来看,您正在使用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图表的更多信息,请参阅文档(上面链接)。

2。保持秘密在命名空间中同步

我们前一段时间遇到过类似的问题,并使用自定义的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运算符在命名空间之间共享或同步秘密的方法:

https://github.com/zakkg3/ClusterSecret