k8s基础概念之十一 configmap

configmap

configmap用法:
1.生成容器内的变量环境,
2.设置容器启动命令的启动参数(需要设置环境变量)
3.以volumes的方式挂载为容器内部的文件或目录
    在使用configmap时,需要先创建configmap,然后再在其他对象中引用

 

configmap的两种创建方法:

 kubectl create configmap <map-name> --from-file={文件|文件夹}
 #命令行
 ---
#yaml
 apiVersion: v1
kind: ConfigMap
metadata:
  nginx
data:
  MYSQL_ROOT_PASSWORD: '123456' 
  #定义一个变量,值类型为字符串,所以需要加引号
  my.cnf: |
    [mysqld]
    pid-file                        = /var/run/mysqld/mysqld.pid
    socket                          = /var/run/mysqld/mysqld.sock
    datadir                         = /var/lib/mysql
    character-set-server            = utf8
    log-error                       = /var/log/mysqld.log
    # 中继日志
    relay-log=mysql-relay-bin
    replicate-wild-ignore-table=mysql.%
    replicate-wild-ignore-table=test.%
    replicate-wild-ignore-table=information_schema.%
    
#文件名为 my.cnf 需要换行的话冒号后面需要加 |

 

指定目录创建

#如在/tmp/configmap 有如下文件:
# ll /tmp/configmap/

-rw-r--r-- 1 root root 157 Jun 15 17:19 game.properties
-rw-r--r-- 1 root root  83 Jun 15 17:26 ui.properties

# cat game.properties 
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

# cat ui.properties 
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice


#创建cofigmap:
kubectl create configmap game-config --from-file=/tmp/configmap/


#查看
# kubectl describe configmaps game-config
Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Events:  <none>



---
#同理也可以使用指定文件的方式
kubectl create configmap game-spec --from-file=/tmp/configmap/game.properties
  
---
#也可以在命令行指定键值对一个或多个
kubectl create configmap  man-spec --from-literal=name=config.test --from-literal=value=test

 

在pod中指定引用configmap定义环境变量参数

#pod中指定引用configmap环境变量参数
#如果configmap有以下内容(如果已存在,储存是追加储存而不是覆盖储存,也就是说在原有的内容里面追加内容而不是覆盖掉)
# cat config-map.yaml 

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-test
data: 
  apploglevel: info
  appdatadir: /var/data
  
#******分割线**********

#在pod中引用此configmap
   apiVersion: v1
   kind: Pod
   metadata:
     name: configmap-pod
   spec:
     containers:
       - name: test-container
         image: busybox
         command: [ "/bin/sh", "-c", "env|grep TEST" ]   # 获取只包含TEST开头的环境变量名称
         env:
           # Define the environment variable
           - name: TEST-KEY1                             # 容器中的环境变量参数
             valueFrom:                               # 设置环境变量值的源,无法为空                                  
               configMapKeyRef:                       # 选择configmap中的键
                 # The ConfigMap containing the value you want to assign to TEST-KEY1
                 name: config-test                       # 指定已经存在的config名称
                 key: apploglevel                        # 指定此configmap中需要引用的key
           - name: TEST-KEY2
             valueFrom:
               configMapKeyRef:
                 # The ConfigMap containing the value you want to assign to TEST-KEY2
                 name: config-test                       # 这里可以指定不同configmap
                 key: appdatadir
     restartPolicy: Never                                # 执行完启动命令后将退出,不再被系统自动重启
#******分割线******
解释:这个难理解之处在于name、key所指定的是什么?
    name:这里的name就是上一个yaml所创建的configmap的名字
    key:这里的key就是所指定的config里面所储存的值的name,

 

pod中指定引用configmap的所有参数

   apiVersion: v1
   kind: Pod
   metadata:
     name: test-pod
   spec:
     containers:
       - name: test-container
         image: busybox
         command: [ "/bin/sh", "-c", "env" ]
         envFrom:                             
         - configMapRef:                       # 此处不再指定key
             name: config-test                 # 指定configmap
     restartPolicy: Never
---
#和上面有什么不同
velueFrom换成了envFrom,少了key

 

 

通过velumeMount使用configmap

在定义pod时,将configmap以卷的形式挂载到容器目录中,这就相当于容器直接使用这个配置文件了

apiVersion: v1
kind: Pod
metadata:
  name: volume-test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "ls -l /etc/config/" ]
      volumeMounts:    #挂载数据卷
      - name: config-volume      #挂载数据卷的名字
        mountPath: /etc/config   #挂载到pod里面的目录
  volumes:
    - name: config-volume      # 定义的这个数据卷的名字
      configMap:               #表示应填充此卷的ConfigMap
        # 提供包含所需文件的ConfigMap的名称
        # 添加到容器中
        name: config-test      #使用configmap的名字
  restartPolicy: Never
##mountPath和subPath的区别,mountPath是覆盖挂载,挂载时候会删除里面的所有内容,而subPath不会
#坑1,如果用的是subpath的话,热更新,是不会同步到subpath里面的
#坑2.如果pod的变量来自于configmap和secret中定义的内容,那么configmap和secret更新后,也不会更新pod中的变量
#解决办法,挂载到其他目录然后在做一个链接过去(ln)

 

不可变的congifmap和secret

immutable: true
#加上此参数,则应用变为不可变类型,适合作为安全来使用
#详情:kubectl explain configmap.immutable

 

上一篇:linux系统安装redis实例


下一篇:以太网之ICMP