【云原生|Kubernetes】11-ConfigMap解析

【云原生Kubernetes】11-ConfigMap解析

文章目录

  • 【云原生Kubernetes】11-ConfigMap解析
    • 简介
    • ConfigMap的作用
    • 了解ConfigMap和Pod
    • 创建ConfigMap
      • 使用--from-file基于一个目录来创建 ConfigMap
      • 使用--from-file基于文件创建 ConfigMap
        • 定义从文件创建 ConfigMap 时要使用的键
      • 使用--from-env-file选项基于 env 文件创建 ConfigMap
      • 使用--from-literal根据字面值创建 ConfigMap
      • 基于生成器创建 ConfigMap
    • 使用ConfigMap
      • 使用 ConfigMap 数据定义容器环境变量
        • 在Pod中通过env来设置
        • 在Pod中使用envFrom来设置
        • 总结
      • 将 ConfigMap 数据添加到容器的文件
        • 通过volumes来使用configmap中的数据
        • 将 ConfigMap 数据添加到卷中的特定文件
    • ConfigMap其他说明
      • 可选的 ConfigMap
      • ConfigMap限制
    • ConfigMap操作实例
      • 使用 ConfigMap 来配置mysql
      • 使用 ConfigMap 来配置 Redis

简介

  • ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

  • ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。

  • ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

ConfigMap的作用

使用 ConfigMap 来将你的配置数据和应用程序代码分开。

比如,假设你正在开发一个应用,它可以在你自己的电脑上(用于开发)和在云上 (用于实际流量)运行。 你的代码里有一段是用于查看环境变量 DATABASE_HOST,在本地运行时, 你将这个变量设置为 localhost,在云上,你将其设置为引用 Kubernetes 集群中的 公开数据库组件的 服务。

这让你可以获取在云中运行的容器镜像,并且如果有需要的话,在本地调试完全相同的代码。

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

了解ConfigMap和Pod

  • ConfigMap 是一个 API 对象, 让你可以存储其他对象所需要使用的配置。 和其他 Kubernetes 对象都有一个 spec 不同的是,ConfigMap 使用 databinaryData 字段。这些字段能够接收键-值对作为其取值。databinaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。

  • ConfigMap 的名字必须是一个合法的 DNS 子域名。

  • databinaryData 字段下面的每个键的名称都必须由字母数字字符或者 -_. 组成。在 data 下保存的键名不可以与在 binaryData 下出现的键名有重叠。

说明:

ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap 理解为类似于 Linux /etc 目录及其内容的东西。例如,如果你基于 ConfigMap 创建 Kubernetes 卷,则 ConfigMap 中的每个数据项都由该数据卷中的某个独立的文件表示。

ConfigMap 的 data 字段包含配置数据。如下例所示,它可以简单 (如用 --from-literal 的单个属性定义)或复杂 (如用 --from-file 的配置文件或 JSON blob 定义)

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: example-config
  namespace: default
data:
  # 使用 --from-literal 定义的简单属性
  example.property.1: hello
  example.property.2: world
  # 使用 --from-file 定义复杂属性的例子
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3 

创建ConfigMap

  • 可以使用 kubectl create configmap 创建;
  • 可以在 xxx.yaml 中使用kind:configmap资源来创建

1. 使用kubectl create configmap 创建

  • 格式语法
kubectl create configmap <映射名称> <数据源>
  • <映射名称> 是为 ConfigMap 指定的名称,
  • <数据源> 是要从中提取数据的目录、 文件或者字面值。ConfigMap 对象的名称必须是合法的DNS 子域名

2. 使用configmap资源创建ConfigMap

  • 定义configmap资源文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config-map
data:
  key1: value1
  key2: value2
  • my-config-map 是要创建的 ConfigMap 的名称,
  • data 字段包含 ConfigMap 的键值对数据。

使用–from-file基于一个目录来创建 ConfigMap

​ 可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目录来创建 ConfigMap 时,kubectl 识别目录下文件名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。

