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