k8s学习记录,配置管理ConfigMap(十七)

文章中资料参考来源2022 云原生Kubernetes全栈架构师

使用nginx.conf配置文件创建一个configmap资源,在创建nginx的pod资源时,通过 volume将configmap中的配置文件挂载到容器对应的目录,即可实现配置分离管理,当配置修改后,程序通过热加载或reload,即可获取到最新的配置文件,不必每个服务都进行更新

ConfigMaps|Kubernetes

eg:创建ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # property-like keys; each key maps to a simple value
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # file-like keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

eg:Pod使用ConfigMap

apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:  #环境变量配置
        # Define the environment variable
        - name: PLAYER_INITIAL_LIVES # Notice that the case is different here  将上面player_initial_lives的值赋值给变量PLAYER_INITIAL_LIVES
                                     # from the key name in the ConfigMap.
          valueFrom:
            configMapKeyRef:
              name: game-demo           # The ConfigMap this value comes from.
              key: player_initial_lives # The key to fetch.
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:  # 这里配置volumes的挂载
      - name: config  # 下面volumes的名称
        mountPath: "/config"  # 路径
        readOnly: true
  volumes:
    # You set volumes at the Pod level, then mount them into containers inside that Pod
    - name: config
      configMap:
        # Provide the name of the ConfigMap you want to mount.
        name: game-demo  #对应创建的ConfigMap名称
        # An array of keys from the ConfigMap to create as files
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"

创建configmap的几种方法

1、基于文件夹创建configmap【目录下有多个配置文件,以目录为单位一起创建】

kubectl create cm cmfromdir --from-file=conf/

2、基于配置文件创建configmap【目录下有多个配置文件,以其中一个配置文件来创建】

kubectl create cm cmfromfile --from-file=conf/redis.conf

3、基于配置文件创建自定义名称的configmap【很少使用】

kubectl create cm cmspecialname --from-file=my-redis.conf=conf/redis.conf

4、基于环境变量文件创建configmap

kubectl create cm gameenvcm --from-env-file=conf/game.conf

5、也可以直接在命令中设置环境变量来创建configmap

kubectl create cm envfromliteral --from-literal=level=info --from-literal=password=redis123

6、基于yaml文件来创建configmap

kubectl create f game-demo.yaml

Pod中如何使用configmap

1、当我们要使用gameenvcm这个configmap中的live的值时,我们需要在pod中进行如下配置

....
    spec:
      containers:
      - image: nginx:1.15.1
        name: nginx
        env:
          - name: LIVE # pod中定义的变量名
            valueFrom:
              configMapKeyRef:
                name: gameenvcm  # configmap的名字
                key: live # configmap中的key值
          - name: ZW_TEST_ENV # 手动指定环境变量
            value: zw_test_env # 手动指定的ZW_TEST_ENV变量的值为zw_test_env
....  

当创建pod之后,就可以查看pod中的环境变量里 LIVE 这个变量的值和我们在configmap中配置的值一致,

2、当我们要一次性导入更多的环境变量时又该怎么做呢?---------> envFrom

....
    spec:
spec:
      containers:
      - image: nginx:1.15.1
        name: nginx
        envFrom:
          - configMapRef:
              name: cmenvfile
       #env:
       #  - name: LIVE
       #    valueFrom:
       #      configMapKeyRef:
       #        name: gameenvcm
       #        key: live
       #  - name: ZW_TEST_ENV
       #    value: zw_test_env
....


3、以文件形式挂载配置文件

....
   spec:
      containers:
      - image: nginx:1.15.1
        name: nginx-mount
        volumeMounts:
          - name: zw-volume  # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
            mountPath: /etc/config  # 挂载到pod中的路径
      volumes:
        - name: zw-volume  # volumes的名称
          configMap:
            name: zwvolume  # 集群中已经创建的ConfigMap的名字
....

如果在configMap中再配置items,则可以给挂载的pod中的配置文件进行重命名操作

...
   spec:
      containers:
      - image: nginx:1.15.1
        name: nginx-mount
        volumeMounts:
          - name: zw-volume  
            mountPath: /etc/config  
      volumes:
        - name: zw-volume 
          configMap:
            name: zwvolume
            items:
              - key: game2.conf # zwvolume中的key值
                path: game2.conf.bak  # 挂载到pod中后,新取的名字
...

修改挂载文件的权限如何做呢?在configMap中配置defaultMode项

...
    spec:
      containers:
        - image: nginx:1.15.1
          name: nginx-mount
          volumeMounts:
            - name: zw-volume  # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
              mountPath: /etc/config  # 挂载到pod中的路径
      volumes:
        - name: zw-volume  # volumes的名称
          configMap:
            name: zwvolume  # 集群中已经创建的ConfigMap的名字
            items:
              - key: game2.conf
                path: game2.conf.bak
            defaultMode: 0644  # 设置文件权限为644
...

如果有多个挂载文件,也可以单独给挂载文件设置mode

...
    spec:
      containers:
        - image: nginx:1.15.1
          name: nginx-mount
          volumeMounts:
            - name: zw-volume  # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
              mountPath: /etc/config  # 挂载到pod中的路径
      volumes:
        - name: zw-volume  # volumes的名称
          configMap:
            name: zwvolume  # 集群中已经创建的ConfigMap的名字
            items:
              - key: game2.conf
                path: game2.conf.bak
              - key: game2.conf
                path: game2.conf.bak2
                mode:  0755  # 也可以给key单独配置权限,这个权限优先于defaultMode的配置
            defaultMode: 0644  # 设置文件权限为644
...

posted @ 2021-06-05 15:49  Hei蛋炒饭  阅读(437)  评论(0编辑  收藏  举报