说明:

  • 用于创建 ConfigMap 的每个文件名必须由可接受的字符组成,即:字母(AZaz)、数字(09)、‘-’、‘_‘或’.’。 如果在一个目录中使用 kubectl create configmap,而其中任一文件名包含不可接受的字符, 则 kubectl 命令可能会失败。

  • kubectl 命令在遇到不合法的文件名时不会打印错误。

  • 创建本地目录:
mkdir -p configure-pod-container/configmap/
  • 下载示例的配置
# 将示例文件下载到 `configure-pod-container/configmap/` 目录

wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties

[root@master configmap]# ls -l
total 8
-rw-r--r-- 1 root root 157 May 29 02:44 game.properties
lrwxrwxrwx 1 root root   8 May 29 02:46 log -> /var/log
-rw-r--r-- 1 root root  83 May 29 02:44 ui.properties
  • 创建configmap
[root@master ~]# kubectl create configmap game-config --from-file=configure-pod-container/configmap/
configmap/game-config created
[root@master ~]#

以上命令将 configure-pod-container/configmap 目录下的所有文件,也就是 game.propertiesui.properties 打包到 game-config ConfigMap 中

  • 查看configmap详细信息
[root@master ~]# kubectl describe configmaps game-config
Name:         game-config
Namespace:    default
Labels:       
Annotations:  

Data
====
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

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

Events:  
[root@master ~]#
  • configure-pod-container/configmap/ 目录中的 game.propertiesui.properties 文件出现在 ConfigMap 的 data 部分;

  • 此时目 目录中的log软连接没有创建到configmap中,应证了:普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)

  • 查看configmap的yaml格式
[root@master ~]# kubectl get configmaps game-config -o yaml
apiVersion: v1
data:
  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
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: "2023-05-28T18:47:57Z"
  name: game-config
  namespace: default
  resourceVersion: "316804"
  uid: b99b03cf-d7d8-4f41-9eca-60edcf77369c
[root@master ~]#

使用–from-file基于文件创建 ConfigMap

​ 可以使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap

  • 基于单个文件创建configmap
[root@master ~]# kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
configmap/game-config-2 created
[root@master ~]#
  • 查看详细信息
[root@master ~]# kubectl get configmap game-config-2
NAME            DATA   AGE
game-config-2   1      26s
[root@master ~]#
[root@master ~]# kubectl describe  configmap game-config-2
Name:         game-config-2
Namespace:    default
Labels:       
Annotations:  

Data
====
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:  
[root@master ~]#

可以多次使用 --from-file 参数,从多个数据源创建 ConfigMap。

  • 基于多个文件创建configmap
[root@master ~]# kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties
configmap/game-config-2 created
[root@master ~]#
  • 查看详细信息
[root@master ~]# kubectl get configmap game-config-2 -o yaml
apiVersion: v1
data:
  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
    
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: "2023-05-28T19:00:24Z"
  name: game-config-2
  namespace: default
  resourceVersion: "317879"
  uid: 4423fe0b-fb74-4d2d-8b37-e435bbc173d2
[root@master ~]#

定义从文件创建 ConfigMap 时要使用的键

​ 在使用 --from-file 参数时,你可以定义在 ConfigMap 的 data 部分出现键名, 而不是按默认行为使用文件名。

kubectl create configmap  configmap-name  --from-file=<我的键名>=<文件路径>
  • <我的键名> 是你要在 ConfigMap 中使用的键名,
  • <文件路径> 是你想要键所表示的数据源文件的位置。
  • 创建示例
[root@master configmap]# kubectl create configmap test --from-file=text11=game.properties
configmap/test created
[root@master configmap]#
  • 查看详细信息
[root@master configmap]# kubectl describe configmap test
Name:         test
Namespace:    default
Labels:       
Annotations:  

Data
====
text11:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Events:  
[root@master configmap]#

使用–from-env-file选项基于 env 文件创建 ConfigMap

