ConfigMap:動態更新應用程序配置


ConfigMap 是一個 Kubernetes 資源,允許您將配置數據與應用程序代碼分開存儲。它提供了一種將配置設置與應用程序本身分離的方法,從而可以更輕鬆地管理和更新配置,而無需修改應用程序的代碼或容器鏡像。

ConfigMap 通常用於存儲鍵值對或配置文件。它可以通過使用 YAML 文件的聲明性方法或通過 Kubernetes API 創建。創建後,ConfigMap 可以作爲卷掛載,也可以作爲容器化應用程序中的環境變量公開。

何時使用 ConfigMap?

當您在 Kubernetes 集羣中運行同一應用程序的多個實例但具有不同的配置要求時,ConfigMap 特別有用。通過使用 ConfigMaps,您可以集中配置數據並動態更新它,而無需重新部署應用程序。

使用 ConfigMaps,您可以輕鬆修改應用程序的配置設置,例如數據庫連接字符串、API 端點、功能切換或任何其他配置參數,而無需重新生成或重新部署應用程序。這種靈活性簡化了在動態且可擴展的環境中(如 Kubernetes)中應用程序配置的管理。

在 Kubernetes 中使用動態值配置 Nginx 應用程序

要在 Kubernetes 環境中使用 ConfigMap 管理 Nginx 配置,您可以按照以下步驟操作:

Step1:創建 ConfigMap

創建一個 ConfigMap 來存儲你的 Nginx 配置。您可以通過創建一個 YAML 文件來做到這一點,我們稱之爲 nginx-config.yaml,其中包含以下內容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
      listen 80;
      server_name example.com;
      root /usr/share/nginx/html;
      index index.html;

      # Add your dynamic configuration here using the $variable_name syntax
      # Example: access_log /var/log/nginx/access.log $log_format;
    }

在這個例子中,我們正在創建一個名爲nginx-config的 ConfigMap,並在nginx.conf中定義 Nginx 配置。

Step2:部署 Nginx 掛載 ConfigMap

創建一個 YAML 部署文件,我們稱之爲 nginx-deployment.yaml,以部署 Nginx 並將 ConfigMap 掛載爲卷。文件內容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/conf.d/default.conf
              subPath: nginx.conf
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-config

在此示例中,我們將創建一個名爲 nginx-deployment 的部署,其中包含一個副本。Nginx 容器配置爲將 ConfigMap 作爲卷掛載在路徑 /etc/nginx/conf.d/default.conf 處。

Step3:應用 ConfigMap 和 Deployment

使用 kubectl apply 命令應用 ConfigMap 和 Deployment:

kubectl apply -f nginx-config.yaml
kubectl apply -f nginx-deployment.yaml

這將創建 ConfigMap 並使用指定的配置部署 Nginx。

使用動態參數值

通過執行以下步驟,您可以在 ConfigMap 中使用 Nginx 配置動態值。這使您可以輕鬆管理和更新 Nginx 配置,而無需修改部署本身。
要使 Nginx 配置中的 server_name 參數動態化並將其設置爲 Pod 的站點主機名,您可以使用 Pod 的 metadata.name 字段作爲 Nginx 部署中的環境變量。以下是實現此目的的方法:

Step1:修改配置映射

更新現有的 ConfigMap YAML (nginx-config.yaml)以包含 server_name 參數。修改 nginx.conf 部分,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
      listen 80;
      server_name ${SERVER_NAME};
      root /usr/share/nginx/html;
      index index.html;

      # Add your dynamic configuration here using the $variable_name syntax
      # Example: access_log /var/log/nginx/access.log $log_format;
    }

在此示例中,我們添加了 ${SERVER_NAME} 作爲動態值 server_name 的佔位符。

Step2:更新部署

在 Nginx 部署 YAML(nginx-deployment.yaml)中,修改容器 spec 以包含引用容器主機名的環境變量。按如下方式更新文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          env:
            - name: SERVER_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/conf.d/default.conf
              subPath: nginx.conf
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-config

在此示例中,我們添加了一個名爲 SERVER_NAME 的環境變量,並使用 fieldRef 語法從 pod 的 metadata.name 字段中設置其值。

Step3:應用更改

使用 kubectl apply 命令應用更新 ConfigMap 和 Deployment:

kubectl apply -f nginx-config.yaml
kubectl apply -f nginx-deployment.yaml

這將應用更改並使用server_name參數的動態值更新 Nginx 部署。
現在,每個 pod 的主機名將自動設置爲 Nginx 配置中server_name的值,使其動態且特定於每個 pod。
請注意,metadata.name 字段是指容器的分配名稱,默認情況下該名稱是唯一的。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aj_znuee-FAXvD1_c4eUAg