9

我想学习如何在不杀死和重新创建部署的情况下更新工作 pod 中的秘密。

目前,Pod 将秘密作为 env vars 拉入:

        env:
        - name: SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: secret_access_key
              name: secrets

但这仅在它们启动时发生。

因此,如果需要更改秘密,我必须:

  1. 更改密码secrets.yaml
  2. kubectl apply -f secrets.yaml
  3. kubectl delete -f worker-deployment.yaml
  4. kubectl apply -f worker-deployment.yaml

我真的不喜欢第 3 步和第 4 步,因为它们会终止正在进行的工作。

更新 env var 机密的更好工作流程是什么?

4

3 回答 3

10

没有办法对 pod 的环境变量进行“热重载”。

不过,您无需再次删除并重新创建部署即可应用新的密钥值。您只需要重新创建底层 pod。一些选项是:

  • kubectl delete pods重新创建它们
  • 编辑一些部署微不足道的值以触发滚动更新(例如,terminationGracePeriodSecondsfrom更改3031)。
  • 用于kubectl rollout restart对部署进行滚动重启†</li>

rollout restart仅适用于 kubernetes v1.15+

于 2019-04-11T23:51:05.590 回答
4

如前所述,您想做的事情是不可能的。但是,Kubernetes 提供了另一种选择:将 ConfigMap 挂载为卷。例如

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
    - name: test
      image: busybox
      volumeMounts:
        - name: config-vol
          mountPath: /etc/config
  volumes:
    - name: config-vol
      configMap:
        name: log-config
        items:
          - key: log_level
            path: log_level

在这种情况下,log-config ConfigMap将被挂载为Volume,并且您可以从其log_level条目中访问内容作为 pod 内的文件“<code>/etc/config/log_level”。

对配置映射的更改反映在卷上文件的更改中,而这些更改又可以由您的应用程序通过使用您的语言中的适当功能来观察。

于 2019-04-13T12:45:11.227 回答
-4

如果您具有适当的权限,您可以通过 K8S 的 WebUI(仪表板)或 fabric8 等工具更新机密。

查看Kubernetes 使用 cli 修改密钥以获取其他选项。

于 2019-04-12T00:08:12.610 回答