一,介绍
Secret用于存储密码、token、秘钥等敏感数据的配置,从而避免将这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。
【Secret与Configmap对比】
存储方式 | 是否可以Volume挂载 | 是否可以加入容器环境变量中 | |
---|---|---|---|
Configmap | 明文存储 | 是 | 是 |
Secret | 密文存储(base64编码) | 是 | 是 |
二,两种方式
当使用 secret的时,pod 需要引用 secret。两种方式:
- 作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里
- 当 kubelet 为 pod 拉取镜像时,引用secret。
三,3种可选参数
generic: 通用类型,通常用于存储密码数据。
tls:仅用于存储私钥和证书。
docker-registry: 用于保存docker仓库的认证信息。
四,类型
(1)Service Account:
用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
(2)Opaque:
base64编码格式的Secret,用来存储密码、秘钥等。可以通过base64 --decode
解码获得原始数据,因此安全性弱。
(3)kubernetes.io/dockerconfigjson:
用来存储私有docker registry的认证信息。
五,创建和使用
0,yaml创建secret
# vim secret-pod.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque # 指定secret的类型,必须指定
data: # 指定数据
user: a8df5aj2we1r0 # 定义具体数据的key/value
pwd: YW8xsfjM0N66 # 定义具体数据的key/value
下面的案例,将通过命令行的形式创建secret后,测试。
1,通过环境变量引入
1-1【创建secret】
#把mysql的root用户的password创建成secret, 类型generic
kubectl create secret generic mysql-password --from-literal=password=admin123456
1-2【使用secret】
# vim pod-secret
apiVersion: v1
kind: Pod
metadata:
name: myapp-secret
labels:
app: zw-secret
spec:
containers:
- name: zj-secret
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: zj-secret-port
env: # 通过env引入
- name: POD-PASSWORD # 定义注入pod的变量名称
valueFrom: # 数据来源
secretKeyRef: # 采用secret
name: mdy-secret # 采用secret的资源名(提前已经定义)
key: password # 采用secret的资源的哪个字段
1-3【验证secret】
在pod中的secret信息实际已经被解密。
【扩展】:可以通过envFrom字段,直接将secret的定义,注入到容器内。
spec:
containers:
- name: zj-secret
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: zj-secret-port
envFrom: # 数据来源
- secretRef: # 采用secret
name: mdy-secret # 采用的secret资源名(所有定义的变量,都导入容器)
在pod中的secret信息实际已经被解密。
2,通过volume挂载Secret
2-1【创建secret】
#把mysql的用户root名administrator创建成secret, 类型generic
kubectl create secret generic mysql-root --from-literal=root=administrator
2-2【使用secret】
apiVersion: v1
kind: Pod
metadata:
name: myapp-secret-volumes
labels:
app: zw-secret-volumes
spec:
containers:
- name: zj-secret
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: zj-secret-port
volumeMounts: # 容器内 定义挂载
- name: mdy-666 # 指定下面挂载卷的名称,必须一致
mountPath: /tmp/mdy/ # 指定容器内挂载后的目录地址
volumes: # 定义挂载卷
- name: mdy-666 # 定义挂载卷名称,必须与上面一致
secret: # 指定挂载卷类型为secret
secretName: mdy-root # 指定secret的名称(早先定义好生成后)
2-3【验证secret】
在pod中的secret信息实际已经被解密。
六,Secret不是真正加密
- 使用base64“加密”:
echo -n 'admin' | base64
YWRtaW4=
- 使用base64“解密”:
echo 'YWRtaW4=' | base64 -d
admin
“-n”
表示:打印信息之后不换行