K8S ConfigMap 使用介绍

2021-09-10 container k8s

在 K8S 中可以通过 configmap 保存应用的配置,这样就将配置和运行代码分开了。

简介

ConfigMap 在 K8S 中用于管理配置,配置以 KeyValue 方式传递,用来保存非保密信息(包括单个属性或者配置文件),如果要进行加密则需要通过 Secret 保存,使用有如下的好处:

  • 配置隔离,如果保存在镜像中,那么每次修改都需要重新打包镜像。
  • 配置共享,当采用微服务时,有些配置项是共用的,那么就可以比较好的维护。

示例

----- 配置内容如下
# vim hello_configmap.yaml
apiVersion: v1         # 通过 kubectl explain ConfigMap 命令查看即可
kind: ConfigMap
metadata: 
  name: test-conf
  namespace: default   # 可以指定某个Namespace使用,对应的Pod也就需要在该NS内
data:
  HTTP_PORT: "30000"   # 必须是字符串,不支持整数
  config_file: |
    http.ssl: true
    http.port: 30000
----- 创建、查看配置
# kubectl create -f hello_configmap.yaml
# kubectl get configmaps test-conf
# kubectl delete configmaps test-conf

创建好配置之后,可以通过环境变量使用。

# vim test_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: default
spec:
  containers:
    - name: test-container
      image: alpine:latest
      imagePullPolicy: Never
      command: ["/usr/bin/nc", "-vlp", "$(SVR_PORT)"] # 引用环境变量需要$()而非${}
      env:
        - name: HELLO
          value: WORLD         # 直接配置环境变量
        - name: SVR_PORT
          valueFrom:
            configMapKeyRef:   # 环境变量从ConfigMap中获取
              name: test-conf
              key: HTTP_PORT
  restartPolicy: Never         # 失败后无需重启
----- 根据YAML创建Pod
# kubectl create -f test_pod.yaml
----- 查看暴露的环境变量
# kubectl exec -it test-pod -- /usr/bin/env

也可以挂载到容器内部的某个文件或者目录。

# vim test_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: test
spec:
  containers:
    - name: test-container
      image: alpine:latest
      imagePullPolicy: Never
      command: ["/usr/bin/nc", "-vlp", "3000"]
      volumeMounts:
      - name: test-volume
        mountpath: /app/config
  volumes:
    - name: test-volume
    configMap:
      name:test-conf
      items:
      - key: config_file
        path: config.yaml
----- 根据YAML创建Pod
# kubectl create -f test_pod.yaml
----- 登录对应的Pod,然后可以查看 /app/config/config.yaml 文件
# kubectl exec test-pod -i --tty -- /bin/sh

常用命令

----- 指定文件或者目录创建,可以使用多次
kubectl create configmap YourConfigName  --from-file=file.yaml --from-file=your/path
----- 命令行中以KV形式创建,同样允许多次使用
kubectl create configmap YourConfigName  --from-literal=key=value
----- 通过环境文件形式创建,内部格式每行以 env=value 的方式保存,指定多次则最后一个生效
kubectl create configmap YourConfigName  --from-env-file=env.txt

----- 查看某个Namespace的配置,如果不指定则默认所有
kubectl get configmaps -n YourNameSpace
----- 可以通过YAML格式输出
kubectl get configmaps YourConfigMapName -o yaml
----- 查看详细信息
kubectl describe configmaps YourConfigMapName

----- 如果要修改,可以通过 edit 在线修改或者直接将某个文件替换
kubectl edit configmaps YourConfigMapName
kubectl replace -f YourConfigMapFile.yaml

更多的命令行使用可以通过 kubectl create configmap -h 命令查看。