敏感信息,直接保存在容器镜像中显然不妥,比如用户名、密码等。K8s提供的解决方案是Secret。
Secret会以密文的方式存储数据,避免了在配置文件中保存敏感信息。Secret会以Volume的形式被mount到Pod,容器可通过文件的方式使用Secret中的敏感数据;
此外,容器也可以环境变量的方式使用这些数据。
Secret可通过命令行或YAML创建。
10.1 创建Secret:
4种方法创建secret:
(1) --from-literal: --from-literal对应一个条目。
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
(2) --from-file: 每个文件对应一个条目
kubeusr@GalaxyKubernetesMaster:~$ echo -n >./pas # 往文件pas中写
kubeusr@GalaxyKubernetesMaster:~$ echo -n admin >./user
kubeusr@GalaxyKubernetesMaster:~$ kubectl create secret generic mysecret2 --from-file=./user --from-file=./pas
secret "mysecret2" created
(3) 通过--from-env-file: 文件中的Key=value对应一个条目
kubeusr@GalaxyKubernetesMaster:~$ cat << EOF > env.txt # cat <<EOF > env.txt 是覆盖模式; cat <<EOF >> env.txt是追加模式
> username=admin
> password=
> EOF
kubeusr@GalaxyKubernetesMaster:~$ cat env.txt
username=admin
password=
kubeusr@GalaxyKubernetesMaster:~$ kubectl create secret generic mysecret3 --from-env-file=env.txt
secret "mysecret3" created
(4)通过YAML配置文件:
Secret里面存储的数据必须是通过base64编码后的结果: pkubeusr@GalaxyKubernetesMaster:~$ echo -n admin | base64
YWRtaW4=
kubeusr@GalaxyKubernetesMaster:~$ echo -n | base64
MTIzNDU2
kubeusr@GalaxyKubernetesMaster:~$
apiVersion: v1
kind: Secret
metadata:
name: mysecret4
data:
username: YWRtaW4=
password: MTIzNDU2
kubeusr@GalaxyKubernetesMaster:~$ kubectl apply -f mysecrete.yml
secret "mysecret4" created
10.2 查看Secret:
kubeusr@GalaxyKubernetesMaster:~$ kubectl get secret
NAME TYPE DATA AGE
default-token-qjj5t kubernetes.io/service-account-token 131d
jenkins-credentials Opaque 85d
mysecret Opaque 42m
mysecret2 Opaque 37m
mysecret3 Opaque 20m
mysecret4 Opaque 9m
kubeusr@GalaxyKubernetesMaster:~$ kubectl describe secret mysecret2
Name: mysecret2
Namespace: default
Labels: <none>
Annotations: <none> Type: Opaque Data
====
pas: bytes
user: bytes
kubeusr@GalaxyKubernetesMaster:~$ kubectl edit secret mysecret4 # 查看具体内容 # 然后用base64解码
kubeusr@GalaxyKubernetesMaster:~$ echo -n YWRtaW4=| base64 --decode
admin