Kubernetes配置与密钥管理
ConfigMap可以实现将应用程序的配置信息与容器镜像分离,以便在不重新构建镜像的情况下进行配置的修改和更新。
Secret的主要作用是保管私密数据,如密码、Auth Tokens、SSH Keys 等信息。这些私密信息放在 Secret 对象中比直接放在 Pod 或 Docker Image 中更加安全,也更方便管理。
- ConfigMap
kubernetes集群可以使用ConfigMap来实现对容器中应用的配置进行管理
(就是可以把一些应用的conf文件内容写到里面)。
可以把ConfigMap看作是一个挂载到pod中的存储卷
[root@master ~]# kubectl create configmap cm1 --from-literal host=127.0.0.1 --from-literal port=3306
[root@master ~]# kubectl get cm
[root@master ~]# kubectl describe cm cm1
通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径:
[root@master ~]# echo -n 127.0.0.1 > host
[root@master ~]# echo -n 3306 > port
[root@master ~]# kubectl create configmap cm2 --from-file ./host --from-file ./port
[root@master ~]# kubectl describe cm cm2
通过一个文件内多个键值对,--from-env-file=文件路径
[root@master ~]# vim env.txt
添加:
host=127.0.0.1
port=3306
[root@master ~]# kubectl create configmap cm3 --from-env-file=env.txt
configmap/cm3 created
[root@master ~]# kubectl describe cm cm3
Name: cm3
Namespace: default
Labels:
Annotations:
Data
====
host:
----
127.0.0.1
port:
----
3306
Events:
[root@master ~]# vim cm4.yml
添加:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm4
data:
host: 127.0.0.1
port: "3306"
[root@master ~]# kubectl apply -f cm4.yml
configmap/cm4 created
[root@master ~]# kubectl describe cm cm4
Name: cm4
Namespace: default
Labels:
Annotations:
Data
====
host:
----
127.0.0.1
port:
----
3306
Events:
[root@master ~]# 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@master ~]# kubectl apply -f pod-cm1.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec pod-cm1 -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=pod-cm1
host=127.0.0.1 # 我们创建的configmap传进去的env
port=3306 # 我们创建的configmap传进去的env
[root@master ~]# 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@master ~]# kubectl apply -f pod-cm2.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec pod-cm2 -- cat /etc/mysql/host
[root@master ~]# kubectl exec pod-cm2 -- cat /etc/mysql/port
将nginx的配置文件nginx.conf以configmap的方式应用到容器内
提前准备nginx.conf文件
[root@master ~]# echo "test-test" > nginx.conf #产生测试用的nginx.conf文件
[root@master ~]# kubectl create configmap nginxconf --from-file=/root/nginx.conf
[root@master ~]# kubectl describe cm nginxconf
[root@master ~]# 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@master ~]# kubectl apply -f pod-nginxconf.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf
如果修改了value, 那么容器内部会不会更新?
ConfigMap热更新方式
通过环境变量的方式传递给pod。这种方式不会热更新
通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。
[root@master ~]# kubectl edit cm nginxconf
修改test-test 为 test-page 第八行
[root@master ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf # 等待一会
[root@master01 ~]# kubectl edit cm cm1
apiVersion: v1
data:
host: 127.0.0.1
port: "6666"
kind: ConfigMap
......
[root@master01 ~]# kubectl exec pod-cm1 -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=pod-cm1
port=3306
host=127.0.0.1
- Secret
Secret与ConfigMap类似,主要区别是ConfigMap存储的是明文,而secret存储的是密文。
ConfigMap可以用作配置文件管理,而Secret用于密码、密钥、token等敏感数据配置管理
Opaque(不透明的) ,用来存储密码、密钥、敏感信息、证书等,base64编码格式的Secret,符合这种需求的都可以使用
用来存储私有docker registry的认证信息,连接镜像仓库用,类型标识为docker-registry。
用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。
[root@master ~]# 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]
Opaque类型密码需要进行base64编码
[root@master ~]# echo -n 123 |base64
MTIz
假设密码为123,得到的编码为MTIz
[root@master ~]# vim secret-mysql.yml
添加:
apiVersion: v1
kind: Secret
metadata:
name: secret-mysql
data:
password: MTIz
[root@master ~]# kubectl apply -f secret-mysql.yml
[root@master ~]# kubectl get secret
Opaque 是最常见的 Secret 类型,它通常用于存储任意的键值对,这些键值对可以是配置信息、密码、令牌等。
[root@master ~]# kubectl describe secrets secret-mysql
编写pod的YAML文件使用Secret
[root@master ~]# 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@master ~]# kubectl apply -f pod-mysql-secret.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec -it pod-mysql-secret1 -- env
...
MYSQL_ROOT_PASSWORD=123
...
[root@master ~]# kubectl exec -it pod-mysql-secret1 -- bash
root@pod-mysql-secret1:/# mysql -uroot -p123 #进入pod,使用传递的密码登录
... ...
mysql>exit
编写pod的YAML文件使用Secret
[root@master ~]# 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@master ~]# kubectl apply -f pod-mysql-secret2.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
123
热更新:
[root@master ~]# echo -n 123456 | base64
MTIzNDU2
[root@master ~]# kubectl edit secrets secret-mysql
apiVersion: v1
data:
password: MTIzNDU2
kind: Secret
。。。
pod-mysql-secret2已更新
[root@master ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
123456
pod-mysql-secret1未更新
[root@master ~]# kubectl exec -it pod-mysql-secret -- env
...
MYSQL_ROOT_PASSWORD=123
...