K8s configmap和secret

secret和configmap可以理解为特殊的存储卷,但是它们不是给Pod提供存储功能的,而是提供了从集群外部向集群内部的应用注入配置信息的功能。ConfigMap扮演了K8S集群中配置中心的角色。ConfigMap定义了Pod的配置信息,可以以存储卷的形式挂载至Pod中的应用程序配置文件目录,从configmap中读取配置信息;也可以基于环境变量的形式,从ConfigMap中获取变量注入到Pod容器中使用。但是ConfigMap是明文保存的,如果用来保存数据库账号密码这样敏感信息,就非常不安全。一般这样的敏感信息配置是通过secret来保存。secret的功能和ConfigMap一样,不过secret是通过Base64的编码机制保存配置信息。

1. 通过命令行创建ConfigMap

  • 第1种.使用nginx_port=8080nginx_server_name=myapp.lemon.com创建名为my-config的新ConfigMap
[root@s1 ~]# kubectl create configmap my-config --from-literal=nginx_port=8080 --from-literal=nginx_server_name=myapp.lemon.com
configmap/my-config created
  • 第2种.创建一个新ConfigMap名为my-www,指定配置文件内容为www.conf 
[root@s1 ~]# cat www.conf 
server {
        listen 8080;
        server_name myapp02.lemon.com;
        root /data/www;
}

[root@s1 ~]# kubectl create configmap my-www --from-file=./www.conf
configmap/my-www created

2. 通过yaml文件创建ConfigMap

编辑文件:nginx-cm.yaml

[root@s1 ~]# vim nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cm-yaml
  namespace: default
data:
  nginx_server_port: "8088"
  nginx_server_name: "myapp01.lemon.com"

注意:如上,ConfigMap的清单文件相对较简单,它没有spec字段,data字段的内容就是配置信息数据,配置信息数据的值必须用引号包含(如:nginx_server_port: "8088"),否则创建时会报错。

根据清单文件创建ConfigMap

[root@s1 ~]# kubectl apply -f nginx-cm.yaml
configmap/nginx-cm-yaml created

 获取前两步创建的ConfigMap

[root@s1 ~]# kubectl get cm
NAME            DATA   AGE
my-config       2      51m
my-www          1      15m
nginx-cm-yaml   2      49m

注意:cmconfigmap的简写。可通过kubectl api-resources命令查看K8S所有资源和对应简写。

使用ConfigMap

从ConfigMap中获取配置信息的方法有两种:

  • 一种是利用环境变量将配置信息注入Pod容器中的方式,这种方式只在Pod创建的时候生效,这就意味着在ConfigMap中的修改配置信息后,更新的配置不能被已经创建Pod容器所应用。
  • 另一种是将ConfigMap做为存储卷挂载至Pod容器内,这样在修改ConfigMap配置信息后,Pod容器中的配置也会随之更新,不过这个过程会有稍微的延迟。

先来看看通过环境变量注入配置信息的方式:
 

[root@s1 ~]# vim pod-configmap-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-configmap
  labels:
    name: myapp-configmap
    config: configmap
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    env:
    - name: NGINX_SERVER_PORT
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: nginx_port
    - name: NGINX_SERVER_NAME          # 传入Pod容器中的变量名为NGINX_SERVER_NAME,值为      
      valueFrom:
        configMapKeyRef:
          name: my-config              # 选择需要的configmap的名称
          key: nginx_server_name

要点:NGINX_SERVER_PORTNGINX_SERVER_NAME是传入Pod容器内的变量名,它的值是从名为my-config(ConfigMap)中对应的KEY获取NGINX_SERVER_NAME=nginx_server_name=myapp.lemon.com

应用清单文件创建Pod:

[root@s1 ~]# kubectl apply -f pod-configmap-env.yaml 
pod/myapp-configmap created

 进入Pod容器中验证变量是否存在:

从上图可以看出变量已经传入Pod容器中了。

接下来再看一下把ConfigMap当作存储卷挂载至Pod中的用法:

[root@s1 ~]# vim pod-configmap-vol-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-vol-2
  labels:
    name: pod-configmap-vol-2
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: my-cm-www
      mountPath: /etc/nginx/conf.d/       # 将名为my-www的configmap挂载至Pod容器的这个目录下。
  volumes:
  - name: my-cm-www
    configMap:               # 存储卷类型选configMap
      name: my-www           # 选择一个configmap

应用清单文件创建Pod:

[root@s1 ~]# kubectl apply -f pod-configmap-vol-2.yaml
pod/pod-configmap-vol-2 created

进入名为pod-configmap-vol-2的Pod中验证:

[root@s1 ~]# kubectl exec -it pod-configmap-vol-2 -- /bin/sh    
/ # 
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
www.conf
/etc/nginx/conf.d # cat www.conf 
server {
        listen 8080;
        server_name myapp02.lemon.com;
        root /data/www;
}
/etc/nginx/conf.d # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

从上图中可以看出ConfigMap已经挂载至Pod容器中了。

secret功能和configmap一样,只不过secret配置中心存储的配置文件不是明文的,一般将连接数据库的密码、私钥等写在secret中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章