2020-04-14 Kubernetes—volume Secret ConfigMap

本文将介绍最后两种特殊的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
image.png
更新

更新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内容全部结束


image.png

你可能感兴趣的:(2020-04-14 Kubernetes—volume Secret ConfigMap)