Env 文件包含环境变量列表。其中适用以下语法规则:

  • Env 文件中的每一行必须为 VAR=VAL 格式;
  • 以#开头的行(即注释)将被忽略;
  • 空行将被忽略;
  • 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。
  • 将示例文件下载
# 将示例文件下载到 `configure-pod-container/configmap/` 目录
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties
  • Env 文件 game-env-file.properties 如下所示
[root@master ~]# cat configure-pod-container/configmap/game-env-file.properties
enemies=aliens
lives=3
allowed="true"

# This comment and the empty line above it are ignored
[root@master ~]#
  • 创建configmap
[root@master ~]# kubectl create configmap game-config-env-file --from-env-file=configure-pod-container/configmap/game-env-file.properties
configmap/game-config-env-file created
[root@master ~]#
  • 查看详细信息
[root@master ~]# kubectl describe configmap game-config-env-file
Name:         game-config-env-file
Namespace:    default
Labels:       
Annotations:  

Data
====
lives:
----
3
allowed:
----
"true"
enemies:
----
aliens
Events:  
[root@master ~]#
  • 查看yaml信息
[root@master ~]# kubectl get configmap game-config-env-file -o yaml
apiVersion: v1
data:
  allowed: '"true"'
  enemies: aliens
  lives: "3"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-05-28T19:26:22Z"
  name: game-config-env-file
  namespace: default
  resourceVersion: "320111"
  uid: b7651222-2a42-4701-8a48-201a8492b0f5
[root@master ~]#

从 Kubernetes 1.23 版本开始,kubectl 支持多次指定 --from-env-file 参数来从多个数据源创建 ConfigMap。

使用–from-literal根据字面值创建 ConfigMap

可以将 kubectl create configmap--from-literal 参数一起使用, 通过命令行定义文字值。

[root@master configmap]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[root@master configmap]#

可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。

[root@master configmap]# kubectl get configmaps special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2023-05-28T19:40:30Z"
  name: special-config
  namespace: default
  resourceVersion: "321325"
  uid: 431d078c-80c0-4b75-a49a-29cb66dbe859
[root@master configmap]#

基于生成器创建 ConfigMap

  • 还可以基于生成器(Generators)创建 ConfigMap,然后将其应用于集群的 API 服务器上创建对象。 生成器应在目录内的 kustomization.yaml 中指定。
  • 个人任务使用生成器(Generators)创建 ConfigMap没有太大必要,直接使用上面的方法即可,如果想了解请查阅官方文档

使用ConfigMap

使用 ConfigMap 数据定义容器环境变量

在Pod中通过env来设置

1. 在 ConfigMap 中将环境变量定义为键值对:

  • 创建configmap
[root@master configmap]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[root@master configmap]#
  • 查看configmap
[root@master ~]# kubectl describe configmap special-config
Name:         special-config
Namespace:    default
Labels:       
Annotations:  

Data
====
special.how:
----
very

special.type:
----
charm
Events:  
[root@master ~]#
  • 创建Pod使用configmap定义容器的环境变量
apiVersion: v1
kind: Pod   
metadata:  
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # 定义环境变
        - name: xhz
          valueFrom:
            configMapKeyRef:
              # ConfigMap 包含你要赋给 xhz 的值
              name: special-config
              # 指定与取值相关的键名
              key: special.how
        - name: flf
          valueFrom:
            configMapKeyRef:
              # ConfigMap 包含你要赋给 flf 的值
              name: special-config
              # 指定与取值相关的键名
              key: special.type
  restartPolicy: Never
  • 创建pod,并查看pod日志
[root@master configmap]# kubectl apply  -f pod1.yml
pod/dapi-test-pod created
[root@master configmap]#
[root@master configmap]# kubectl logs   dapi-test-pod  |grep xhz
xhz=very
[root@master configmap]# kubectl logs   dapi-test-pod  |grep flf
flf=charm
[root@master configmap]#

在Pod中使用envFrom来设置

  • 查看configmap
[root@master configmap]# kubectl describe configmap game-config-env-file
Name:         game-config-env-file
Namespace:    default
Labels:       
Annotations:  

