背景
使用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来将敏感数据以文件内容形式暴露给你的应用,从而避免在配置文件或者镜像中硬编码敏感信息。这可以提高你应用的安全性,也为管理这些敏感信息提供了更多的灵活性。