您现在的位置是:首页 >技术杂谈 >Kubernetes密钥管理Secret网站首页技术杂谈
Kubernetes密钥管理Secret
简介Kubernetes密钥管理Secret
Kubernetes密钥管理 SecretMap
一、Secret
1.1 什么是secret
-
Secret与ConfigMap类似,主要的区别是ConfigMap存储的是明文,而Secret存储的是密文。
-
ConfigMap可以用配置文件管理,而Secret可用于密码、密钥、token等敏感数据的配置管理。
1.2 secret类型
Secret有4种类型:
- Opaque: base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic
- Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount目录中
- kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息,类型标识为docker-registry。
- kubernetes.io/tls: 用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。
[root@k8s-master1 ~]# kubectl create secret -h
Create a secret using specified subcommand.
Available Commands:
docker-registry Create a secret for use with a Docker registry
generic Create a secret from a local file, directory or literal value
tls Create a TLS secret
Usage:
kubectl create secret [flags] [options]
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
1.3 Secret应用案例
创建mysql管理员密码Secret案例,使用Opaque类型来创建mysql密码Secret
1.3.1 将明文密码进行base64编码
Opaque类型密码需要进行base64编码
[root@k8s-master1 ~]# echo -n 123 |base64
MTIz
假设密码为123,得到的编码为MTIz
1.3.2 编写创建secret的YAML文件
[root@k8s-master1 ~]# vim secret-mysql.yml
apiVersion: v1
kind: Secret
metadata:
name: secret-mysql
data:
password: MTIz
1.3.3 创建secret并确认
[root@k8s-master1 ~]# kubectl apply -f secret-mysql.yml
secret/secret-mysql created
[root@k8s-master1 ~]# kubectl get secret |grep secret-mysql
secret-mysql Opaque 1 40s
1.4 Secret的2种使用方式
1.4.1 通过环境变量的方式传递给pod
- 编写pod的YAML文件使用Secret
[root@k8s-master1 ~]# vim pod-mysql-secret.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-mysql-secret1
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: secret-mysql # 对应创建的secret名字
key: password
2.创建pod
[root@k8s-master1 ~]# kubectl apply -f pod-mysql-secret.yml
pod/pod-mysql-secret1 created
3.验证pod
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-mysql-secret1 1/1 Running 0 1m46s
4.验证传入pod的变量效果
[root@k8s-master1 ~]# kubectl exec -it pod-mysql-secret1 -- /bin/bash
root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=123
root@pod-mysql-secret1:/# mysql -p123
1.4.2 通过volume的方式挂载到pod内
1.编写pod的YAML文件使用Secret
[root@k8s-master1 ~]# vim pod-mysql-secret2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-mysql-secret2
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 100000
volumeMounts:
- name: vol-secret # 定义挂载的卷,对应下面定义的卷名
mountPath: "/opt/passwd" # 挂载目录(支持热更新),也可以使用subPath挂载文件(但不支持热更新)
readOnly: true # 只读
volumes:
- name: vol-secret # 定义卷名
secret: # 使用secret
secretName: secret-mysql # 对应创建好的secret名
2.创建pod
[root@k8s-master1 ~]# kubectl apply -f pod-mysql-secret2.yml
pod/pod-mysql-secret2 created
3.验证pod
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-mysql-secret2 1/1 Running 0 15m
4.验证
[root@k8s-master1 ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
123 在容器内都被解码了
5.热更新测试
[root@k8s-master1 ~]# echo -n haha123 |base64
aGFoYTEyMw==
[root@k8s-master1 ~]# kubectl edit secret secret-mysql
apiVersion: v1
data:
password: aGFoYTEyMw== 密码改成haha123的base64编码
kind: Secret
metadata:
[root@k8s-master1 ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
haha123 过一会儿,确认密码确实更新了
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。