本文主要是介绍3.8 Secret传递敏感数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一. Opaque 类型 Secret
- 1 创建Secret
- 1.1 通过yaml创建Secret
- 1.2 通过文件创建Secret
- 2 利用Secret
- 2.1 将Secret挂载到Volume中
- 2.2 将Secret导入到容器环境变量中
- 二、service account 类型 Secret
- 三、kubernetes.io/dockerconfigjson 类型secret
前文介绍的都是通过镜像或者ConfigMap向容器传递数据或配置,都是明文进行传递的数据或配置是敏感的,比如账户密码等密钥之类的数据,用Secret加密方式传递可以保证数据安全性。Secret结构与ConfigMap类似,都是键值对形式。Secret有以下3种方式
- Opaque:使用base64编码格式的信息,但base64编码的信息也可以用base64 --decode解码,安全性相对较弱;
- service account:用于被 service account 引用,用来访问k8s的API。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
- kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
一. Opaque 类型 Secret
Opaque类型的Secret,创建secret时传递的value值都是base64编码后的值,传到容器里面的值是base64解码后的值。
1 创建Secret
1.1 通过yaml创建Secret
例如lzj通过base64编码后的值为bHpqCg==
,lzj@lzj通过base64编码后的值为bHpqQGx6ago=
,下面创建secret.yaml文件
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: bHpqCg==password: bHpqQGx6ago=
创建secret,kubectl apply -f secret.yaml
1.2 通过文件创建Secret
首先创建一个user.conf文件,文件中添加内容:
lzj
lzj@lzj
通过文件创建secret
kubectl create secret generic mysecret2 --from-file=user.conf
查看创建的mysecret2,kubectl get secret mysecret2 -o yaml
,发现user.conf内容已经被编码base64进行传递
apiVersion: v1
data:user.conf: bHpqCmx6akBsemoK
kind: Secret
metadata:creationTimestamp: "2020-08-19T15:23:41Z"name: mysecret2namespace: defaultresourceVersion: "8630508"selfLink: /api/v1/namespaces/default/secrets/mysecret2uid: de58bb77-3ce6-4930-a607-61fc6bb1e6d2
type: Opaque
2 利用Secret
2.1 将Secret挂载到Volume中
将上面创建的mysecret2挂载到volume中,容器从volume卷中读取账户密码文件。首先创建pod为例,如下所示:
apiVersion: v1
kind: Pod
metadata:name: secret-pod1
spec:containers:- name: mynginx1image: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: usermountPath: /home/confreadOnly: truevolumes:- name: usersecret:secretName: mysecret2
创建pod ,kubectl apply -f pod1.yaml
,然后进容器查看传递的mysecret2,发现传递到容器的user.conf已经被解码
[root@k8s-master01 pod]# kubectl exec -it secret-pod1 -- /bin/sh
# cd /home/conf
# ls
user.conf
# cat user.conf
lzj
lzj@lzj
2.2 将Secret导入到容器环境变量中
将上面创建的mysecret导入到容器环境变量中,创建mysecret用的base64编码的值,导入到容器中后就是解码的值了。首先创建pod的yaml如下
apiVersion: v1
kind: Pod
metadata:name: secret-pod2
spec:containers:- image: busyboxname: buysbox1imagePullPolicy: IfNotPresentcommand: ["/bin/sh", "-c", "sleep 300"]env:- name: USER_NAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: USER_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password
创建该pod,并进入容器查看环境变量,发现已经时解码后的值
[root@k8s-master01 pod]# kubectl apply -f pod2.yaml
pod/secret-pod2 created[root@k8s-master01 pod]# kubectl exec secret-pod2 -it -- /bin/sh
/ # env
......
USER_PASSWORD=lzj@lzj
USER_NAME=lzj
......
二、service account 类型 Secret
Serice Account类型的Secret会默认挂载到所有容器中,Serice Account用来访问k8s API,由k8s自动创建,并且创建后会自动挂载到/var/run/secrets/kubernetes.io/serviceaccount目录中。对于每一个pod执行describe命令可以查看到挂载的default-token-sk5fk的secret。
[root@k8s-master01 pod]# kubectl describe pod secret-pod2
Name: secret-pod2
Namespace: default
......Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-sk5fk (ro)
Conditions:Volumes:default-token-sk5fk:Type: Secret (a volume populated by a Secret)SecretName: default-token-sk5fkOptional: false[root@k8s-master01 pod]# kubectl get secret
NAME TYPE DATA AGE
default-token-sk5fk kubernetes.io/service-account-token 3 82d
mysecret Opaque 2 2d2h
mysecret2 Opaque 1 2d
三、kubernetes.io/dockerconfigjson 类型secret
创建docker仓库用来鉴权的registry,比如创建一个对docker hub的鉴权,在k8s中运行容器时,可以直接从docker hub上pull镜像。达到此功能,需创建一个docker-registry类型的secret,然后指定登录docker hub的用户名、密码、邮箱,然后在创建pod时运用该secret即可。
1、首先创建一个docker-registry类型的secret
kubectl create secret docker-registry myregistry --docker-server=hub.docker.com --docker-username=xxxxxxx --docker-password=xxxxxx --docker-email=xxxxx@163.com
2、创建pod,利用secret从docker hub中拉取镜像
apiVersion: v1
kind: Pod
metadata:name: myhello
spec:containers:- name: myhelloimage: softwarebird/my_helloimagePullSecrets:- name: myregistry
通过yaml创建pod,容器会从docker hub上拉取softwarebird/my_hello最新的镜像。
这篇关于3.8 Secret传递敏感数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!