Data
====
allowed:
----
"true"
enemies:
----
aliens
lives:
----
3
Events:  
[root@master configmap]#
  • 创建Pod使用configmap定义容器的环境变量
apiVersion: v1
kind: Pod   
metadata:  
  name: dapi-test-pod-2
spec:
  containers:
    - name: test-container-2
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
        - configMapRef:
            name: game-config-env-file
  restartPolicy: Never
  • 创建pod。查看信息
[root@master configmap]#
[root@master configmap]# kubectl apply  -f pod2.yaml
pod/dapi-test-pod-2 created
[root@master configmap]# kubectl logs dapi-test-pod-2 |grep allowed
allowed="true"
[root@master configmap]# kubectl logs dapi-test-pod-2 |grep enemies
enemies=aliens
[root@master configmap]#
[root@master configmap]# kubectl logs dapi-test-pod-2 |grep lives
lives=3
[root@master configmap]#

总结

在Pod中通过env来导入configmap中的数据,作为容器变量:

  • 可以指定环境变量的key,然后将configmap中的value作为环境变量的value;
  • 需要使用valueFrom. configMapKeyRef属性将configmap中的值一个个导入为环境变量;
  • 可以多次使用valueFrom

在Pod中通过envFrom来导入configmap中的数据,作为容器变量:

  • 使用envFrom.configMapRef,可以一次性将config中的所有值设置为容器的环境变量;
  • 环境变量的key为configmap中的key,value为configmap中 的value

将 ConfigMap 数据添加到容器的文件

  • 上面所述的,将configmap数据添加到容器的环境变量,而这些configmap都是通过–from-env-file,字面键值对来创建的;然后那些通过--from-file 创建 ConfigMap 时,文件名成为存储在 ConfigMap 的 data 部分中的键, 文件内容成为键对应的值,这个时候就需要通过volume来使用configmap中的数据。(当然通过–from-env-file,字面键值对来创建的configmap,也可以通过volume来导入到容器的文件中)
  • 数据会展现为 UTF-8 字符编码的文件。如果使用其他字符编码, 可以使用 binaryData.(详情参阅 ConfigMap 对象)。

通过volumes来使用configmap中的数据

1. --from-env-file来创建的configmap

  • 创建configmap
[root@master ~]# kubectl create configmap game-config-env-file --from-env-file=configure-pod-container/configmap/game-env-file.properties
configmap/game-config-env-file created
[root@master ~]#
[root@master ~]# kubectl describe configmap game-config-env-file
Name:         game-config-env-file
Namespace:    default
Labels:       
Annotations:  

Data
====
allowed:
----
"true"
enemies:
----
aliens
lives:
----
3
Events:  
[root@master ~]#
  • 通过valume将configmap中的数据导入
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-3
spec:
  containers:
    - name: test-container-3
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: configmap-volume
          mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: game-config-env-file
  restartPolicy: Never
  • 进入容器查看数据
[root@master configmap]# kubectl exec  -it test-pod-3  /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /etc/config/
/etc/config # ls
allowed  enemies  lives
/etc/config # ls -l
total 0
lrwxrwxrwx    1 root     root            14 May 28 21:27 allowed -> ..data/allowed
lrwxrwxrwx    1 root     root            14 May 28 21:27 enemies -> ..data/enemies
lrwxrwxrwx    1 root     root            12 May 28 21:27 lives -> ..data/lives
/etc/config # cat allowed
/etc/config # cat enemies
aliens/etc/config #
/etc/config # cat lives
3/etc/config #

此时configmap中的key作为了容器中的文件名,configmap中的valume称为了容器中文件的数据

2. --from-literal来创建的configmap

  • 创建的configmap
[root@master configmap]#  kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[root@master configmap]#
[root@master configmap]# kubectl describe configmap special-config
Name:         special-config
Namespace:    default
Labels:       
Annotations:  

