回到目录
k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。
1 secret三种类型
-
Opaque:
base64 编码格式的 Secret,用来存储密码、密钥等
但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
-
Service Account:
用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
-
kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息
2 Opaque类型
Opaque 类型的数据是一个 map 类型,要求value是base64编码
仅仅是对数据进行base64的转码,如果需要增强数据安全性,则需要使用secret的加密插件
2.1 创建
-
创建一个secret
kubectl create secret generic 名称 --from-literal=key=value [ --from-literal=key1=value1]
-
查看所有secret:
kubectl get secret
-
查看详细描述:
kubectl describe secret 名称
-
以yaml格式查看详细描述【可查看value转码后的内容】:
kubectl get secret 名称 -o yaml
#1. 创建一个test-secret
[root@k8s-master1 ~]# kubectl create secret generic test-secret --from-literal=user=root --from-literal=password=dfasges
secret/test-secret created#2. 查看默认命名空间的secret
[root@k8s-master1 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-xdmj5 kubernetes.io/service-account-token 3 6d
test-secret Opaque 2 8s#3. 查看详细描述
#查看secret详细时,只能看见key
[root@k8s-master1 ~]# kubectl describe secret test-secret
Name: test-secret
Namespace: default
Labels: <none>
Annotations: <none>Type: OpaqueData
====
password: 7 bytes
user: 4 bytes#4. 查看yaml格式的描述
#查看yaml格式的详细时,发现进行了转码
[root@k8s-master1 ~]# kubectl get secret test-secret -o yaml
apiVersion: v1
data:password: ZGZhc2dlcw==user: cm9vdA==
kind: Secret
metadata:creationTimestamp: "2023-06-13T03:01:18Z"name: test-secretnamespace: defaultresourceVersion: "731090"uid: 8f1bfb67-45a7-4e60-b6c2-0b4b2541ca5c
type: Opaque#5. 验证
[root@k8s-master1 ~]# echo ZGZhc2dlcw== | base64 -d
dfasges
2.2 yaml创建
value须提前进行base64转码
#secret.yamlapiVersion: v1 # 版本
kind: Secret # 资源类型
metadata: name: mysecret # 名称
type: Opaque # secret类型
data: # 数据
user: YWRtaW4= # key:value
pass: MWYyZDFlMmU2N2Rm
2.3 使用 加载数据卷
#test-projected-volume.yamlapiVersion: v1
kind: Pod
metadata:name: test-projected-volume # pod名称
spec:containers:- name: test-secret-volume # 容器名称image: busyboxargs:- sleep- "86400"volumeMounts: # 挂载数据卷- name: mysql-cred # 需要挂载的数据卷名称mountPath: "/projected-volume"# 挂载到容器路径readOnly: true # 是否只读volumes: # 定义数据卷- name: mysql-cred # 数据卷名称projected:sources:- secret: # 数据卷内容name: test-secret-valume # secret名称
验证:
#1. 进入容器
kubectl exec -it test-secret-valume -- /bin/sh#容器中:
/ # ls
bin etc proc root tmp var
dev home projected-volume sys usr#2. 进入挂载数据卷目录
/ # cd projected-volume//projected-volume # ls
password user#3. 查看内容
/projected-volume # cat password
dfasges
/projected-volume # cat user
root
3 dockerconfigjson
用来创建用户docker registry认证的Secret
docker拉去私人仓库镜像进行登录
直接使用kubectl create命令创建即可
kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
4 SubPath
用途:解决挂载时挂载目录覆盖原目录问题
使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
配置方式:
-
定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
-
在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:......volumeMounts:- mountPath: /etc/nginx/nginx.conf # 挂载到哪里name: config-volume # 使用哪个 configmap 或 secretsubPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:name: nginx-conf # configMap 名字items: # subPath 配置key: nginx.conf # configMap 中的文件名path: etc/nginx/nginx.conf # subPath 路径