k3s中使用configmap灵活配置


使用configmap前所遇到的问题

在微服务横行的时代,一个系统被拆分成多个子系统,使得每个子系统各自有一套自己管理的配置,
使得配置管理难度加大,springcloud的解决方案是spring config,可以通过github等集中托管各服务配置,
集群化部署有比spring config更简单的解决方案:k8s configmap

什么是configmap

ConfigMap 是k8s集群中的一种资源类型,并且ConfigMap会将配置数据作为k-v键值对存储,存储的数据可以被集群中的
pod消费。通过configMap我们可以将springboot的配置文件集中管理在一个k8s名称空间下,这样就可以统一管理所有容器配置

创建configMap

使用kubectl命令创建:

kubectl create configmap <map-name> <data-source> -n <namespace>

其中可以是存放配置文件的目录或者就是配置文件,是创建的configMap的名字, < namespace >为指定
的名称空间名。

例子:

# 创建本地目录
mkdir -p /config

# 下载事例配置
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

kubectl create configmap testConfigMap --from-file=/config/ -n dev

上述命令为使用/config 目录下的所有配置文件在dev名称空间创建名为 testConfigMap的configMap资源

查看创建完的configmap:

kubectl describe configmap testConfigMap -n dev
kubectl get  configmap testConfigMap -o yaml -n dev

查看dev名称空间下名叫testConfigMap的configMap,如果按照上述操作,结果应该如下:

Name:           game-config
Namespace:      dev
Labels:         <none>
Annotations:    <none>

Data
====
game.properties:        158 bytes
ui.properties:          83 bytes

使用第二条命令则更详细:

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2016-02-18T18:52:05Z
  name: game-config
  namespace: dev
  resourceVersion: "516"
  uid: b4952dc3-d670-11e5-8cd0-68f728db1985
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
通过上述操作可以发现,使用命令创建后,configmap中的key即为配置文件的名字,所以使用起来也非常方便

创建configMap还可以通过yaml配置文件的方式创建,不再详细说明,通过文件方式更为通用

configMap的应用

创建好configMap就要使用到实际应用中,pod可以直接使用集群中的configMap资源,通常来说有2种应用:

1、作为pod中的环境变量导入
2、作为pod中的loume挂载,将configMap的key对应的数据变成文件挂载到pod中的指定位置

要集中管理springboot配置文件,使用第2种营业员方式:

创建configMap,其中有2个配置文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

---

将配置文件挂载到pod的/etc/config 目录下

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config
  restartPolicy: Never

当pod创建并启动后,会输出如下结果:

SPECIAL_LEVEL
SPECIAL_TYPE

说明configMap中的key作为了文件名,值作为文件内容。

注意:这种挂载方式会清空 pod中/etc/config目录下原有的所有文件,再将配置文件挂载进去,
如果不想原来的配置被删除可以使用subPath的挂载方式,修改如下:
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config/SPECIAL_LEVEL
        subPath: SPECIAL_LEVEL
 volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          path: SPECIAL_LEVEL
  restartPolicy: Never

通过subPath的挂载方式,原来pod目录里的文件就不会被删除


文章作者: Ubi-potato
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ubi-potato !
评论
  目录