k8s初级实战09--Secret
1 基础概念
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以通过 Volume 或者环境变量的方式使用。
在创建 Secret 对象时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。截至1.19版本,K8S提供了多种内置的类型,具体如下:
内置类型 | 用法 |
---|---|
Opaque | 用户定义的任意数据 |
kubernetes.io/service-account-token | 服务账号令牌 |
kubernetes.io/dockercfg ~/.dockercfg | 文件的序列化形式 |
kubernetes.io/dockerconfigjson ~/.docker/config.json | 文件的序列化形式 |
kubernetes.io/basic-auth | 用于基本身份认证的凭据 |
kubernetes.io/ssh-auth | 用于 SSH 身份认证的凭据 |
kubernetes.io/tls | 用于 TLS 客户端或者服务器端的数据 |
bootstrap.kubernetes.io/token | 启动引导令牌数据 |
2 常见用法
2.1 创建 secret
- 通过文件创建 secret
% echo -n 'admin' > ./username % echo -n 'kubernetes' > ./password % kubectl create secret generic sec-data01 --from-file=./username --from-file=./password secret/sec-data01 created 查看secret数据: % kubectl get secrets sec-data01 -o go-template='{{.data}}' map[password:a3ViZXJuZXRlcw== username:YWRtaW4=]%
- 手动加密
默认情况下使用base64进行加密,如下直接通过base64加密,其值和secret中的加密结果相同: % echo -n 'admin'|base64 YWRtaW4= % echo -n 'kubernetes'|base64 a3ViZXJuZXRlcw== 对加密数据进行解密: % echo 'YWRtaW4='|base64 --decode admin% % vim sec-data01.yaml apiVersion: v1 data: password: a3ViZXJuZXRlcw== username: YWRtaW4= kind: Secret metadata: name: sec-data01
2.2 使用 secret
- pod卷挂载 secret
该方式会将secret信息挂载到指定的目录,然后让容器中的程序通过挂载目录的文件来读取secret的内容。% vim pod-sec-data01.yaml apiVersion: v1 kind: Pod metadata: name: sec-data01 spec: containers: - name: busybo-sec image: busybox:1.32 volumeMounts: - name: config-volume mountPath: /my-config volumes: - name: config-volume secret: secretName: sec-data01 创建pod: % kubectl apply -f pod-sec-data01.yaml pod/sec-data01 created 查看secret挂载情况: / # ls /my-config/ password username / # cat /my-config/username admin/ # / # cat /my-config/password kubernetes/ #
- pod环境变量使用 secret
该方式会将secret的key加载到pod的container env中,使用时需要通过 env[x].valueFrom.secretKeyRef 指定要包含的 Secret 名称和键名。% cat pod-env-sec-data02.yaml apiVersion: v1 kind: Pod metadata: name: env-sec-data01 spec: containers: - name: busybo-sec image: busybox:1.32 command: ['sh', '-c', 'sleep 1000000'] env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: sec-data01 key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: sec-data01 key: password 创建pod: % kubectl apply -f pod-env-sec-data02.yaml pod/env-sec-data01 created 查看环境变量: % kubectl exec -it env-sec-data01 -- env|grep SEC SECRET_USERNAME=admin SECRET_PASSWORD=kubernetes ``
2.3 imagePullSecret 控制镜像访问权限
to add
3 注意事项
- 除了基本的secret外,也可以通过 immutable: true 字段来创建不可更改的Secret
4 说明
概念->配置->Secret
github feiskyer/kubernetes-handbook/blob/master/concepts/secret