应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。

Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。

Secret 可通过命令行或 YAML 创建。比如希望 Secret 中包含如下信息:

  1. 用户名 admin

  2. 密码 123456

1.创建 Secret方式

有四种方法创建 Secret:

1.1 通过 --from-literal

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456

每个 --from-literal 对应一个信息条目。

1.2 通过 --from-file

echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password

每个文件内容对应一个信息条目。

1.3通过 --from-env-file

cat << EOF > env.txt
username=admin
password=123456
EOF
kubectl create secret generic mysecret --from-env-file=env.txt

文件 env.txt 中每行 Key=Value 对应一个信息条目。

1.4通过 YAML 配置文件:

k8s通过secret管理敏感信息

文件中的敏感数据必须是通过 base64 编码后的结果。

 k8s通过secret管理敏感信息

执行 kubectl apply 创建 Secret:

k8s通过secret管理敏感信息

2.查看secret

2.1通过 kubectl get secret 查看存在的 secret

k8s通过secret管理敏感信息

显示有两个数据条目

 

2.2通过kubectl describe secret 查看条目的 Key

k8s通过secret管理敏感信息

 

2.3通过kubectl edit secret mysecret 查看vlaue

k8s通过secret管理敏感信息

2.4通过base64将value反解码

k8s通过secret管理敏感信息

3.vloume方式secret的使用

Pod 可以通过 Volume 或者环境变量的方式使用 Secret,先学习 Volume 方式。

Pod 的配置文件如下所示:

k8s通过secret管理敏感信息

① 定义 volume foo,来源为 secret mysecret

② 将 foo mount 到容器路径 /etc/foo,可指定读写权限为 readOnly

 创建 Pod 并在容器中读取 Secret:

 k8s通过secret管理敏感信息

可以看到,Kubernetes 会在指定的路径 /etc/foo 下为每条敏感数据创建一个文件,文件名就是数据条目的 Key,这里是 /etc/foo/username 和 /etc/foo/password,Value 则以明文存放在文件中。

 我们也可以自定义存放数据的文件名,比如将配置文件改为:

 k8s通过secret管理敏感信息

这时数据将分别存放在 /etc/foo/my-group/my-username 和 /etc/foo/my-group/my-password 中。

以 Volume 方式使用的 Secret 支持动态更新:Secret 更新后,容器中的数据也会更新。

 将 password 更新为 abcdef,base64 编码为 YWJjZGVm

k8s通过secret管理敏感信息

4.环境变量中使用secret

 通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secre

k8s通过secret管理敏感信息

 创建 Pod 并读取 Secret。

k8s通过secret管理敏感信息

通过环境变量 SECRET_USERNAME 和 SECRET_PASSWORD 成功读取到 Secret 的数据。

需要注意的是,环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。

Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap

 

相关文章: