K8S ConfigMap 快速開始

一、什么是 ConfigMap?

ConfigMap?是 Kubernetes 中用于存儲非敏感配置數據的 API 對象,支持以鍵值對(Key-Value)或文件的形式存儲配置,允許將配置與鏡像解耦,實現配置的集中管理和動態更新。

二、主要用途

  • 存儲配置數據
  • 應用的配置文件(如?config.propertiesapp.yaml)。
  • 環境變量(如數據庫連接字符串、API 地址)。
  • 命令行參數或啟動腳本。
  • 解耦配置與鏡像
  • 同一鏡像可通過不同 ConfigMap 適配不同環境(如開發環境使用本地數據庫,生產環境使用遠程數據庫)。
  • 使用?ConfigMap 可以統一管理不同環境(開發、測試、生產)的配置差異。
  • 解耦應用配置與鏡像,避免硬編碼配置到鏡像中。
  • 動態更新配置
  • 修改 ConfigMap 后,可通過重啟 Pod 或熱加載(依賴應用支持)使新配置生效。

三、局限性

  • ConfigMap 并不提供保密或者加密功能。 如果你想存儲的數據是機密的,請使用 Secret。
  • 在 ConfigMap 中保存的數據不可超過 1 MiB。如果你需要保存超出此尺寸限制的數據,你可能希望考慮掛載存儲卷 或者使用獨立的數據庫或者文件服務。
  • ConfigMap 的熱加載依賴應用自己實現。

四、創建 ConfigMap 的方式

ConfigMap 可通過?kubectl 命令或?YAML 文件創建,支持三種數據源:文件目錄字面量

4.1、通過 kubectl 命令創建

4.1.1、使用字面量創建

kubectl create configmap my-config --from-literal=username=admin --from-literal=password=123456
  • ?--from-literal=key1=config1 --from-literal=key2=config2
  • literal 字面量的意思
  • configmap 可以簡寫為 cm
kubectl describe cm my-config

?

4.1.2、使用文件創建

# 單個文件
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt# 文件名 file1.txt 作為 key
kubectl create configmap my-config --from-file=/path/to/bar/file1.txt# 多個文件
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  • ?單個文件
vim config.properties### 文件內容如下
server.port=8080
application.name=myapp
kubectl create configmap my-config --from-file=config=./config.properties

# 文件名作為 key
kubectl create cm my-config --from-file=config.properties

  • ?多個文件
vim db.properties### 文件內容如下
datasource.username=root
datasource.password=123456
datasource.url=jdbc:mysql://localhost:3306/order
kubectl create configmap my-config --from-file=config.properties --from-file=db.properties

?

4.1.3、使用目錄創建

kubectl create configmap my-config --from-file=path/to/bar
mkdir conf
cd conf
vim application.yaml
### 文件內容如下
server:port: 8080spring:cloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848application:name: order-service
###
vim db.properties
### 文件內容如下
datasource.username=root
datasource.password=123456
datasource.url=jdbc:mysql://localhost:3306/order
###
cd ..

?

kubectl create cm my-config --from-file=conf

?

4.2、通過 YAML 文件創建

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:username: "admin"password: "123456"application.yaml: |server:port: 8080db.properties: |datasource.username=rootdatasource.password=123456

?| 表示下面的內容為多行。

kubectl apply -f configmap.yaml

?

五、在 Pod 中使用 ConfigMap

ConfigMap 可通過?環境變量?或?Volume 掛載?注入到容器中。

我們以 4.2 節創建的 my-config 為例,來講解如何在?Pod 中使用 ConfigMap。

5.1、作為環境變量注入 env

apiVersion: v1
kind: Pod
metadata:name: envcm-pod
spec:restartPolicy: Nevercontainers:- name: envcm-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定義容器中的環境變量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password 
  • ?像 Alpine 鏡像,或者基于?Alpine 制作的工具鏡像,容器內沒有運行服務,需要啟動后休眠一段時間,防止容器被 K8S 殺掉。
  • restartPolicy: Never 休眠結束后容器退出就退出了,不需要?K8S 重啟該容器。默認是 Always 總是重啟。設為 Never 防止浪費系統資源。
  • ?進入容器查看環境變量
kubectl exec -it envcm-pod -- /bin/sh
/# env
USERNAME=admin
PASSWORD=123456

?5.2、作為環境變量注入 envFrom

apiVersion: v1
kind: Pod
metadata:name: envfrom-pod
spec:restartPolicy: Nevercontainers:- name: envcm-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]envFrom:- configMapRef:name: my-config

