目錄
一、核心概念?
?定義?
?核心價值?
?與Secret的區別?
?二、核心特性?
?數據存儲?
?生命周期?
?作用域?
什么是 Configmap?
Configmap 能解決哪些問題?
ConfigMap 的主要作用
三、命令行直接創建
四、通過文件創建(常用)
把 configmap 做成 volume,掛載到 pod(常用)
五、指定目錄創建 configmap(常用)
六、使用 Configmap
通過環境變量引入
通過環境變量引入
一、核心概念?
-
?定義?
- Kubernetes 資源對象,用于存儲非敏感配置數據?(鍵值對形式)。
- 核心目標:將配置與容器鏡像解耦,實現“一次構建,多處部署”。
-
?核心價值?
- ?集中管理?:所有配置統一存儲在集群中,避免散落在各Pod/容器。
- ?動態更新?:修改ConfigMap后,部分場景可無需重啟Pod生效。
- ?環境隔離?:不同環境(開發/測試/生產)使用不同ConfigMap。
-
?與Secret的區別?
特性 ConfigMap Secret ?數據類型? 明文(鍵值對) 加密(Base64編碼,非絕對安全) ?典型用途? 配置文件、環境變量、參數 密碼、TLS證書、Token ?訪問控制? 無額外加密(依賴RBAC) 建議配合加密存儲(如kube-apiserver加密插件)
?二、核心特性?
-
?數據存儲?
- 存儲格式:鍵值對(
key: value
),支持多行文本(如配置文件)。 - 大小限制:單個ConfigMap最大 ?1MB?(K8S默認限制,可調整)。
- 存儲格式:鍵值對(
-
?生命周期?
- 隨命名空間存在,?Pod重建時重新掛載?(若Pod使用ConfigMap卷掛載)。
- 修改ConfigMap后,已運行的Pod需手動重啟或通過工具(如Reloader)觸發更新。
-
?作用域?
- 命名空間級別(與Pod同命名空間才能訪問)。
什么是 Configmap?
它就是配置文件掛載,就是資源主要是做配置文件掛載的
Configmap 是 k8s 中的資源對象,用于保存非機密性的配置的,數據可以用 key/value 鍵值對的形式保存,也可通過文件的形式保存
Configmap 能解決哪些問題?
就是將容器內部的應用和外部的配置進行解耦
緊密聯系的叫偶合
可以進行拆解的叫解耦
ConfigMap 的主要作用
就是為了讓鏡像和配置文件解耦,以便實現鏡像的可移植性和可復用性。
三、命令行直接創建
直接在命令行中指定 configmap 參數創建,通過--from-literal 指定參數
[root@k8s-master ~]# kubectl create configmap file.txt --from-literal k1=v1 --from-literal k2=v2
configmap/file.txt created
[root@k8s-master ~]# kubectl get cm
NAME DATA AGE
file.txt 2 13s
kube-root-ca.crt 1 6d22h
[root@k8s-master ~]# kubectl describe cm file.txt
Name: file.txt
Namespace: default
Labels: <none>
Annotations: <none>Data
====
k1:
----
v1
k2:
----
v2BinaryData
====Events: <none>
四、通過文件創建(常用)
把 configmap 做成 volume,掛載到 pod(常用)
通過指定文件創建一個 configmap,--from-file=<文件>,若沒有定義key,則使用文件名作為key,文件內容作為value。
當通過指定文件創建configmap,要先將服務的配置文件修改,先創建configmap再創建pod
[root@k8s-master ~]# vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test1labels:app: nginx129
spec:containers:- name: nginx129ports:- containerPort: 80image: nginx:latestimagePullPolicy: IfNotPresent
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
pod/pod-test1 created
[root@k8s-master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-89f8c6894-jdx6b 1/1 Running 1 (4h5m ago) 5d2h
pod-controller-7nlxv 1/1 Running 1 (4h5m ago) 4d14h
pod-controller-zn82f 1/1 Running 1 (14h ago) 4d14h
pod-test1 1/1 Running 0 6s
#將pod容器里的配置文件拷貝出來
[root@k8s-master ~]# kubectl cp pod-test1:/etc/nginx/conf.d/default.conf ./default.conf
tar: Removing leading `/' from member names
[root@k8s-master ~]# ls
default.conf
#把監聽端口號改為81
[root@k8s-master ~]# vim default.conf
server {listen 81;listen [::]:80;server_name localhost;[root@k8s-master ~]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:name: svc-test
spec:type: NodePortports:- targetPort: 81 #要與配置文件里的監聽端口號一致port: 808selector:app: nginx129 #這個名要和pod文件里標簽名一樣
[root@k8s-master ~]# vim nginx-pod.yaml
#把容器內端口號改為81
apiVersion: v1
kind: Pod
metadata:name: pod-test1labels:app: nginx129
spec:containers:- name: nginx129ports:- containerPort: 81 #修改default.conf 文件里server 監聽端口號一致image: nginx:latestimagePullPolicy: IfNotPresent
#添加下面的volumeMounts: #這個是容器內部的掛載- name: nginx-config #這個名要和下面名相同mountPath: /etc/nginx/conf.d/volumes: #這個是外部掛載- name: nginx-config #這個名要和上面名相同configMap:name: nginx-cm #這個是自定義configmap的名稱
#從文件中加載配置進行掛載
[root@k8s-master ~]# kubectl create cm nginx-cm --from-file default.conf=./default.conf
configmap/nginx-cm created
#查看詳細信息
#確認configmap是創建號了的
[root@k8s-master ~]# kubectl describe cm nginx-cm
Name: nginx-cm
Namespace: default
Labels: <none>
Annotations: <none>Data #數據
====
default.conf:
----
server {listen 81;listen [::]:80;server_name localhost;........#刪除之前的創的pod容器
[root@k8s-master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-89f8c6894-jdx6b 1/1 Running 1 (4h28m ago) 5d3h
pod-controller-7nlxv 1/1 Running 1 (4h28m ago) 4d14h
pod-controller-zn82f 1/1 Running 1 (14h ago) 4d14h
pod-test1 1/1 Running 0 22m
[root@k8s-master ~]# kubectl delete pod pod-test1
pod "pod-test1" deleted#在configmap創建好之后,創建pod
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
pod/pod-test1 created
#查看pod詳細信息,文件掛載成功
[root@k8s-master ~]# kubectl describe pod pod-test1
Name: pod-test1
Namespace: default
Priority: 0
Service Account: default
Node: k8s-node1/192.168.158.34
Start Time: Mon, 18 Aug 2025 20:24:29 +0800
Labels: app=nginx129
Annotations: cni.projectcalico.org/containerID: 70a867289da8c969ed5b8611a8169f7bb6693512fec19993739cec187270ed54cni.projectcalico.org/podIP: 10.244.36.101/32cni.projectcalico.org/podIPs: 10.244.36.101/32
Status: Running
IP: 10.244.36.101
IPs:IP: 10.244.36.101
Containers:nginx129: #容器名Container ID: docker://8a056c4707d85671e6953ec09d4a0639de6f336cc4d9c3dc0df9eee4a3f32e9fImage: nginx:latestImage ID: docker-pullable://nginx@sha256:33e0bbc7ca9ecf108140af6288c7c9d1ecc77548cbfd3952fd8466a75edefe57Port: 81/TCP #端口號Host Port: 0/TCPState: RunningStarted: Mon, 18 Aug 2025 20:24:29 +0800Ready: TrueRestart Count: 0Environment: <none>Mounts: #掛載路徑/etc/nginx/conf.d/ from nginx-config (rw) #成功掛載/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-88695 (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:nginx-config:Type: ConfigMap (a volume populated by a ConfigMap)Name: nginx-cm #configmap名稱Optional: falsekube-api-access-88695:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 14s default-scheduler Successfully assigned default/pod-test1 to k8s-node1Normal Pulled 14s kubelet Container image "nginx:latest" already present on machineNormal Created 14s kubelet Created container nginx129Normal Started 14s kubelet Started container nginx129
[root@k8s-master ~]# #查看服務端口,外部訪問端口號為31807
[root@k8s-master ~]# kubectl get service
svc-test NodePort 10.110.238.126 <none> 808:31807/TCP 31m
#現在我們可以進行頁面訪問,可以正常訪問到內部容器nginx服務
五、指定目錄創建 configmap(常用)
這個是基于文件創建cm
[root@k8s-master ~]# mkdir nginx-test
[root@k8s-master ~]# lsnginx-test[root@k8s-master ~]# cd nginx-test/
[root@k8s-master nginx-test]# ls
[root@k8s-master nginx-test]# echo server_id=1 > nginx1.cnf
[root@k8s-master nginx-test]# echo server_id=2 > nginx2.cnf
[root@k8s-master nginx-test]# ls
nginx1.cnf nginx2.cnf
[root@k8s-master nginx-test]# cd #創建configmap
[root@k8s-master ~]# kubectl create configmap nginx-cnf --from-file /root/nginx-test/
configmap/nginx-cnf created#查看 configmap 詳細信息
[root@k8s-master ~]# kubectl describe cm nginx-cnf
Name: nginx-cnf
Namespace: default
Labels: <none>
Annotations: <none>Data
====
nginx1.cnf:
----
server_id=1nginx2.cnf:
----
server_id=2BinaryData
====Events: <none>
[root@k8s-master ~]# kubectl get cm nginx-cnf -o yaml
apiVersion: v1
data:nginx1.cnf: |server_id=1nginx2.cnf: |server_id=2
kind: ConfigMap
metadata:creationTimestamp: "2025-08-18T13:49:36Z"name: nginx-cnfnamespace: defaultresourceVersion: "818058"uid: 40fce74a-1e53-445e-9126-d01c66166e34
六、使用 Configmap
通過環境變量引入
使用 configMapKeyRef變量
環境變量引入,比如mysql不需要指定密碼進去之后才行,現在我可以直接在文件中使用環境變量引入就行
好處就是,刪除很方便。解耦
#創建一個存儲 mysql 配置的 configmap
[root@k8s-master ~]# vim env-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:log: "1"lower: "1"#更新資源清單文件
[root@k8s-master ~]# kubectl apply -f env-cm.yaml
configmap/mysql created
#創建configmap成功
[root@k8s-master ~]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 7d1h
mysql 2 82s#創建 pod,引用 Configmap 中的內容
[root@k8s-master ~]# vim env-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mysql-pod
spec:containers:- name: mysqlimage: busyboximagePullPolicy: IfNotPresentcommand: [ "/bin/sh", "-c", "sleep 3600" ]env:- name: log_bin #定義環境變量 log_binvalueFrom:configMapKeyRef:name: mysql #指定 configmap 的名字key: log #指定 configmap 中的 key- name: lower #定義環境變量 lowervalueFrom:configMapKeyRef:name: mysqlkey: lowerrestartPolicy: Never#更新資源清單文件
[root@k8s-master ~]# kubectl apply -f env-pod.yaml
pod/mysql-pod created#創建pod成功
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-pod 1/1 Running 0 8s[root@k8s-master ~]# kubectl exec -it mysql-pod -- /bin/sh
/ # env
log_bin=1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mysql-pod
SVC_TEST_PORT_808_TCP_ADDR=10.110.238.126
SHLVL=1
HOME=/root
SVC_TEST_PORT_808_TCP_PORT=808
SVC_TEST_PORT_808_TCP_PROTO=tcp
NGINX_SVC_NODEPORT_SERVICE_HOST=10.105.189.102
SVC_TEST_SERVICE_HOST=10.110.238.126
SVC_TEST_PORT_808_TCP=tcp://10.110.238.126:808
TERM=xterm
lower=1
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
SVC_TEST_SERVICE_PORT=808
NGINX_SVC_NODEPORT_PORT=tcp://10.105.189.102:80
SVC_TEST_PORT=tcp://10.110.238.126:808
NGINX_SVC_NODEPORT_SERVICE_PORT=80
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
NGINX_SVC_NODEPORT_PORT_80_TCP_ADDR=10.105.189.102
NGINX_SVC_NODEPORT_PORT_80_TCP_PORT=80
NGINX_SVC_NODEPORT_PORT_80_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
NGINX_SVC_NODEPORT_PORT_80_TCP=tcp://10.105.189.102:80
/ # exit
通過環境變量引入
#使用 envfrom變量
通過
#使用 envfrom變量 #直接引入之前創建configmap里的變量 data: log: "1" lower: "1"
#下面使用 envfrom變量#先創建
[root@k8s-master ~]# vim envfrom-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mysql-pod-envfrom
spec:containers:- name: mysqlimage: busybox:1.28imagePullPolicy: IfNotPresentcommand: [ "/bin/sh", "-c", "sleep 3600" ]envFrom:- configMapRef:name: mysql #指定configmap的名字restartPolicy: Never#更新資源清單文件[root@k8s-master ~]# kubectl apply -f envfrom-pod.yaml
pod/mysql-pod-envfrom created#查看pod資源,mysql-pod-envfrom 創建好了
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-pod 1/1 Running 0 13m
mysql-pod-envfrom 1/1 Running 0 9s[root@k8s-master ~]# kubectl exec -it mysql-pod-envfrom -c mysql -- /bin/sh
/ # env
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mysql-pod-envfrom
SVC_TEST_PORT_808_TCP_ADDR=10.110.238.126
SHLVL=1
HOME=/root
SVC_TEST_PORT_808_TCP_PORT=808
SVC_TEST_PORT_808_TCP_PROTO=tcp
NGINX_SVC_NODEPORT_SERVICE_HOST=10.105.189.102
SVC_TEST_SERVICE_HOST=10.110.238.126
SVC_TEST_PORT_808_TCP=tcp://10.110.238.126:808
TERM=xterm
lower=1 ####
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
SVC_TEST_SERVICE_PORT=808
SVC_TEST_PORT=tcp://10.110.238.126:808
NGINX_SVC_NODEPORT_PORT=tcp://10.105.189.102:80
NGINX_SVC_NODEPORT_SERVICE_PORT=80
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
log=1 ####
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
NGINX_SVC_NODEPORT_PORT_80_TCP_ADDR=10.105.189.102
NGINX_SVC_NODEPORT_PORT_80_TCP_PORT=80
NGINX_SVC_NODEPORT_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
NGINX_SVC_NODEPORT_PORT_80_TCP=tcp://10.105.189.102:80
/ # exit