理解Secrets
Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
用户可以创建自己的secret,系统也会有自己的secret。
Pod需要先引用才能使用某个secret,Pod有2种方式来使用secret:作为volume的一个域被一个或多个容器挂载;在拉取镜像的时候被kubelet引用。
Secrets相当于加密后的配置中心,使用base64编码,并不是真正意义上的加密,只是相对于明文来讲的安全
Secrets的三种类型
# kubectl get secrets --all-namespaces
NAMESPACE NAME TYPE DATA AGE
cattle-system cattle-credentials-466ab77 Opaque 2 32d
xxxx-dev default-token-5hkt9 kubernetes.io/service-account-token 3 12d
xxxx-dev regsecret kubernetes.io/dockerconfigjson 1 12d
- Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
- kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
- kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
创建Secrets的三种方法
# kubectl create secret --help
Available Commands:
docker-registry Create a secret for use with a Docker registry
// 用于存储docker私有仓库的账号密码信息
generic Create a secret from a local file, directory or literal value
// 用于存储数据库密码等需要加密的信息
tls Create a TLS secret
// 用于证书使用
创建Opaque类型的secret
# 创建一个名为mysql-password,类型为generic,键值为root-password,密码为P@ssW0rd的secret
# kubectl create secret generic mysql-password --from-literal=root-password=P@ssW0rd
secret/mysql-password created
# 只显示了key, value没有显示,只显示8位字符
# kubectl describe secrets mysql-password
Name: mysql-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
root-password: 8 bytes
# 导出格式为yaml的文件,可以看到root-password对于的值已经使用base64的方式加密
# kubectl get secrets mysql-password -o yaml
apiVersion: v1
data:
root-password: UEBzc1cwcmQ=
kind: Secret
metadata:
creationTimestamp: "2019-03-28T05:38:16Z"
name: mysql-password
namespace: default
resourceVersion: "9102868"
selfLink: /api/v1/namespaces/default/secrets/mysql-password
uid: af9cb76c-511b-11e9-acb5-8cec4b5f0fe5
type: Opaque
使用base64反解密
# echo UEBzc1cwcmQ= | base64 -d
P@ssW0rd
创建kubernetes.io/dockerconfigjson类型的secret
kubectl create -n NAMESPACES secret docker-registry SECRETNAME \
--docker-server=private.docker.com \
--docker-username=username \
--docker-password=password \
--docker-email=misterbyj@163.com
---
-n 指定命名空间
--docker-server 指定仓库地址
--docker-username 用户名
--docker-password 密码
--docker-email 邮件地址
查看yaml格式
[root@k8sMaster01 deployment]# kubectl -n NAMESPACES get secret SECRETNAME --output=yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJwcml2YXRlLndpbmNoYW5uZWwubmV0Ijp7InVzZXJuYW1lIjoid2luY2hhbm5lbCIsInBhc3N3b3JkIjoid2luY2hhbm5lbDIwMTgiLCJlbWFpbCI6ImJhaXlvbmdqaWVAd2luY2hhbm5lbC5uZXQiLCJhdXRoIjoiZDJsdVkyaGhibTVsYkRw
kind: Secret
metadata:
creationTimestamp: 2018-12-27T11:29:27Z
name: SECRETNAME
namespace: NAMESPACES
resourceVersion: "177507"
selfLink: /api/v1/namespaces/NAMESPACES/secrets/SECRETNAME
uid: ab7378a8-09ca-11e9-bed3-525400a92dc9
type: kubernetes.io/dockerconfigjson
修改Pod yaml文件
# 新增加imagePullSecrets, 参数为刚创建的regsecret
containers:
name: base-config
image: private.winchannel.net/winchannel/base-config:0.1.0-stable
imagePullSecrets:
- name: SECRETNAME
Secret与ConfigMap对比
相同点
- key/value的形式
- 属于某个特定的namespace
- 可以导出到环境变量
- 可以通过目录/文件形式挂载(支持挂载所有key和部分key)
不同点
- Secret可以被ServerAccount关联(使用)
- Secret可以存储register的鉴权信息,用在ImagePullSecret参数中,用于拉取私有仓库的镜像
- Secret支持Base64加密
- Secret分为kubernetes.io/Service Account,kubernetes.io/dockerconfigjson,Opaque三种类型,Configmap不区分类型
- Secret文件存储在tmpfs文件系统中,Pod删除后Secret文件也会对应的删除。
网友评论