ConfigMap

hx_ky36發表於2024-09-02

ConfigMap 是 Kubernetes 中用於配置管理的資源物件。它允許你將配置資訊從容器映象中解耦,使得配置可以獨立於應用程式進行管理和更新。以下是 ConfigMap 的詳細介紹,包括其主要功能、用法以及常見的場景。

一、ConfigMap 基本概念

ConfigMap 是 Kubernetes 用來儲存非機密的配置資訊的物件。你可以將配置資料儲存在 ConfigMap 中,然後將這些資料掛載到容器內,或者將其以環境變數的形式注入到容器中。這使得你可以在無需重新構建映象的情況下更新配置。

二、ConfigMap 的主要功能

  • 儲存配置資料:將配置資料儲存在 Kubernetes 叢集中。

  • 注入配置資料:透過掛載到容器內的檔案、目錄或環境變數的方式將配置資料提供給容器。

  • 動態更新ConfigMap 的資料可以在執行時更新,應用程式可以根據需要獲取最新的配置資料。

三、ConfigMap 的建立和管理

1.建立 ConfigMap

可以透過 YAML 檔案、kubectl 命令列工具或者從檔案中建立 ConfigMap

從 YAML 檔案建立:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  key1: value1
  key2: value2

示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  SIMPLE_KEY: simple_value
  nginx_d: /usr/local/nginx
  config.yaml: |
    server:
      port: 8080
      host: localhost
  db.properties: |
    db.user=root
    db.password=secret
    db.url=jdbc:mysql://localhost:3306/mydb
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-config-files
  labels:
    app: nginx
spec:
  containers:
  - name: my-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    env:
    - name: NGINX
      valueFrom:
        configMapKeyRef:
          name: my-configmap
          key: nginx_d
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: my-configmap
      items:
      - key: "config.yaml"
        path: "config.yaml"
      - key: "db.properties"
        path: "db.properties"
  restartPolicy: Never

使用 kubectl apply -f configmap.yaml 建立 ConfigMap

從命令列建立:

kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2

示例:

將一個包含 Tomcat 相關配置資訊的 ConfigMap 引入到一個 Pod 中

kubectl create configmap tomcat-config --from-literal=tomcat_dir=/usr/local/tomcat --from-literal=server_name=tomcat.com

apiVersion: v1
kind: Pod
metadata:
  name: tomcat-pod
spec:
  containers:
    - name: tomcat-container
      image: c7-tomcat:9.0.16
      imagePullPolicy: Never
      command: ["/bin/sh"]
      args: ["-c","while true; do echo hello; sleep 10; done"]
      env:
        - name: TOMCAT_DIR
          valueFrom:
            configMapKeyRef:
              name: tomcat-config
              key: tomcat_dir
        - name: SERVER_NAME
          valueFrom:
            configMapKeyRef:
              name: tomcat-config
              key: server_name
      ports:
        - containerPort: 8080
kubectl apply -f cm.yaml 

kubectl exec tomcat-pod -- env | grep TOMCAT_DIR
輸出結果// TOMCAT_DIR=/usr/local/tomcat
kubectl exec tomcat-pod -- env | grep SERVER_NAME
輸出結果// SERVER_NAME=tomcat.com

從檔案建立:

kubectl create configmap my-config --from-file=path/to/config/file

示例:

建立一個 Kubernetes Pod,並將 default.conf 檔案作為 NGINX 配置檔案掛載到 Pod 中

vim default.conf 
server {
    listen       8080;
    listen  [::]:8080;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

}
    error_page  500 502 503 504  /50.html;
    location = /50.html{
        root   /usr/share/nginx/html;
}
}

kubectl create configmap apps-config --from-file=default.conf

apiVersion: v1
kind: Pod
metadata:
  name: app-pod-with-config
spec:
  containers:
  - name: app-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    volumeMounts:
      - name: config-volume
        mountPath: "/etc/nginx/conf.d"
        readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: apps-config

將一個包含環境變數的 ConfigMap 載入到 Kubernetes Pod 的容器中

ConfigMap是透過--from-env-file 選項從環境變數檔案生成的

cat env.list 
DATABASE_HOST=localhost
DATABASE_POST=3006
DATABASE_USER=root
DATABASE_PASSWORD=secret

kubectl create configmap my-configmap --from-env-file=env.list

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    envFrom:
    - configMapRef:
        name: my-configmap
        
kubectl exec -it my-pod -- bash
env

從目錄建立:

kubectl create configmap my-config --from-file=path/to/dir/

2.檢視和編輯 ConfigMap

檢視 ConfigMap

kubectl get configmap my-config -o yaml

編輯 ConfigMap

kubectl edit configmap my-config

3.刪除 ConfigMap

kubectl delete configmap my-config

四、使用 ConfigMap

ConfigMap 可以透過以下方式使用:

1. 作為環境變數

在 Pod 的 YAML 配置中,將 ConfigMap 的資料作為環境變數注入到容器中:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: CONFIG_KEY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1

2. 作為掛載卷

ConfigMap 掛載到容器內的檔案系統中:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

掛載後,ConfigMap 的資料將被以檔案的形式寫入到指定的掛載路徑(例如 /etc/config)。

3. 作為命令列引數

可以將 ConfigMap 的資料作為命令列引數傳遞給容器:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/bin/sh", "-c"]
    args:
      - echo $(CONFIG_KEY);
    env:
    - name: CONFIG_KEY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1

五、ConfigMap 的注意事項

  • 非機密資料ConfigMap 主要用於儲存非機密的配置資料。對於敏感資料,建議使用 Secret 物件。

  • 資料更新:如果 ConfigMap 的資料被更新,掛載到 Pod 中的資料不會自動更新,除非重新建立 Pod 或者容器。

  • 大小限制:單個 ConfigMap 的大小有上限限制,通常為 1MB,但這個限制可能會因 Kubernetes 版本和實現而異。

透過使用 ConfigMap,你可以更靈活地管理應用程式的配置,使得配置管理更加清晰和易於操作。