Kubernetes 配置与密钥管理
Kubernetes 配置与密钥管理
配置:修改配置容器,pod不需要进入容器,容器外可以直接修改。
密钥:不放在容器和镜像中,存储在单独的文件中并放在宿主机上,更安全。
Kubernetes 提供了多种机制来管理应用配置和敏感信息,主要包括 ConfigMap 和 Secret 两种核心资源。
ConfigMap 用于存储非敏感的配置数据,以键值对形式存储。
Secret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。
- ConfigMap
1. 什么是configmap
kubernetes集群可以使用ConfigMap来实现对容器中应用的配置进行管理(就是可以把一些应用的conf文件内容写到里面)。可以把ConfigMap看作是一个挂载到pod中的存储卷。
2. 创建configmap的4中方式
方法一:在命令行指定参数创建
[root@master01 ~]# kubectl create configmap cm1 --from-literal host=127.0.0.1 --from-literal port=3306
[root@master01 ~]# kubectl get cm

[root@master01 ~]# kubectl describe cm cm1

方法二:在命令行通过多个文件创建
通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径:
[root@master01 ~]# echo -n 127.0.0.1 > host
[root@master01 ~]# echo -n 3306 > port
[root@master01 ~]# kubectl create configmap cm2 --from-file ./host --from-file ./port
[root@master01 ~]# kubectl describe cm cm2

方法三:命令行通过文件提供多个键值对创建
通过一个文件内多个键值对,--from-env-file=文件路径
[root@master01 ~]# vim env.txt
添加:
host=127.0.0.1
port=3306
保存退出
[root@master01 ~]# kubectl create configmap cm3 --from-env-file=env.txt
[root@master01 ~]# kubectl describe cm cm3

方法四:通过YAML资源清单文件创建
[root@master01 ~]# vim cm4.yml
添加:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm4
data:
host: 127.0.0.1
port: "3306"
保存退出
[root@master01 ~]# kubectl apply -f cm4.yml
[root@master01 ~]# kubectl describe cm cm4

