本文将介绍最后两种特殊的Volume,Secret和ConfigMap。
这两种存储卷都是用来分离镜像文件和配置文件的,使容器化的应用程序具有可移植性。实现解耦。
传统注入配置信息的方式有:在启动容器的时通过命令传递参数、或将定义好的配置文件写入到镜像文件中、或者通过环境变量的方式写入到pod配置清单中......
但是当我们需要修改配置文件的时候,不能每修改一次配置文件就重新做一次镜像,再将修改的镜像应用到所有pod之上,这样也未免也太麻烦了,而且在传递敏感信息的时候,也不可避免会有信息泄露的风险。所以Kubernetes引入了两个概念,ConfigMap和Secret。
区别:
Secret是用来传递敏感信息。如用户名、密码等。
ConfigMap是用来传递普通配置信息,如端口、主机名等。
详细解析:
Secret:
共有四种类型
- 1 - Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
- 2 - Opaque:base64编码格式的Secret,用来存储密码、秘钥、信息、证书等,类型标识符为generic
- 3 - kubernetes.io/dockerconfigjson: 用来存储docker registry的认证信息,类型标识为docker-registry
- 4 - kubernetes.io/tls: 用于为SSL通信模式存储证书和秘钥文件,类型标识为tls
创建Secret的4种方式:
- 1 -
--from-literal
[root@k8s-master ~]# kubectl create secret generic mysecret --from-literal=uaername=admin --from-literal=password=123456
secret/mysecret created
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 6s
- 2 -
--from-file
[root@k8s-master ~]# echo -n admin > ./username
[root@k8s-master ~]# echo -n 123456 > ./password
[root@k8s-master ~]# kubectl create secret generic mysecret --from-file=./username --from-file=./password
secret/mysecret created
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 6s
- 3 -
--from-env-file
[root@k8s-master ~]# cat << EOF > env.txt
> username=admin
> password=123456
> EOF
[root@k8s-master ~]# kubectl create secret generic mysecret --from-env-file=./env.txt
secret/mysecret created
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 10s
- 4 - 通过配置清单创建
#先将敏感数据加密base64
[root@k8s-master ~]# echo -n admin | base64
YWRtaW4=
[root@k8s-master ~]# echo -n 123456 |base64
MTIzNDU2
[root@k8s-master ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
data:
username:YWRtaW4=
password: MTIzNDU2
[root@k8s-master ~]# kubectl apply -f secret.yaml
secret/mysecret created
[root@k8s-master ~]# kubectl get secret #查看存在的 secret,显示有2条数据
NAME TYPE DATA AGE
mysecret Opaque 2 8s
[root@k8s-master ~]# kubectl describe secret mysecret #查看数据的 Key
Name: mysecret
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
username: 5 bytes
password: 6 bytes
[root@k8s-master ~]# kubectl edit secret mysecret #查看具体的value,可以使用该命令
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
......
[root@k8s-master ~]# echo -n MTIzNDU2 |base64 --decode #通过 base64 将 Value 反编码:
123456
[root@k8s-master ~]# echo -n YWRtaW4= |base64 --decode
admin
如何使用Secret
Pod可以通过volume和环境变量的方式使用Secret,区别是通过volume使用Secret稍显麻烦,但是支持动态更新,通过环境变量使用Secret十分便捷,但是不支持动态更新
通过volume演示:
[root@k8s-master volumes]# cat pod-secret-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-Secret
spec:
containers:
- name: pod-Secret
image: ikubernetes.io/myapp:v1
volumeMounts:
- name: v1
mountPath: /etc/v1
readOnly: true
volumes:
- name: v1
secret:
secretName: mysecret
[root@k8s-master volumes]# kubectl apply -f pod-secret-demo.yaml
pod/pod-secret created
[root@k8s-master volumes]# kubectl get pods
pod-Secret 1/1 Running 0 1m
[root@k8s-master volumes]# kubectl exec -it pod-Secret sh
/ # ls /etc/v1/
password username
/ # cat /etc/v1/username
admin
/ # cat /etc/v1/password
123456
如果想指定存放的文件名可在volumes字段下面加上items,并指定文件名,可以这样写yaml
[root@k8s-master volumes]# cat pod-secret-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret
spec:
containers:
- name: pod-secret
image: ikubernetes.io/myapp:v1
volumeMounts:
- name: v1
mountPath: "/etc/v1"
readOnly: true
volumes:
- name: v1
secret:
secretName: mysecret
items: #自定义存放数据的文件名
- key: username
path: my-secret/my-username
- key: password
path: my-secret/my-password
更新
更新Secret的内容直接修改Secret的yaml文件并kubectl apply -f 即可
更新是需要一点时间才能同步到Pod中去的,时间并不固定也许是几秒也许是几十秒
通过环境变量env演示
[root@k8s-master volumes]# vim pod-secret-env-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-env
spec:
containers:
- name: pod-secret-env
image: busybox
args:
- /bin/sh
- -c
- sleep 10;touch /tmp/healthy;sleep 30000
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@k8s-master volumes]# kubectl apply -f pod-secret-env-demo.yaml
pod/pod-secret-env created
[root@k8s-master volumes]# kubectl exec -it pod-secret-env sh
/ # echo $SECRET_USERNAME
admin
/ # echo $SECRET_PASSWORD
abcdef
这种属于一次性注入,不支持动态修改。下面介绍ConfigMap
ConfigMap
其实这两者极其相似,只是用法不同
ConfigMap同样可以通过 --from-literal
--from-file
清单
等方式创建
这里只举一个通过volume挂载的演示,并动态更新(和Secret有点不同)
[root@k8s-master volumes]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.magedu.com
configmap/nginx-config created
[root@k8s-master volumes]# kubectl get cm
NAME DATA AGE
nginx-config 2 6s
[root@k8s-master volumes]# kubectl describe cm nginx-config
Name: nginx-config
Namespace: default
Labels:
Annotations:
Data
====
server_name:
----
myapp.magedu.com
nginx_port:
----
80
Events:
[root@k8s-master configmap ~]# vim pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/config.d/
readOnly: true
volumes:
- name: nginxconf
configMap:
name: nginx-config
[root@k8s-master configmap ~]# kubectl apply -f pod-configmap-2.yaml
pod/pod-cm-2 created
[root@k8s-master configmap ~]# kubectl get pods
[root@k8s-master configmap ~]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cd /etc/nginx/config.d
/ # cat nginx_port
80
/ # cat server_name
myapp.magedu.com
[root@k8s-master configmap ~]# kubectl edit cm nginx-config #修改端口,再在容器中查看端口是否变化。
apiVersion: v1
data:
nginx_port: "800"
......
/ # cat nginx_port
800
到此关于Kubernetes-Volume内容全部结束