内容目录
背景
使用Kubernetes作为容器编排工具时,有时我们需要将敏感数据传递给应用。在许多场景下,我们可以直接使用环境变量传递这些配置信息。然而,有些应用的配置可能只能通过文件进行,不能直接通过环境变量传值。对于这种情况,Kubernetes 提供了 Secrets 对象,它可以将这些敏感信息如密码、密钥、令牌等作为文件内容挂载到Pod的文件系统中。
详解
以下是一个 Kubernetes Deployment 的示例配置,展示了如何将信息作为文件内容通过Secret对象挂载到容器:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-volume
name: nginx-deployment1
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-volume
template:
metadata:
labels:
app: nginx-volume
spec:
containers:
- image: nginx:1.14.0
ports:
- containerPort: 80
name: nginx-volume
volumeMounts:
- name: oauth-client-id
mountPath: /etc/nginx/clientId
subPath: clientId
- name: oauth-client-secret
mountPath: /etc/nginx/clientSecret
subPath: clientSecret
volumes:
- name: oauth-client-id
secret:
secretName: oauth-secret
items:
- key: clientId
path: clientId
- name: oauth-client-secret
secret:
secretName: oauth-secret
items:
- key: clientSecret
path: clientSecret
如上配置中,用到了两个挂载点:/etc/nginx/clientId
和/etc/nginx/clientSecret
,它们分别对应Secret对象 oauth-secret
下的 clientId
和 clientSecret
。
root@localhost:/root# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment1-5f4dc9b48f-t8lp2 1/1 Running 0 6d
===========================================================================
root@localhost:/root# kubectl exec -it po/nginx-deployment1-5f4dc9b48f-t8lp2 -- bash
===========================================================================
root@nginx-deployment1-5f4dc9b48f-t8lp2:/# ls /etc/nginx | grep client
clientId clientSecret
===========================================================================
root@nginx-deployment1-5f4dc9b48f-t8lp2:/#
volumeMounts
中的 name
要与 volumes
中的 name
对应, mountPath
指的是容器中文件的路径, subPath
是可选的,当在同一卷中使用多个 secret
的多个 key
时,可以使用 subPath
。
oauth-secret
在 volumes
下定义,指定了 secretName
和 items
, items
是个数组,定义了需要使用的 key
和在Pod中创建文件的 path
。
总结
Kubernetes的Secrets提供了一个在容器中使用敏感信息的安全、灵活的方式。你可以通过定义Secret和在Pod的特定路径挂载该Secret来将敏感数据以文件内容形式暴露给你的应用,从而避免在配置文件或者镜像中硬编码敏感信息。这可以提高你应用的安全性,也为管理这些敏感信息提供了更多的灵活性。