一、ConfigMap 基本概念
ConfigMap
是 Kubernetes 用來儲存非機密的配置資訊的物件。你可以將配置資料儲存在 ConfigMap
中,然後將這些資料掛載到容器內,或者將其以環境變數的形式注入到容器中。這使得你可以在無需重新構建映象的情況下更新配置。
二、ConfigMap 的主要功能
-
儲存配置資料:將配置資料儲存在 Kubernetes 叢集中。
-
注入配置資料:透過掛載到容器內的檔案、目錄或環境變數的方式將配置資料提供給容器。
-
動態更新:
ConfigMap
的資料可以在執行時更新,應用程式可以根據需要獲取最新的配置資料。
三、ConfigMap 的建立和管理
1.建立 ConfigMap
可以透過 YAML 檔案、kubectl
命令列工具或者從檔案中建立 ConfigMap
。
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 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/
kubectl get configmap my-config -o yaml
kubectl edit configmap my-config
kubectl delete configmap my-config
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
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
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
主要用於儲存非機密的配置資料。對於敏感資料,建議使用Secret
物件。 -
資料更新:如果
ConfigMap
的資料被更新,掛載到 Pod 中的資料不會自動更新,除非重新建立 Pod 或者容器。 -
大小限制:單個
ConfigMap
的大小有上限限制,通常為 1MB,但這個限制可能會因 Kubernetes 版本和實現而異。
透過使用 ConfigMap
,你可以更靈活地管理應用程式的配置,使得配置管理更加清晰和易於操作。