Data
====
special.how:
----
very
special.type:
----
charm
Events:  
[root@master configmap]#
  • 通过valume将configmap中的数据导入
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-4
spec:
  containers:
    - name: test-container-4
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: configmap-volume
          mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: special-config
  restartPolicy: Never
  • 创建并进入容器查看数据
[root@master configmap]# kubectl apply  -f pod4.yaml
pod/test-pod-4 created
[root@master configmap]#
[root@master configmap]# kubectl exec -it test-pod-4 /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /etc/config/
/etc/config # ls -l
total 0
lrwxrwxrwx    1 root     root            18 May 28 21:44 special.how -> ..data/special.how
lrwxrwxrwx    1 root     root            19 May 28 21:44 special.type -> ..data/special.type
/etc/config # cat special.how
very
/etc/config #
/etc/config # cat special.type
charm
etc/config #
/etc/config #

此时configmap中的key作为了容器中的文件名,configmap中的valume称为了容器中文件的数据

3. --from-file来创建的configmap

  • 查看confimap
[root@master configmap]# kubectl describe configmap game-config
Name:         game-config
Namespace:    default
Labels:       
Annotations:  

Data
====
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
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

Events:  
[root@master configmap]#
  • 通过valume将configmap中的数据导入
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-5
spec:
  containers:
    - name: test-container-5
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: configmap-volume
          mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: game-config
  restartPolicy: Never
  • 创建并进入容器查看数据
[root@master configmap]# kubectl exec -it test-pod-5 /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /etc/config/
/etc/config # ls -l
total 0
lrwxrwxrwx    1 root     root            22 May 28 21:49 game.properties -> ..data/game.properties
lrwxrwxrwx    1 root     root            20 May 28 21:49 ui.properties -> ..data/ui.properties
/etc/config # 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/etc/config #
/etc/config # cat ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
/etc/config #
/etc/config #

此时configmap中的key作为了容器中的文件名,configmap中的valume称为了容器中文件的数据

将 ConfigMap 数据添加到卷中的特定文件

​ 使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径。 在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /etc/config/keys 文件中。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh","-c","cat /etc/config/keys" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          path: keys
  restartPolicy: Never

注意:

如前,/etc/config/ 目录中所有先前的文件都将被删除。

ConfigMap其他说明

可选的 ConfigMap

你可以在 Pod 规约中将对 ConfigMap 的引用标记为 可选(optional)。 如果 ConfigMap 不存在,那么它在 Pod 中为其提供数据的配置(例如:环境变量、挂载的卷)将为空。 如果 ConfigMap 存在,但引用的键不存在,那么数据也是空的。

以下 Pod 规约将 ConfigMap 中的环境变量标记为可选

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: a-config
              key: akey
              optional: true # 将环境变量标记为可选
  restartPolicy: Never

当你运行这个 Pod 并且名称为 a-config 的 ConfigMap 不存在时,输出空值。 当你运行这个 Pod 并且名称为 a-config 的 ConfigMap 存在, 但是在 ConfigMap 中没有名称为 akey 的键时,控制台输出也会为空。 如果你确实在名为 a-config 的 ConfigMap 中为 akey 设置了键值, 那么这个 Pod 会打印该值,然后终止。

你也可以在 Pod 规约中将 ConfigMap 提供的卷和文件标记为可选。 此时 Kubernetes 将总是为卷创建挂载路径,即使引用的 ConfigMap 或键不存在。

例如,以下 Pod 规约将所引用得 ConfigMap 的卷标记为可选:

ConfigMap限制

  • 在 Pod 规约中引用某个 ConfigMap 之前,必须先创建这个对象, 或者在 Pod 规约中将 ConfigMap 标记为 optional(请参阅可选的 ConfigMaps)。 如果所引用的 ConfigMap 不存在,并且没有将应用标记为 optional 则 Pod 将无法启动。 同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 optional

  • 如果你使用 envFrom 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 Pod 可以被启动,但无效名称将被记录在事件日志中(InvalidVariableNames)。 日志消息列出了每个被跳过的键。例如:

kubectl get events