3. ConfigMap的2种使用方式
方式一:通过环境变量的方式传递给pod
[root@master01 ~]# vim pod-cm1.yml
添加:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm1
spec:
containers:
- name: busybox
image: busybox
args: [ "/bin/sh", "-c", "sleep 10000" ]
envFrom: # env方式
- configMapRef:
name: cm1 # configmap名称
保存退出
[root@master01 ~]# kubectl apply -f pod-cm1.yml
[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec pod-cm1 -- env

方式二:通过volume的方式挂载到pod内
Pod-cm2是通过两个文件创建的(host,pord),所以通过volume的方式挂载到pod内之后可以看到两个文件。
[root@master01 ~]# vim pod-cm2.yml
添加:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm2
spec:
containers:
- name: busybox
image: busybox
args: [ "/bin/sh", "-c", "sleep 10000" ]
volumeMounts: # 用volume挂载方式
- name: vol-cm # 对应下面的volume名
mountPath: "/etc/mysql" # 挂载到容器内部的路径
readOnly: true # 只读
volumes:
- name: vol-cm # 卷名称
configMap:
name: cm2 # configmap的名称
保存退出
[root@master01 ~]# kubectl apply -f pod-cm2.yml
[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec pod-cm2 -- cat /etc/mysql/host
127.0.0.1[root@master01 ~]#
[root@master01 ~]# kubectl exec pod-cm2 -- cat /etc/mysql/port
3306[root@master01 ~]#
或者进入容器查看:[root@master01 ~]# kubectl exec -it pod-cm2 /bin/sh


应用举例
将nginx的配置文件nginx.conf以configmap的方式应用到容器内
[root@master01 ~]# echo "test-test" > nginx.conf
[root@master01 ~]# kubectl create configmap nginxconf --from-file=/root/nginx.conf
[root@master01 ~]# kubectl describe cm nginxconf

[root@master01 ~]# vim pod-nginxconf.yml
添加:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts: # 用volume挂载方式
- name: vol-nginx # 对应下面的volume名
mountPath: "/testdir" # 挂载到容器内部的路径
readOnly: true # 只读
volumes:
- name: vol-nginx # 卷名称
configMap:
name: nginxconf # configmap的名称
保存退出
[root@master01 ~]# kubectl apply -f pod-nginxconf.yml
[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf
test-test
4. ConfigMap的热更新(两种方式)
通过环境变量的方式传递给pod。这种方式不会热更新
通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。
Volume的方式实现热更新:(生产环境中用的较多)
[root@master01 ~]# kubectl edit cm nginxconf

保存退出
![]()
[root@master01 ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf
![]()
好处:不用进入容器,安全,操作完之后查看时可能需要等待一下!!!
环境变量的方式修改:
Cm修改的是configmap(目前k8s对于环境变量的方式不支持热更新)
[root@master01 ~]# kubectl edit cm cm1
修改:

保存退出
[root@master01 ~]# kubectl exec pod-cm1 – env

********************************************************************************************
- Secret
1. 什么是secret
Secret与ConfigMap类似,主要区别是ConfigMap存储的是明文,而secret存储的是密文。
ConfigMap可以用作配置文件管理,而Secret用于密码、密钥、token等敏感数据配置管理
2. secret的三种类型
-
-
- generic(通用的)
-
Opaque(不透明的) ,用来存储密码、密钥、敏感信息、证书等,base64编码格式的Secret,符合这种需求的都可以使用
-
-
- kubernetes.io/dockerconfigjson:
-
用来存储私有docker registry的认证信息,连接镜像仓库用,类型标识为docker-registry。
-
-
- kubernetes.io/tls:
-
用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。
[root@master01 ~]# kubectl create secret -h

3. secret应用案例
1. 将明文密码进行base64编码
[root@master01 ~]# echo -n 123 |base64
MTIz
2. 编写创建secret的YAML文件
[root@master01 ~]# vim secret-mysql.yml
添加:
apiVersion: v1
kind: Secret
metadata:
name: secret-mysql
data:
password: MTIz
保存退出
3. 创建secret并确认
[root@master01 ~]# kubectl apply -f secret-mysql.yml
[root@master01 ~]# kubectl get secret

Opaque 是最常见的 Secret 类型,它通常用于存储任意的键值对,这些键值对可以是配置信息、密码、令牌等。
[root@master01 ~]# kubectl describe secrets secret-mysql

4. secret的两种使用方式
- 通过环境变量的方式传递给pod
编写pod的YAML文件使用Secret
[root@master01 ~]# 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: # secretKey引用
name: secret-mysql # 对应创建的secret名字
key: password
保存退出
[root@master01 ~]# kubectl apply -f pod-mysql-secret.yml
[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec -it pod-mysql-secret1 – env

[root@master01 ~]# kubectl exec -it pod-mysql-secret1 -- bash
bash-4.2# mysql -uroot -p

- 通过volume的方式挂载到pod内(建议使用)
[root@master01 ~]# 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" # 挂载目录(支持热更新)
readOnly: true # 只读
volumes:
- name: vol-secret # 定义卷名
secret: # 使用secret
secretName: secret-mysql # 对应创建好的secret名
保存退出
验证:
[root@master01 ~]# kubectl apply -f pod-mysql-secret2.yml
[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
123[root@master01 ~]#
热更新:
123[root@master01 ~]# echo -n 123456 | base64
MTIzNDU2
[root@master01 ~]# kubectl edit secrets secret-mysql

保存退出
pod-mysql-secret2已更新:
[root@master01 ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
123456[root@master01 ~]#
pod-mysql-secret1未更新:
[root@master01 ~]# kubectl exec -it pod-mysql-secret1 – env

更新的是文件,Mysql本身是无法实现热更新的!!!
更多推荐


所有评论(0)