配置管理中心Secret
Secret是什么?
Configmap一般是用来存放明文数据的,如配置文件,对于一些敏感数据,如密码、私钥等数据时,要用secret类型
Secret解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。
要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用。
secret可选参数有三种:
- generic: 通用类型,通常用于存储密码数据。
- tls:此类型仅用于存储私钥和证书。
- docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。
Secret类型:
Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
Opaque:base64编码格式的Secret,用来存储密码、秘钥等。可以通过base64 --decode解码获得原始数据,因此安全性弱
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
使用Secret
1.通过环境变量引入Secret
#把mysql的root用户的password创建成secret
[root@master01 ~]# kubectl create secret generic mysql-password --from-literal=password=xianchaopod**lucky66
[root@master01 ~]# kubectl get secret NAME TYPE DATA AGE default-token-xfnps kubernetes.io/service-account-token 3 11d mysql-password Opaque 1 7s nfs-provisioner-token-bk4gj kubernetes.io/service-account-token 3 41h
[root@master01 ~]# kubectl describe secret mysql-password Name: mysql-password Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 20 bytes
#password的值是加密的,
#但secret的加密是一种伪加密,它仅仅是将数据做了base64的编码.
#创建pod,引用secret
[root@master01 ~]# cat pod-secret.yaml apiVersion: v1 kind: Pod metadata: name: pod-secret labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 env: - name: MYSQL_ROOT_PASSWORD #它是Pod启动成功后,Pod中容器的环境变量名. valueFrom: secretKeyRef: name: mysql-password #这是secret的对象名 key: password #它是secret中的key名
[root@master01 ~]# kubectl apply -f pod-secret.yaml
[root@master01 ~]# kubectl exec -it pod-secret -- /bin/sh # printenv MYSQL_ROOT_PASSWORD=xianchaopod**lucky66
2.通过volume挂载Secret
1)创建Secret
手动加密,基于base64加密
[root@master01 ~]# echo -n 'admin' | base64 YWRtaW4= [root@master01 ~]# echo -n 'hwf123456f' | base64 aHdmMTIzNDU2Zg==
解码:
[root@master01 ~]# echo aHdmMTIzNDU2Zg== | base64 -d hwf123456f
2)创建yaml文件
[root@master01 ~]# cat secret.yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= #key值自己定义 password: aHdmMTIzNDU2Zg==
[root@master01 ~]# kubectl apply -f secret.yaml
[root@master01 ~]# kubectl describe secret mysecret Name: mysecret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 10 bytes username: 5 bytes
3)将Secret挂载到Volume中
[root@master01 ~]# cat pod_secret_volume.yaml apiVersion: v1 kind: Pod metadata: name: pod-secret-volume spec: containers: - name: myapp image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 volumeMounts: - name: secret-volume mountPath: /etc/secret readOnly: true volumes: - name: secret-volume secret: secretName: mysecret
[root@master01 ~]# kubectl apply -f pod_secret_volume.yaml pod/pod-secret-volume created [root@master01 ~]# kubectl exec -it pod-secret-volume -- /bin/sh / # ls /etc/secret password username / # cat /etc/secret/username admin/ # cat /etc/secret/password hwf123456f/ #
#由上可见,在pod中的secret信息实际已经被解密。

评论