一、Secret概述
Kubernetes Secret 对象可以用来储存敏感信息,例如:密码、OAuth token、ssh 密钥等。如果不使用 Secret,此类信息可能被放置在 Pod 定义中或者容器镜像中。将此类敏感信息存储到 Secret 中,可以更好地:
-控制其使用
-降低信息泄露的风险
-用户可以直接创建 Secret,Kubernetes 系统也会创建一些 Secret。
Secret有如下几种使用方式:
-作为 Pod 的环境变量
-作为 Pod 的数据卷挂载
-kubelet 在抓取容器镜像时,作为 docker 镜像仓库的用户名密码
二、Secret常见类型
Secret的类型
在创建 Secret 对象时,你可以使用 Secret 资源的 type 字段,或使用kubectl 命令行参数为其设置类型。
Secret 的类型用来帮助编写程序处理 Secret 数据,Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。 针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。
Secret常用类型:
-Opaque:base64编码格式的Secret,用来存储密码、密钥等;
-Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;
-kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
内置类型参考:
三、创建Secret
1、Opaque类型的数据是一个map类型,要求value是base64编码格式:
[root@master-191 ~]# echo -n "admin" | base64
YWRtaW4=
[root@master-191 ~]# echo -n "xiaoqingabc321" | base64
eGlhb3FpbmdhYmMzMjE=
2、用刚才生成的值创建secret
[root@master-191 ~]# vim secrets.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: eGlhb3FpbmdhYmMzMjE=
[root@master-191 ~]# kubectl create -f secrets.yml
secret "mysecret" created
[root@master-191 ~]# kubectl get pod
No resources found.
3、查看
[root@master-191 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-qh5p5 kubernetes.io/service-account-token 3 25d
mysecret Opaque 2 9s
四、创建好secret之后,有两种方式来使用它:
1、以环境变量方式
[root@master-191 ~]# vim secret-var.yml
apiVersion: v1
kind: Pod
metadata:
name: varpod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
pod "varpod" created
[root@master-191 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
varpod 0/1 ContainerCreating 0 4s
[root@master-191 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
varpod 1/1 Running 0 7s
进入到容器中
[root@master-191 ~]# kubectl exec -it varpod bash
root@varpod:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
经测试,pod容器里能读取secret的变量
root@varpod:/# echo $SECRET_USERNAME
admin
root@varpod:/# echo $SECRET_PASSWORD
xiaoqingabc321
2、以Volume数据卷挂载方式
[root@master-191 ~]# vim secret-vol.yml
apiVersion: v1
kind: Pod
metadata:
name: volpod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
[root@master-191 ~]# kubectl create -f secret-vol.yml
pod "volpod" created
[root@master-191 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
varpod 1/1 Running 0 7m
volpod 1/1 Running 0 11s
进入到容器中
[root@master-191 ~]# kubectl exec -it volpod bash
root@volpod:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@volpod:/# cd /etc/foo/
root@volpod:/etc/foo# ls
password username
经测试,pod容器里能读取secret的变量
root@volpod:/etc/foo# cat username
admin
root@volpod:/etc/foo# cat password
xiaoqingabc321
root@volpod:/etc/foo#
kubenetes官网:https://kubernetes.io/zh/docs
kubenetes社区:https://www.kubernetes.org.cn
kuboard.cn官网:https://kuboard.cn/learning