##输出与此类似:
LASTSEEN FIRSTSEEN COUNT NAME          KIND  SUBOBJECT  TYPE      REASON                            SOURCE                MESSAGE
0s       0s        1     dapi-test-pod Pod              Warning   InvalidEnvironmentVariableNames   {kubelet, 127.0.0.1}  Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names.
  • ConfigMap 位于确定的命名空间中。 每个 ConfigMap 只能被同一名字空间中的 Pod 引用.

  • 你不能将 ConfigMap 用于静态 Pod, 因为 Kubernetes 不支持这种用法。

ConfigMap操作实例

使用 ConfigMap 来配置mysql

该示例完成一下几个功能:

  • 给mysql传递MYSQL_ROOT_PASSWORD参数,设置root密码;
  • 传递MYSQL_DATABASE参数,新建一个库;
  • 传递MYSQL_USERMYSQL_PASSWORD,新建用户和密码。

无实际作用,只是展示用法

  • 创建mysql的configmap文件
[root@master configmap]# kubectl delete -f mysql-pod.yml
pod "mysql-pod" deleted
[root@master configmap]# cat mysql-map
MYSQL_ROOT_PASSWORD=root123
MYSQL_DATABASE=test
MYSQL_USER=uos
MYSQL_PASSWORD=uos123
[root@master configmap]#
[root@master configmap]# kubectl create configmap mysql-map --from-env-file=mysql-map
configmap/mysql-map created
[root@master configmap]#
[root@master configmap]#
[root@master configmap]# kubectl describe configmap mysql-map
Name:         mysql-map
Namespace:    default
Labels:       
Annotations:  

Data
====
MYSQL_PASSWORD:
----
uos123
MYSQL_ROOT_PASSWORD:
----
root123
MYSQL_USER:
----
uos
MYSQL_DATABASE:
----
test
Events:  
[root@master configmap]#
  • 创建mysql pod的资源文件
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod

spec:
  containers:
    - name: mysql-container
      image: mysql:5.7
      imagePullPolicy: IfNotPresent
      envFrom:
        - configMapRef:
            name: mysql-map

      ports:
        - containerPort: 3306
        
##当然也可以使用env逐个导入
      env:
        - name: MYSQL_ROOT_PASSWORD
          valumeFrom:
            configMapKeyRef:
              name: mysql-map
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_DATABASE
          valumeFrom:
            configMapKeyRef:
              name: mysql-map
              key: MYSQL_DATABASE
        .....
  • 创建Pod,查看Pod信息
[root@master configmap]# kubectl apply -f mysql-pod.yml
pod/mysql-pod created
[root@master configmap]#
[root@master configmap]# kubectl get pods mysql-pod -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE              NOMINATED NODE   READINESS GATES
mysql-pod   1/1     Running   0          26s   10.244.2.102   192.168.194.131              
[root@master configmap]# 
  • 登录测试
[root@master configmap]# mysql -uroot -proot123 -h10.244.2.102
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MySQL [(none)]> exit
Bye
[root@master configmap]# mysql -uuos -puos123 -h10.244.2.102
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> Ctrl-C -- exit!
Aborted
[root@master configmap]#

为了完善一点,我们还可以将my.cnf的配置文件通过–from-file的形式创建为configmap,然后再Pod中通过volume的方式挂载到容器里面。

注意:

当我们创建Pod使用的mysql的镜像为8.x版本的时候,但是我们本地的mysql-client客户端又是5.x的时候,本地登录mysql时可能会出现如下报错:

[root@master configmap]# mysql -uroot -h 10.244.2.99 -proot123
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

报错原因:

这个错误是因为 MySQL 8.0 引入了一个新的身份验证插件 caching_sha2_password,而旧版本的 MySQL 客户端可能无法加载该插件。

使用 ConfigMap 来配置 Redis

实现功能:

  • 使用 ConfigMap 中的数据来配置 Redis 缓存
  • 创建ConfigMap
