在Kubernetes (k8s) 中,Secret 是一种资源对象,用于存储敏感信息(如密码、密钥、凭证等),并以安全的方式将其注入到 Pod 中的容器。以下是 Kubernetes Secret 的几种主要使用方式:
- 通过
--from-literal
创建 Secret:
在命令行中创建 Secret 时,可以使用kubectl create secret
命令结合--from-literal
标志来指定各个键值对:
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=supersecret
- 这将创建一个名为
my-secret
的 Secret,其中包含两个键值对:username
和password
。 - 通过
--from-file
创建 Secret:
如果需要从文件中加载内容作为 Secret 的一部分,可以使用--from-file
参数,每个文件的内容会被编码后作为 Secret 的一个条目:
kubectl create secret generic db-creds --from-file=connection-string=./dbconn.txt --from-file=sslcert=./cert.pem
- 这样会从给定路径读取文件内容,并分别创建
connection-string
和sslcert
键。 - 通过配置文件创建 Secret:
可以编写一个 YAML 或 JSON 配置文件来定义 Secret,并使用kubectl apply -f <config-file>.yaml
来创建或更新 Secret:
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= password: c3VwZXJzZWNyZXQ=
- 注意,在配置文件中,数据必须是 base64 编码过的字符串。
- 在 Pod 中通过环境变量引用 Secret:
在 Pod 的配置中,可以通过env
字段下的valueFrom.secretKeyRef
引用 Secret 中的数据,并将其作为环境变量暴露给容器:
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
- 在 Pod 中挂载 Secret 为卷:
Secret 也可以作为 Volume 挂载到容器内部的文件系统中,以便应用程序直接读取其中的文件:
apiVersion: v1 kind: Pod spec: containers: - name: mycontainer image: nginx volumeMounts: - name: secret-volume mountPath: /etc/nginx/secret readOnly: true volumes: - name: secret-volume secret: secretName: mysecret
- 在这个例子中,Secret
mysecret
中的所有数据将以文件形式出现在/etc/nginx/secret
目录下。
综上所述,通过这些方式,Kubernetes Secret 提供了一种安全机制,确保敏感数据不会明文显示在配置或日志中,同时又能方便地与 Pod 资源关联起来,供应用容器使用。