【问题标题】:Attaching secret to running pod将秘密附加到正在运行的 pod
【发布时间】:2021-01-04 02:18:28
【问题描述】:

如何将 secret 附加到正在运行的 pod?

我有一个 pod 正在运行,我想附加一个秘密。

我不想终止正在运行的 pod 实例。

我知道 pod 旨在以无状态方式运行。

【问题讨论】:

    标签: kubernetes kubernetes-secrets


    【解决方案1】:

    根据documentation

    Secret 可以作为数据卷挂载,也可以作为环境变量公开,供 pod 中的容器使用。

    这是一个在卷中挂载机密的 pod 示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: redis
        volumeMounts:
        - name: foo
          mountPath: "/etc/foo"
          readOnly: true
      volumes:
      - name: foo
        secret:
          secretName: mysecret
    

    Mounted Secrets 会自动更新

    当卷中已经使用的密钥被更新时,预计的密钥最终也会被更新。 Kubelet 会在每次定期同步时检查挂载的密钥是否是新的。但是,它使用本地缓存来获取 Secret 的当前值。缓存的类型可以使用(KubeletConfiguration 结构中的 ConfigMapAndSecretChangeDetectionStrategy 字段)进行配置。它可以通过 watch(默认)、基于 ttl 的方式传播,或者直接将所有请求重定向到 kube-apiserver。因此,从更新 Secret 到将新密钥投射到 Pod 的时刻的总延迟可能与 kubelet 同步周期 + 缓存传播延迟一样长,其中缓存传播延迟取决于选择的缓存类型 (等于watch传播延迟,缓存的ttl,或者零核)。

    注意:使用 Secret 作为 subPath 卷挂载的容器将不会收到 Secret 更新。

    这是一个使用环境变量中的秘密的 pod 示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-env-pod
    spec:
      containers:
      - name: mycontainer
        image: redis
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: password
      restartPolicy: Never
    

    对于这两种情况,您都需要更改 pod 规范。您可以通过使用 kubectl edit 编辑 Pod 或 Deployment 来做到这一点:

    $ kubectl edit pod <pod_name> -n <namespace_name>
    $ kubectl edit deployment <deployment_name> -n <namespace_name>
    

    您也可以在 YAML 文件中进行更改并应用它:

    $ vi MyPod.yaml
    $ kubectl apply -f MyPod.yaml
    

    您需要知道的最重要的事情是,如果您更改 Pod 规范,您的 Pod 将重新启动以应用更改。如果部署滚动更新将发生。在大多数情况下,没关系。如果您需要保存应用程序的状态,最好的方法是使用 Volumes 存储有价值的信息。

    如果您仍想在不重新启动 Pod 的情况下添加机密,您可以使用 NFS 等共享存储。当您更改已挂载到 Pod 中的 NFS 卷的内容时,更改将立即在 pod 内可见。 在某些情况下,您可以在 pod 内执行 shell 并手动挂载 NFS 卷。

    或者,您可以使用ksd 程序将机密内容导出到文件
    (或base64 -d)解码Secret中的base64编码值:

    kubectl get secret mysecret -o yaml | ksd > filename.yaml
    

    并使用以下命令将 copy 发送到 pod:

    kubectl cp filename.yaml <some-namespace>/<some-pod>:/tmp/secret.yaml
    

    【讨论】:

      【解决方案2】:

      Secret - 是一个卷。因此,您无法将卷挂载到正在运行的 pod。您可以在特权模式下运行 pod 并通过命令 mount 在容器中挂载您想要的任何内容。不过,这太疯狂了……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多