?以整個 ConfigMap 作為環境變量數據源。

  • ??進入容器查看環境變量
kubectl exec -it envfrom-pod -- /bin/sh
/ # env

5.3、環境變量方式使用的 ConfigMap 數據不會被自動更新

以環境變量方式使用的 ConfigMap 數據不會被自動更新。 更新這些數據需要重新啟動 Pod。

# 編輯 ConfigMap
kubectl edit cm my-config
# 把 password 從 123456 -> 456789
# 像 vim 一樣 wq 保存退出

  • ?進入容器查看環境變量
kubectl exec -it envcm-pod -- /bin/sh
/# env
USERNAME=admin
# 還是 123456
PASSWORD=123456 kubectl exec -it envfrom-pod -- /bin/sh
# 還是 123456
password=123456

?5.4、通過 Volume 掛載為文件

apiVersion: v1
kind: Pod
metadata:name: volumes-pod
spec:restartPolicy: Nevervolumes:- name: volumes-name # 卷的名字configMap:name: my-config # ConfigMap 的名字containers:- name: volumes-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]volumeMounts:- name: volumes-namemountPath: /data/conf # 掛載到容器哪個目錄
  • ??進入容器查看文件
kubectl exec -it volumes-pod -- /bin/sh

以 Volume 形式掛載 ConfigMap,ConfigMap 每一個 key 都會生成一個文件。??

  • ???進入容器查看環境變量
kubectl exec -it volumes-pod -- /bin/sh
/# env
環境變量中不會有配置信息

?5.5、熱加載

# 編輯 ConfigMap
kubectl edit cm my-config
# 把 password 從 456789 -> 111111
# 像 vim 一樣 wq 保存退出
  • ????進入容器查看文件
kubectl exec -it volumes-pod -- /bin/sh

容器內文件的值被更新了。但是會有一定的延遲。具體延遲多少,官方介紹取決于高速緩存類型。

5.6、items 選取 key

我們知道,以 Volume 形式掛載 ConfigMap,ConfigMap 的每一個 key 都會生成一個文件。

對于 4.2 的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:username: "admin"password: "123456"application.yaml: |server:port: 8080db.properties: |datasource.username=rootdatasource.password=123456

會生成 username、password、application.yaml、db.properties 這四個文件。

那么,如果我們希望普通的屬性,像 username、password 注入到環境變量,而?application.yaml、db.properties 這種,生成文件,要怎么做呢?

apiVersion: v1
kind: Pod
metadata:name: volumes-items-pod
spec:restartPolicy: Nevervolumes:- name: volumes-name # 卷的名字configMap:name: my-config # ConfigMap 的名字items:- key: "application.yaml" # ConfigMap 的 keypath: "application.yaml" # key 映射成的文件- key: "db.properties"path: "db.properties" containers:- name: volumes-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定義容器中的環境變量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password volumeMounts:- name: volumes-namemountPath: /data/conf

通過 .volumes.configMap.items 選取需要做成卷的 ConfigMap key-value。

kubectl exec -it volumes-items-pod -c volumes-pod -- /bin/sh
/ # env
USERNAME=admin
PASSWORD=111111

5.7、名稱空間限定

ConfigMap 是一種名稱空間限定的資源。某一名稱空間下的 Pod,只能引用同一名稱空間下的?ConfigMap。

對于?4.2 的 ConfigMap,我們沒有寫,就是默認 default 名稱空間下。現在我們 dev 名稱空間下的一個 Pod:

apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: dev
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定義容器中的環境變量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password

容器會報?CreateContainerConfigError 起不來。

5.8、多環境配置

ConfigMap 是名稱空間限定的資源,所以在多名稱空間環境下(比如 dev、prod),我們可以給每個名稱空間創建同名的配置,然后在不同名稱空間下的 Pod 引用這些配置。

# 創建名稱空間
kubectl create ns dev
kubectl create ns prod
# 創建 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: dev
data:username: "dev"password: "123456"
###
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: prod
data:username: "prod"password: "123456"
  • ?dev 下啟動 Pod:
apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: dev
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["env"]env:- name: USERNAME # 定義容器中的環境變量valueFrom:configMapKeyRef:name: app-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: app-configkey: password 

  • prod 下啟動 Pod:
apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: prod
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["env"]env:- name: USERNAME # 定義容器中的環境變量valueFrom:configMapKeyRef:name: app-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: app-configkey: password 

六、Java 項目使用 ConfigMap 熱加載配置

