一、为什么要使用ConfigMap?

当我们在开发一个Java应用程序,通常会将配置信息放到单独的配置文件中,方便在不同运行环境下修改不同的配置信息,比如数据库配置,在开发环境和生产环境的数据库信息是不同的,因此把这些信息放到配置文件中,方便修改。那么类似的,在应用程序镜像中,通常在不同的环境下,配置信息也是不同的,因此我们需要把镜像的配置信息单独提取到一个配置文件中,以使容器化的应用程序具有可移植性,在kubernetes环境中,这个配置文件就叫做ConfigMap。

ConfigMap用于存放镜像配置信息,且这些配置信息通常是不敏感的,也就是可以明文配置的。

二、ConfigMap创建

1.基于目录/文件创建ConfigMap

使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap,具体命令是kubectl create configmap ConfigMap名称 --from-file=文件目录

也可以指定某一个配置文件进行创建ConfigMap,具体命令是kubectl create configmap ConfigMap名称 --from-file=文件

如果需要执行多个文件,则可以通过多个–from-file来指定。

# 创建本地目录
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

# 创建 configmap
kubectl create configmap game-config --from-file=configure-pod-container/configmap/

以上命令创建了一个叫game-config的ConfigMap,可以通过kubectl describe configmaps game-config 查看创建后具体信息。

[root@k8s-master1 configmaps]# kubectl describe configmaps game-config
Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

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:  <none>


可以通过kubectl get configmap game-config -o yaml 命令查看game-config的配置信息。

[root@k8s-master1 configmaps]# kubectl get configmap 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: "2022-12-24T13:04:59Z"
  name: game-config
  namespace: default
  resourceVersion: "411822"
  uid: bdc94acc-0e1b-4a1f-a333-e44ade9fba05


从上面的配置信息可以看到,通过–from-file的形式创建ConfigMap,文件名被作为key,文件内容被作为value,也就是不改变文件内容。此外,通过kubectl get configmaps查看ConfigMap列表。

另外一种创建ConfigMap的方式:kubectl create configmap ConfigMap名称 --from-env-file=XX,例如

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

[root@k8s-master1 configmaps]# 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@k8s-master1 configmaps]# 

kubectl create configmap game-config-env-file --from-env-file=configure-pod-container/configmap/game-env-file.properties

[root@k8s-master1 configmaps]# kubectl get configmap game-config-env-file -o yaml
apiVersion: v1
data:
  allowed: '"true"'
  enemies: aliens
  lives: "3"
kind: ConfigMap
metadata:
  creationTimestamp: "2022-12-24T13:24:26Z"
  name: game-config-env-file
  namespace: default
  resourceVersion: "413574"
  uid: dff3b824-547e-4d24-ad0c-1c8d7eb420b9
[root@k8s-master1 configmaps]# 

通过kubectl get configmap game-config-env-file -o yaml命令可以看到ConfigMap game-config-env-file的配置信息,我们可以看到从game-env-file.properties获取到的配置信息被解析成key:value的方式展示。

通过–from-env-file创建的ConfigMap,适用以下语法规则:

  • Env 文件中的每一行必须为 VAR=VAL 格式。
  • 以#开头的行(即注释)将被忽略。
  • 空行将被忽略。
  • 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。

2. 根据字面量创建ConfigMap

通过–from-literal 参数手动创建变量的key=value值,例如:kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

[root@k8s-master1 configmaps]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[root@k8s-master1 configmaps]# kubectl get cm special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2022-12-24T13:29:21Z"
  name: special-config
  namespace: default
  resourceVersion: "414013"
  uid: 0a6fe95b-da7a-4ea5-9064-9dd1372de6e9
[root@k8s-master1 configmaps]# 

三、在Pod中使用ConfigMap配置项

1. 通过configMapKeyRef引用ConfigMap

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # 定义环境变量
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值
              name: special-config
              # 指定与取值相关的键名
              key: special.how
  restartPolicy: Never

通过kubectl apply -f dapi-test-pod.yaml创建Pod之后,通过kubectl logs 命令可以看到打印出来的日志中有SPECIAL_LEVEL_KEY=very信息。

[root@k8s-master1 configmaps]# kubectl apply -f dapi-test-pod.yml 
pod/dapi-test-pod created
[root@k8s-master1 configmaps]# kubectl get pods
NAME                                READY   STATUS      RESTARTS   AGE
dapi-test-pod                       0/1     Completed   0          10m
nginx-deployment-7dcd754485-rn6wq   1/1     Running     1          29h
[root@k8s-master1 configmaps]# kubectl logs dapi-test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=dapi-test-pod
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
SPECIAL_LEVEL_KEY=very
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/


2. 通过configMapRef引用ConfigMap所有的配置项作为环境变量

(1)创建一个ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config2
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

通过kubectl apply -f的方式创建上面的ConfigMap,该ConfigMap包含SPECIAL_LEVEL和SPECIAL_TYPE两个配置项。

(2)创建一个Pod,指定special-config

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod2
spec:
  containers:
    - name: test-container
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
        # 定义环境变量
        - configMapRef: 
            name: special-config2
  restartPolicy: Never

创建Pod完成之后,通过kubectl logs 查看Pod输出的日志信息,如下面所示,可以看到SPECIAL_LEVEL=very和SPECIAL_TYPE=charm这两个配置信息。

[root@k8s-master1 configmaps]# kubectl logs dapi-test-pod2
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=dapi-test-pod2
SHLVL=1
HOME=/root
SPECIAL_LEVEL=very
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
SPECIAL_TYPE=charm


3. 将ConfigMap数据添加到一个卷中

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod3
spec:
  containers:
    - name: test-container
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # 提供包含要添加到容器中的文件的 ConfigMap 的名称
        name: special-config2
  restartPolicy: Never

通过kubectl apply -f命令创建上面Pod之后,可以通过kubect logs 命令查看Pod输出的日志信息。

[root@k8s-master1 configmaps]# kubectl apply -f dapi-test-pod3.yml 
pod/dapi-test-pod3 created
[root@k8s-master1 configmaps]# kubectl logs dapi-test-pod3
SPECIAL_LEVEL
SPECIAL_TYPE
[root@k8s-master1 configmaps]# 
打赏
支付宝 微信
上一篇 下一篇