如何在运行的pod上添加秘密?
我有一个正在运行的吊舱,我想附加一个秘密。
我不想终止正在运行的pod实例。
我知道pod应该以无状态运行。
答案 0 :(得分:3)
秘密可以安装为数据卷,也可以公开为环境变量,以供吊舱中的容器使用。
这是在卷中装入秘密的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
在容器中装入所需的任何内容。不过,这太疯狂了……