如何将秘密附加到正在运行的 pod?
我有一个 pod 正在运行,我想附上一个秘密。
我不想终止正在运行的 pod 实例。
我知道 pod 旨在以无状态方式运行。
如何将秘密附加到正在运行的 pod?
我有一个 pod 正在运行,我想附上一个秘密。
我不想终止正在运行的 pod 实例。
我知道 pod 旨在以无状态方式运行。
根据文档:
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
安装的秘密会自动更新
当卷中已经使用的秘密被更新时,预计的密钥最终也会被更新。Kubelet 会在每次定期同步时检查挂载的密钥是否是新的。但是,它使用本地缓存来获取 Secret 的当前值。缓存的类型可以使用(KubeletConfiguration 结构中的 ConfigMapAndSecretChangeDetectionStrategy 字段)进行配置。它可以通过 watch(默认)、基于 ttl 的方式传播,或者直接将所有请求重定向到 kube-apiserver。因此,从更新 Secret 到将新密钥投射到 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
对于这两种情况,您都需要更改 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
以解码机密中的 base64 编码值:
kubectl get secret mysecret -o yaml | ksd > filename.yaml
并使用以下命令将其复制到 pod:
kubectl cp filename.yaml <some-namespace>/<some-pod>:/tmp/secret.yaml
秘密 - 是一个卷。因此,您无法将卷挂载到正在运行的 pod。您可以在特权模式下运行 pod,并通过容器内的命令挂载您想要的任何mount
内容。这很疯狂,虽然...