kubernetes 配置示例 - ConfigMap

部署应用,我们经常碰到的问题是配置文件的内容会变化,我们可以通过 configMap 来保存配置文件的内容。比如:一个 spring boot 的 Java 应用,做了一个镜像,jar 包是放在容器的 /opt 目录里,程序启动命令为: 

java -jar mock-app-1.0.jar 

我们知道,如果在 /opt 这个目录下放上一个 application.properties 文件的话, 这个程序就会使用这个文件做为程序的配置文件。我们要做的就是把 application.properties 文件里面的内容放到 configMap 里,然后在容器的配置里挂载上一个目录。这个挂载的目录对应到 configMap 就可以实现了配置外置化了。

apiVersion: v1
kind: ConfigMap
metadata:
  # 设置这个 configMap 的名称
  name: mock-app-conf
data:
  application.properties: |
    db.user=root
    db.password=123456
    db.driver=xxxx    
  another.conf: |
    aaa=bbb

上面的内容保存为: configmap.yaml  (注:这里的 another.conf 只是演示一个 configMap 可以包含多个配置文件。) 运行下面的命令可以创建这个 configMap

kubectl apply -f configmap.yaml

下面再创建我们要部署的程序的模板(mock-app.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mock-app-deploy
  labels:
    app: mock-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mock-app
  template:
    metadata:
      labels:
        app: mock-app
    spec:
      containers:
      - name: mock-app
        image: mock/app:1.0
        volumeMounts:
        # mountPath 要指定到文件,不是目录
        - mountPath: "/opt/application.properties"
        # subPath 一定要加,要不然容器启动后,会发现 application.properties 是一个目录。
          subPath: application.properties
          name: mock-app-volume
      volumes:
      - name: mock-app-volume
        configMap:
        # 这里的 name 是上面定义的 confimap 的 name
          name: mock-app-conf
          items:
          # 这里的 key 对应的是上面定义的 configMap 中的 data 里面的某个值。下面的 key 的值写成 another.conf 的话,
          # application.properties 文件的内容就会变成 another.conf 对应的内容
          - key: application.properties
            path: application.properties

注: 以上举例是 jar 包和配置文件是放在同一个目录下面(/opt) 下面,如果 application.properties 是放在  /opt/config 下面的话,则mountPath 可以指定为 /opt/config,然后再去掉 subPath,也是可以的。

下面是配置多个配置文件的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mock-app-deploy
  labels:
    app: mock-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mock-app
  template:
    metadata:
      labels:
        app: mock-app
    spec:
      containers:
      - name: mock-app
        image: mock/app:1.0
        volumeMounts:
        # mountPath 这里指定的是目录
        - mountPath: "/opt/config"          
          name: mock-app-volume
      volumes:
      - name: mock-app-volume
        configMap:
        # 这里的 name 是上面定义的 confimap 的 name
          name: mock-app-conf
          items:         
          - key: application.properties
            path: application.properties
          - key: another.conf # 对应的是 ConfigMap 里 data 的某个值
            path: cba.conf # 把 another.conf 的内容作为容器中 /opt/config/cba.conf 这个文件的内容

 

posted @ 2022-01-24 09:12  一剑侵心  阅读(290)  评论(0编辑  收藏  举报