[root@master configmap]# cat example-redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config: ""
[root@master configmap]#
[root@master configmap]# kubectl apply  -f example-redis-config.yaml
configmap/example-redis-config created
[root@master configmap]#
[root@master configmap]#
[root@master configmap]# kubectl describe configmap example-redis-config
Name:         example-redis-config
Namespace:    default
Labels:       
Annotations:  

Data
====
redis-config:
----

Events:  
[root@master configmap]#
### 数据redis-config为空
  • 创建redis Pod资源文件
[root@master configmap]# cat redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis:5.0.4
    command:
      - redis-server
      - "/redis-master/redis.conf"
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379
    resources:
      limits:
        cpu: "0.1"
    volumeMounts:
    - name: data
      mountPath: /redis-master-data

    - name: config
      mountPath: /redis-master
  volumes:
    - name: data
      emptyDir: {}

    - name: config
      configMap:
        name: example-redis-config
        items:
        - key: redis-config
          path: redis.conf
[root@master configmap]#
[root@master configmap]#
  • spec.volumes[1] 创建一个名为 config 的卷。
  • spec.volumes[1].items[0] 下的 keypath 会将来自 example-redis-config ConfigMap 中的 redis-config 密钥公开在 config 卷上一个名为 redis.conf 的文件中。
  • 然后 config 卷被 spec.containers[0].volumeMounts[1] 挂载在 /redis-master

这样做的最终效果是将上面 example-redis-config 配置中 data.redis-config 的数据作为 Pod 中的 /redis-master/redis.conf 公开。

  • 查看Pod信息
[root@master configmap]# kubectl apply  -f redis-pod.yaml
pod/redis created
[root@master configmap]#
[root@master configmap]# kubectl get  pods redis -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
redis   1/1     Running   0          3m41s   10.244.1.46   192.168.194.130              
[root@master configmap]# 
  • 使用 kubectl exec 进入 pod,运行 redis-cli 工具检查当前配置:
[root@master configmap]# kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379>  CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379>
  • 它也应该显示默认值 noeviction
  • maxmemory显示默认值 0
  • 现在,向 example-redis-config ConfigMap 添加一些配置:
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config: |
    maxmemory 2mb
    maxmemory-policy allkeys-lru  
  • 更新configmap,并查看
[root@master configmap]# kubectl apply  -f example-redis-config.yaml
configmap/example-redis-config configured
[root@master configmap]#
[root@master configmap]#
[root@master configmap]# kubectl describe configmap example-redis-config
Name:         example-redis-config
Namespace:    default
Labels:       
Annotations:  

Data
====
redis-config:
----
maxmemory 2mb
maxmemory-policy allkeys-lru
Events:  
[root@master configmap]#
  • 再次验证redis
[root@master configmap]# kubectl exec -it redis -- redis-cli
127.0.0.1:6379>  CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
127.0.0.1:6379>

​ 当 ConfigMap 发生变化时,Pod 中使用该 ConfigMap 的容器不会自动更新其配置。但是,您可以使用 Kubernetes 提供的一些机制来让 Pod 中的容器更新其配置。

​ 下面是几种更新 Pod 配置的方法:

  • 使用 kubectl rollout restart 命令重启 Pod,这个命令会将 Pod 中的所有容器停止,然后重新启动它们。当容器重新启动时,它们将使用最新的 ConfigMap 配置。例如,要重启名为 my-pod 的 Pod,您可以使用以下命令:
kubectl rollout restart deployment my-pod
  • 在容器中重新加载配置:许多应用程序支持在运行时重新加载其配置。如果您的容器支持这个功能,您可以在 ConfigMap 发生变化时,触发容器重新加载其配置。例如,您可以使用 kubectl exec 命令在容器中运行一个命令,以重新加载配置。例如,如果您的容器支持 SIGHUP 信号来重新加载配置,则可以使用以下命令:
kubectl exec my-pod -- kill -HUP当 ConfigMap 发生变化时,Pod 中使用该 ConfigMap 的容器不会自动更新其配置。但是,您可以使用 Kubernetes 提供的一些机制来让 Pod 中的容器更新其配置。

你可能感兴趣的:(kubernetes)