到此,我們知道了 ConfigMap 如果作為 Spring Boot 項目的配置的話,存在一些不足:

1、時效性不高。ConfigMap 可以作為配置文件掛載進容器文件系統,但是這中間會有一些延遲。而且,Spring Boot 項目在啟動的時候加載了一次 application.yml 之類的配置文件后,就不會再加載了。這個時候?ConfigMap 再更新配置文件其實沒什么意義。

2、時效性更好的環境變量的方式,ConfigMap 卻無法更新。

所以,Spring Boot?項目需要自己監聽 ConfigMap 變化,然后更新 Environment。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78912.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Prometheus使用Recoding Rules優化性能

通過PromQL可以實時對Prometheus中采集到的樣本數據進行查詢,聚合以及其它各種運算操作。而在某些PromQL較為復雜且計算量較大時,直接使用PromQL可能會導致Prometheus響應超時的情況。這時需要一種能夠類似于后臺批處理的機制能夠在后臺完成這些復雜運算…

C++ RAII 編程范式詳解

C RAII 編程范式詳解 一、RAII 核心概念 RAII(Resource Acquisition Is Initialization,資源獲取即初始化) 是 C 的核心編程范式,通過將資源生命周期與對象生命周期綁定實現安全、自動化的資源管理。 核心原則: 資源…

Rust 學習筆記:枚舉與模式匹配

Rust 學習筆記&#xff1a;枚舉與模式匹配 Rust 學習筆記&#xff1a;枚舉與模式匹配定義枚舉&#xff08;Enum&#xff09;枚舉變量Option 枚舉及其相對于 NULL 的優勢match 和枚舉與 Option\<T\> 匹配match 應該是詳盡的Catch-all 模式和 _ 占位符使用 if let 和 let e…

《WebGIS之Vue進階教程》(13)ref的實現

1 為什么需要ref 由于proxy只能代理引用類型數據(如: 對象, 數組, Set, Map...), 需要一種方式代理普通類型數據(String, Number, Boolean...) 設計ref主要是為了處理普通類型數據, 使普通類型數據也具有響應式 除此之外, 通過reactive代理的對象可能會出現響應丟失的情況. 使…

Redis 緩存并發問題深度解析:擊穿、雪崩與穿透防治指南

Redis-緩存并發 引言&#xff1a;緩存&#xff0c;高性能架構的基石與并發挑戰一、 緩存擊穿&#xff1a;熱點 Key 失效引發的“單點風暴”1.1 什么是緩存擊穿&#xff1f;1.2 緩存擊穿的風險1.3 緩存擊穿的解決方案1.3.1 互斥鎖&#xff08;Mutex Lock&#xff09;/ 分布式鎖 …

Python 數據智能實戰 (4):智能用戶分群 - 融合行為

寫在前面 —— 超越 RFM 標簽,結合用戶行為與 LLM 文本洞察,實現更精準、更立體的客戶細分 歡迎回來!在前面的學習中,我們已經為 Python 數據智能工具箱添置了與大語言模型 (LLM) 交互的能力,特別是掌握了如何利用 LLM 將非結構化的文本信息轉化為包含深層語義的數值向量…

FreeMarker語法深度解析與Node.js集成實踐指南

一、FreeMarker核心語法體系 1.1 基礎模板結構 <#-- 注釋語法 --> ${expression} <#-- 輸出表達式 --> <#directive paramvalue> <#-- 指令語法 -->1.2 數據類型處理 標量類型深度處理&#xff1a; <#assign num 123.45?floor> <#--…

【計算機視覺】目標檢測:深度解析YOLOv5:下一代實時目標檢測框架實戰指南

深度解析YOLOv5&#xff1a;下一代實時目標檢測框架實戰指南 技術演進與架構設計YOLO系列發展脈絡YOLOv5核心架構1. 骨干網絡&#xff08;Backbone&#xff09;2. 特征融合&#xff08;Neck&#xff09;3. 檢測頭&#xff08;Head&#xff09; 環境配置與快速開始硬件要求建議詳…

STM32 定時器TIM

定時器基礎知識 定時器就是用來定時的機器&#xff0c;是存在于STM32單片機中的一個外設。STM32總共有8個定時器&#xff0c;分別是2個高級定時器(TIM1、TIM8)&#xff0c;4個通用定時器(TIM2、TIM3、TIM4、TIM5)和2個基本定時器(TIM6、TIM7)&#xff0c;如下圖所示: STM32F1…

OpenObserve API Usage Guide for Log Management

OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目標 本文檔旨在詳細介紹 OpenObserve 的 API 使用方法&#xff0c;幫助用戶通過 API 實現日志管理功能&#xff0c;包括日志攝入、查詢、模糊匹配&#xff08;類似 SQL 的 LIKE&#xff09;、stream 管理…

消防崗位技能競賽流程方案策劃

一、比賽目的&#xff1a; 為大力倡導“11.9”全國消防安全活動月&#xff0c;緊緊圍繞“人人參與消防&#xff0c;共創平安和諧”的活動主題&#xff0c;結合公司實際情況&#xff0c;特開展一次消防技能競賽活動。開展一場比思想、比工作作風、比消防業務技能、比業余文化生…

DAY9-USF4.0技術文檔筆記

目錄 1.概述 2.參考協議標準 3.術語與定義 4.引言 5.UFS架構 6.UFS電氣特性&#xff1a;時鐘、復位、信號與電源 7.復位、加電升壓和斷電降壓 8. M-PHY 9.UniPro 10.UTP 11.SCSI 12.UFS安全 13.UFS功能描述 14.描述符、標志與屬性 15.UFS機械標準 SCSI 查詢命令 1.重要產品…

安裝kubernetes 1.33版本

一、環境準備 1、內核升級 #升級內核&#xff1a; yum -y install kernel-ml-5.10.3-1.el7.elrepo.x86_64.rpm kernel-ml-devel-5.10.3-1.el7.elrepo.x86_64.rpm# 查詢可用內核版本 # awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg# 調整默…

【IPMV】圖像處理與機器視覺:Lec8 Image Pyramid 圖像金字塔

【IPMV】圖像處理與機器視覺 本系列為2025年同濟大學自動化專業**圖像處理與機器視覺**課程筆記 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid 持續更新中 文章目錄 【IPMV】圖像處…

產品經理.產品設計.產品設計工具

一、 產品經理常用工具 1. 業務流程圖---系統流程圖 業務流程圖&#xff0c;面向用戶調研&#xff0c;描述業務的流轉和數據的處理要求&#xff0c;跟用戶和業務方確認&#xff1b;---業務角色的泳道流程圖。 系統流程圖&#xff0c;面向產品需求設計&#xff0c; prd系描述各…

6軸、智能、低功耗慣性測量單元BMI270及其OIS接口

BOSCH慣性傳感器IMUs 芯片代碼 通過00寄存器讀回的芯片編碼可以判斷芯片型號,BMI270為(0x24) &#xff0c;如不是該值&#xff0c;則說明不是BMI270。 型號芯片代碼BMI085CHIP_ID ( 0x1F)BMI088CHIP_ID ( 0x1E)BMI160CHIP_ID (0xD1)BMI270CHIP_ID (0x24)BMI323CHIP_ID (0x004…

【文獻速遞】鄰位連接技術(PLA)在細胞器相互作用中的應用

在神經科學研究領域&#xff0c;細胞死亡機制一直是關注的重點&#xff0c;尤其是與神經退行性疾病相關的細胞死亡形式。荷蘭格羅寧根大學的研究人員在2025年發表了“Regulation of calcium signaling prevents neuronal death mediated by NIST DEP in xenoferroptotic cell d…

六.割草機技術總結--6.RTK定位精度分析

六.割草機技術總結–6.RTK定位精度分析 6.1 1cm+1ppm 中的ppm是什么意思? 精度 RTK 位置精度(在 RTK 時)1 cm + 1 ppm ( 水 平 ) 1 . 5 cm + 1 ppm ( 垂 直 ),其中的ppm是什么意思? 在RTK(實時動態定位)技術中,ppm表示 Parts Per Million(百萬分之一),是一種與距離…

MCP的基礎知識

一、了解MCP的基礎知識 1.函數調用Function Calling Function Calling是openai在2023年推出的一個非常重要的概念&#xff1a;Function Calling&#xff08;函數調用&#xff09;本質上就是提供了大模型與外部系統的交互能力&#xff0c;類似于給大模型安裝了一個“外掛工具箱…

量化交易之數學與統計學基礎2.4——線性代數與矩陣運算 | 矩陣分解

量化交易之數學與統計學基礎2.4——線性代數與矩陣運算 | 矩陣分解 第二部分&#xff1a;線性代數與矩陣運算 第4節&#xff1a;矩陣分解&#xff1a;奇異值分解&#xff08;SVD&#xff09;在數據壓縮和風險分解的應用 一、奇異值分解&#xff08;SVD&#xff09;基礎&#xf…