38-存储-Secret
2022-02-15 本文已影响0人
紫荆秋雪_文
k8s系统存储挂载原理.png
一、Secret特点
- secret 卷用来给 Pod 传递
敏感信息
,例如密码、OAuth令牌和SSH密钥 - 将secret存储在kubernetes API 服务器上,然后以文件的形式挂载到 Pod 中,无需直接与 kubernetes 耦合
- secret 卷由 tmpfs (基于 RAM 的文件系统)提供存储
- 使用前必须先在kubernetes API 中创建secret
- 容器以
subPath
卷挂载方式挂载 Secret 时,将感知不到 Secret 的更新
二、Secret
1、Secret 概览
Pod可以通过下面三种方式来使用 Secret
- 作为挂载到一个或多个容器上的 卷 中的文件
- 作为 容器的环境变量
- 由 kubectl 在为 Pod 拉取镜像时使用
2、编写 Secret 配置文件注意点
-
data
字段中所有键值都必须是base64
编码的字符串 -
stringData
字段,可以使用任何字符串作为其取值
3、Secret 类型 Secret-type类型.png
三、创建Secret,type为Opaque
1、不知如何书写secret yaml文件时,使用下面命令
kubectl explain secret
2、无需base64编码
apiVersion: v1
kind: Secret
metadata:
name: secret-01
namespace: raven
stringData:
username1: admin
password1: 123456
username2: admin2
password2: 123456-2
username3: admin3
password3: 123456-3
3、secret创建成功
image.png4、检查 Secret
kubectl get secret secret-01 -n raven -oyaml
5、使用secret-01
- 创建一个使用 Secret 的 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret-deployment
namespace: raven
labels:
app: secret-deployment
spec:
selector:
matchLabels:
app: secret-use-pod
replicas: 1
template:
metadata:
labels:
app: secret-use-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: "secret-01" # 必须要与volumes.name 相同
mountPath: "/app" # 容器中挂载卷的位置
readOnly: true
volumes:
- name: secret-01 # 卷名称
secret:
secretName: secret-01 # 创建的 Secret 名称
- 容器中app目录 image.png
6、修改Secret后,Pod有感知
四、创建Secret,type为Opaque带base64编码
1、给“admin” base64编码
echo -n 'admin' | base64
结果: YWRtaW4=
2、创建需要base-64的Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-opaque-base64
namespace: raven
type: Opaque
data:
username1: YWRtaW4x
password1: cHcxMTE=
username2: YWRtaW4y
password2: cHcyMjI=
username3: YWRtaW4z
password3: cHczMzM=
3、创建使用Secret的 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret-deployment-base64
namespace: raven
labels:
app: secret-deployment-base64
spec:
selector:
matchLabels:
app: secret-use-pod-base64
replicas: 1
template:
metadata:
labels:
app: secret-use-pod-base64
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: app-base64 # 必须要与volumes.name 相同
mountPath: "/app" # 容器中挂载卷的位置
readOnly: true
volumes:
- name: app-base64 # 卷名称
secret:
secretName: secret-opaque-base64 # 创建的 Secret 名称
4、进入容器查看挂载卷 image.png
5、Pod 感知 Secret 修改
- 编译 Secret 并且重新apply image.png
- Pod 感知Secret 修改 image.png
五、Secret 其他特性
1、将 Secret 键名映射到特定路径
使用
spec.volumes[].secret.items
字段修改每个键对应的目标路径
- yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret-deployment-base64
namespace: raven
labels:
app: secret-deployment-base64
spec:
selector:
matchLabels:
app: secret-use-pod-base64
replicas: 1
template:
metadata:
labels:
app: secret-use-pod-base64
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: app-base64 # 必须要与volumes.name 相同
mountPath: "/app" # 容器中挂载卷的位置
readOnly: true
volumes:
- name: app-base64 # 卷名称
secret:
secretName: secret-opaque-base64 # 创建的 Secret 名称
items:
- key: username1
path: items/un
- 使用
spec.volumes[].secret.items
后,只有在items
中指定的键会被映射 image.png - 在容器中文件的路径为
spec.containers.volumeMounts.mountPath
+spec.volumes.secret.items.path
/app/items/un
2、Secret 文件权限,目前无法修改
默认 Secret文件为只读.png3、以环境变量的形式使用 Secrets
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret-deployment-base64
namespace: raven
labels:
app: secret-deployment-base64
spec:
selector:
matchLabels:
app: secret-use-pod-base64
replicas: 1
template:
metadata:
labels:
app: secret-use-pod-base64
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: app-base64 # 必须要与volumes.name 相同
mountPath: "/app" # 容器中挂载卷的位置
readOnly: true
env:
- name: UN1
valueFrom:
secretKeyRef:
name: secret-opaque-base64
key: username1
volumes:
- name: app-base64 # 卷名称
secret:
secretName: secret-opaque-base64 # 创建的 Secret 名称
items:
- key: username1
path: items/un
获取环境变量.png
4、Secret 更新之后对应的环境变量不会被更新
- 修改 Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-opaque-base64
namespace: raven
type: Opaque
data:
username1: YWRtaW4xMTE=
password1: cHcxMTE=
username2: YWRtaW4y
password2: cHcyMjI=
username3: YWRtaW4z
password3: cHczMzM=
- 环境变量不更新 环境变量不更新.png
- 挂载可更新 image.png