将秘密附加到正在运行的吊舱

时间:2019-01-18 10:55:39

标签: kubernetes pod

如何在运行的pod上添加秘密?

我有一个正在运行的吊舱,我想附加一个秘密。

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

我知道pod应该以无状态运行。

2 个答案:

答案 0 :(得分:3)

根据documentation

  

秘密可以安装为数据卷,也可以公开为环境变量,以供吊舱中的容器使用。

     

这是在卷中装入秘密的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
  

安装的机密会自动更新

     

更新已在卷中使用的机密时,最终也会投影投影的密钥。 Kubelet正在检查是否在每个定期同步中都重新装入已安装的机密。但是,它正在使用其本地缓存来获取Secret的当前值。缓存的类型可以使用(KubeletConfiguration结构中的ConfigMapAndSecretChangeDetectionStrategy字段)进行配置。它可以通过watch(默认),基于ttl传播,也可以将所有请求直接重定向到直接kube-apiserver。结果,从更新密钥到将新密钥投射到Pod的那一刻之间的总延迟可以是kubelet同步周期+缓存传播延迟,其中缓存传播延迟取决于所选的缓存类型(等于观察传播延迟,缓存的ttl或相应地为零。)

     

注意:使用Secret作为子路径卷安装的容器将不会收到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

对于这两种情况,您都需要更改广告连播规范。您可以通过使用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内部执行外壳程序并手动安装NFS卷。

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

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

并使用以下命令copy将其{{3}}到广告连播:

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

答案 1 :(得分:1)

秘密-是一卷。因此,您无法将卷装入正在运行的Pod。您可以在特权模式下运行pod并通过命令mount在容器中装入所需的任何内容。不过,这太疯狂了……