【一起來學kubernetes】17、Configmap使用詳解

    • 前言
    • 概述
    • 核心特性
    • 創建 ConfigMap
    • 使用 ConfigMap
          • 1. **環境變量**
          • 2. **Volume 掛載**
          • 3. **命令行參數**
    • 更新與熱重載
    • Docker容器中Java服務使用Configmap
      • **一、通過環境變量注入**
        • **步驟說明**
        • **示例配置**
      • **二、通過 Volume 掛載配置文件**
        • **步驟說明**
        • **示例配置**
      • **三、動態刷新配置(高級場景)**
        • **實現原理**
        • **Spring Boot 示例(熱更新)**
      • **四、最佳實踐**
      • **五、常見問題排查**
    • 典型應用場景
    • 安全與權限
    • 最佳實踐
    • 常見問題
    • 總結
    • 拓展

在這里插入圖片描述

前言

在上一篇文章中,我們主要介紹了k8s中針對定時任務的批處理任務的資源:CronJob 和 一次性批處理任務的資源 : Job; 在進行任務處理的過程中,不可或缺的一個東西就是配置,接下來我們就把k8s中用于配置配置信息的工具Configmap進行一個深入的介紹


概述

ConfigMap 是 Kubernetes 中用于存儲和管理配置數據的資源對象,允許你在不修改容器鏡像的情況下,動態注入配置信息到 Pod 中。其核心思想是將配置與應用程序代碼解耦,提升靈活性和可維護性。


核心特性

? 鍵值對存儲:配置數據以 key-value 形式存儲,便于靈活讀取。
? 多 Pod 共享:單個 ConfigMap 可被多個 Pod 或服務共享。
? 動態更新:支持配置熱更新(依賴 Volume 類型及 Kubernetes 版本)。
? 非敏感數據:適用于存儲明文配置(如日志級別、超時設置),敏感數據應使用 Secrets


創建 ConfigMap

方式 1:通過 YAML 文件定義

apiVersion: v1
kind: ConfigMap
metadata:name: app-config   # 唯一標識符namespace: default  # 可選命名空間
data:db-host: localhostdb-port: "5432"log-level: info

方式 2:通過 kubectl 命令

kubectl create configmap app-config \--from-file=db.conf \--from-literal=log-level=debug

? --from-file:從文件加載鍵值對(文件名作為 key)。
? --from-literal:直接指定鍵值對。

方式 3:通過 API 創建
使用 curl 或客戶端庫直接調用 Kubernetes API。


使用 ConfigMap

ConfigMap 可通過以下三種方式注入 Pod:

1. 環境變量

在 Pod 的 env 字段中引用 ConfigMap:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-appenv:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-config  # ConfigMap 名稱key: db-host     # 對應的鍵
2. Volume 掛載

將 ConfigMap 掛載為目錄或文件:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:volumes:- name: config-volumeconfigMap:name: app-configcontainers:- name: my-containerimage: my-appvolumeMounts:- name: config-volumemountPath: /etc/config   # 掛載到容器內的目錄

? 掛載后,容器內 /etc/config 目錄下會生成以 key 命名的文件(如 db-host)。

3. 命令行參數

在容器啟動命令中動態替換參數:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-appargs:- "-db-host=${DB_HOST}"- "-log-level=${LOG_LEVEL}"env:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-configkey: db-host- name: LOG_LEVELvalueFrom:configMapKeyRef:name: app-configkey: log-level

更新與熱重載

? 手動更新:修改 ConfigMap 后,新 Pod 會自動獲取最新配置,舊 Pod 需等待調度器重新調度。
? 熱更新:若使用 volumeMounts 掛載 ConfigMap,部分 Volume 類型(如 emptyDir)支持熱更新,但需確保容器進程主動監聽文件變化。


Docker容器中Java服務使用Configmap

在 Kubernetes Pod 中運行的 Docker 容器內的 Java 服務可以通過以下兩種主要方式使用 ConfigMap 配置的變量:


一、通過環境變量注入

步驟說明
  1. 在 Kubernetes Pod 中配置環境變量
    在 Pod 的 env 字段中引用 ConfigMap 的鍵值對,Kubernetes 會將這些值注入為容器環境變量。

  2. 在 Java 代碼中讀取環境變量
    使用 System.getenv() 或框架提供的配置綁定功能(如 Spring Boot 的 @Value)獲取變量值。

示例配置

Kubernetes Pod YAML

apiVersion: v1
kind: Pod
metadata:name: java-app
spec:containers:- name: java-containerimage: your-java-imageenv:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-config   # ConfigMap 名稱key: db-host     # ConfigMap 中的鍵- name: DB_PORTvalueFrom:configMapKeyRef:name: app-configkey: db-port

Java 代碼讀取(原生方式)

public class ConfigExample {public static void main(String[] args) {String dbHost = System.getenv("DB_HOST"); // 從環境變量讀取int dbPort = Integer.parseInt(System.getenv("DB_PORT"));System.out.println("Connecting to DB: " + dbHost + ":" + dbPort);}
}

Java 代碼讀取(Spring Boot 方式)

@Configuration
public class AppConfig {@Value("${DB_HOST}")private String dbHost;@Value("${DB_PORT}")private int dbPort;// Getter 和業務邏輯
}

? 關鍵點:確保 Spring Boot 的 application.propertiesapplication.yml 中未定義同名屬性,否則會覆蓋環境變量。


二、通過 Volume 掛載配置文件

步驟說明
  1. 將 ConfigMap 掛載為目錄
    在 Pod 中定義 Volume,并將 ConfigMap 掛載到容器內的目錄(如 /app/config)。

  2. Java 服務讀取配置文件
    假設 ConfigMap 中的鍵值對對應配置文件內容(如 application.yml),Java 服務直接讀取該文件。

示例配置

Kubernetes Pod YAML

apiVersion: v1
kind: Pod
metadata:name: java-app
spec:volumes:- name: config-volumeconfigMap:name: app-config   # ConfigMap 名稱containers:- name: java-containerimage: your-java-imagevolumeMounts:- name: config-volumemountPath: /app/config   # 掛載到容器內的目錄

ConfigMap 數據結構

# app-config ConfigMap
data:application.yml: |db:host: localhostport: 5432log:level: info

Java 代碼讀取配置文件

public class ConfigLoader {public static void loadConfig(String filePath) {try (InputStream inputStream = new FileInputStream(filePath)) {Yaml yaml = new Yaml(new Constructor(Config.class));Config config = yaml.load(inputStream);System.out.println("DB Host: " + config.getDb().getHost());} catch (IOException e) {e.printStackTrace();}}
}// 配置類映射 YAML 結構
class Config {private Db db;private Log log;// Getter 和 Setter
}class Db {private String host;private int port;// Getter 和 Setter
}class Log {private String level;// Getter 和 Setter
}

三、動態刷新配置(高級場景)

實現原理
  1. 基于文件監聽的熱更新
    ? 將 ConfigMap 掛載為 Volume,并監控配置文件變化(如 Spring Boot 的 spring.cloud.config監視)。
    ? 需容器內進程主動監聽文件變動(如 Spring Boot 的 @RefreshScope)。

  2. 使用 Kubernetes ConfigMap 事件監聽
    ? 通過客戶端庫監聽 ConfigMap 變更事件,動態更新應用配置(適用于自定義框架)。

Spring Boot 示例(熱更新)
# application.yml
spring:cloud:config:monitor:enabled: truepoll-interval: 5s
@RestController
@RefreshScope
public class DynamicConfigController {@Value("${db.host}")private String dbHost;@GetMapping("/config")public String getDbHost() {return dbHost;}
}

? 依賴:需添加 spring-cloud-starter-configspring-boot-starter-actuator 依賴。


四、最佳實踐

  1. 優先選擇環境變量
    ? 簡單直接,適合鍵值對較少的配置(如數據庫地址、開關標志)。
    ? 與 Kubernetes 生態無縫集成,無需額外代碼。

  2. 文件掛載適合復雜配置
    ? 當配置結構復雜(如多層級 JSON/YAML)時,將 ConfigMap 映射為配置文件更易管理。
    ? 需確保容器內有文件解析邏輯。

  3. 結合 Secrets 處理敏感數據
    ? 使用 Secrets 存儲密碼、API 密鑰等敏感信息,避免硬編碼。

  4. 配置版本化管理
    ? 通過 Git 或 ConfigMap 的 data 字段版本歷史跟蹤變更。


五、常見問題排查

Q1: ConfigMap 變量未生效?
? 檢查 Pod 日志:kubectl logs <pod-name> -c java-container
? 確認 ConfigMap 名稱和鍵名拼寫一致。
? 若使用文件掛載,驗證掛載路徑是否正確(如 /app/config)。

Q2: 如何調試環境變量?
? 在 Pod 中運行命令查看環境變量:

kubectl exec <pod-name> -c java-container -- printenv | grep DB_

通過以上方法,Java 服務可以靈活地集成 Kubernetes ConfigMap,實現配置與代碼的解耦,提升部署和維護效率。

典型應用場景

  1. 數據庫配置:存儲主機、端口、用戶名、密碼(非敏感部分)。
  2. API 密鑰:管理第三方服務的訪問令牌(需結合 Secrets)。
  3. 環境變量:動態調整日志級別、超時時間等運行時參數。
  4. 模板配置:注入 Nginx/Redis 配置文件內容。

安全與權限

? RBAC 控制:通過 kubectl auth can-i 或 YAML 中的 roles/rolebindings 限制 ConfigMap 的訪問權限。
? 敏感數據:避免存儲密碼等機密信息,改用 Secrets(加密存儲)。
? 命名空間隔離:ConfigMap 默認作用域為當前命名空間,跨命名空間訪問需顯式指定。


最佳實踐

  1. 命名規范:使用 configmap/<應用>-<環境>(如 configmap/web-prod)。
  2. 分層配置:將復雜配置拆分為多個 ConfigMap,按需組合。
  3. 版本控制:結合 Git 管理 ConfigMap 的變更歷史。
  4. 監控日志:通過 kubectl describe configmap 查看變更記錄。
  5. 文檔化:記錄 ConfigMap 中各鍵值的含義及默認值。

常見問題

Q1: ConfigMap 更新后 Pod 未生效?
A: 確保 Pod 使用了正確的 ConfigMap 名稱,并檢查是否通過 volumeMounts 掛載。對于熱更新,需確認容器進程支持文件變更監聽(如 Node.js 的 fs.watch)。

Q2: 如何加密 ConfigMap 數據?
A: Kubernetes 不原生支持加密 ConfigMap,但可通過以下方式實現:
? 使用 Secrets 存儲加密數據。
? 在部署前對值進行 Base64 編碼,部署后再解碼(犧牲可讀性)。


總結

ConfigMap 是 Kubernetes 中不可或缺的配置管理工具,通過解耦配置與代碼,顯著提升了部署和維護的效率。合理使用 ConfigMap 結合 Secrets、RBAC 和自動化工具(如 Helm),可以構建 robust 的云原生應用架構。

拓展

【一起來學kubernetes】15、Job使用詳解

【一起來學kubernetes】14、StatefulSet使用詳解

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

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

相關文章

【八股文】從瀏覽器輸入一個url到服務器的流程

1.url解析與DNS解析 瀏覽器解析用戶輸入的URL&#xff0c;提取協議&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路徑等信息 瀏覽器首先檢查本地DNS緩存和系統DNS緩存&#xff0c;若未命中&#xff0c;查詢本地hosts文件 最后遞歸查詢向本地DNS服務器發起請求&#xff…

網絡空間安全(34)安全防御體系

前言 安全防御體系是一個多層次、多維度的系統&#xff0c;旨在保護組織或個人的信息資產免受各種網絡攻擊和威脅。 一、技術層面 網絡邊界防御 防火墻&#xff1a;部署在網絡邊界&#xff0c;通過設定規則允許或阻止特定流量的進出&#xff0c;保護內部網絡不受外部攻擊。入侵…

Linux 入門:權限的認識和學習

目錄 一.shell命令以及運行原理 二.Linux權限的概念 1.Linux下兩種用戶 cannot open directory .: Permission denied 問題 2.Linux權限管理 1).是什么 2).為什么&#xff08;權限角色目標權限屬性&#xff09; 3).文件訪問者的分類&#xff08;角色&#xff09; 4).文…

【筆記】計算機網絡——數據鏈路層

概述 鏈路是從一個結點到相鄰結點的物理路線&#xff0c;數據鏈路則是在鏈路的基礎上增加了一些必要的硬件和軟件實現 數據鏈路層位于物理層和網絡層之間&#xff0c;它的核心任務是在直接相連的節點&#xff08;如相鄰的交換機&#xff0c;路由器&#xff09;之間提供可靠且…

ngx_url_t

定義在 src/core/ngx_inet.h typedef struct {ngx_str_t url;ngx_str_t host;ngx_str_t port_text;ngx_str_t uri;in_port_t port;in_port_t default_port;in_port_t …

搜廣推校招面經五十四

美團推薦算法 一、手撕Transformer的位置編碼 1.1. 位置編碼的作用 Transformer 模型沒有顯式的序列信息&#xff08;如 RNN 的循環結構&#xff09;&#xff0c;因此需要通過位置編碼&#xff08;Positional Encoding&#xff09;為輸入序列中的每個位置添加位置信息。位置…

網絡爬蟲【爬蟲庫urllib】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 urllib介紹 Urllib是Python自帶的標準庫&#xff0c;無須安裝&#xff0c;直接引用即可。 Urllib是一個收集幾個模塊來使用URL的軟件包&#xff0c;大致具備以下功能。 ● urlli…

LabVIEW棉花穴播器排種自動監測系統

一、項目背景與行業痛點 1. 農業需求驅動 我國棉花主產區&#xff0c;種植面積常年超250萬公頃&#xff0c;傳統人工播種存在兩大核心問題&#xff1a; 效率瓶頸&#xff1a;人均日播種面積不足0.5公頃&#xff0c;難以匹配規模化種植需求&#xff1b; 精度缺陷&#xff1a;人…

解決diffusers加載stablediffusion模型,輸入prompt總是報錯token數超出clip最大長度限制

1. StableDiffusion1.5 在加載huggingface中的擴散模型時&#xff0c;輸入prompt總是會被報錯超過clip的最大長度限制。 解決方案&#xff1a;使用compel庫 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…

jmeter配件元素

jmeter配件元素 CSV Data Set Config名詞解釋測試場景Recycle on EOF:False配置測試結果 Recycle on EOF:True配置測試結果 Sharing mode:All Threads配置測試結果 Sharing mode:Current thread group配置測試結果 Sharing mode:Current thread配置測試結果 HTTP Header Manage…

Navicat SqlServer 設置自增主鍵

Navicat是一款優秀的數據庫管理工具&#xff0c;可以連接很多類型的數據庫。使用它可以極大的提高工作效率。 Navicat 不能設置SqlServer自增字段&#xff0c;只能通過sql語句來實現 建表時設置 create table <表名> ( <字段1-主鍵> int identity (1,1) primar…

Elasticsearch搜索引擎 3(DSL)

Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;語句來定義查詢條件&#xff0c;其JavaAPI就是在組織DSL條件。 1.DSL查詢 葉子查詢&#xff08;Leaf query clauses&#xff09;&#xff1a;在特定的字段里查詢特定值&#xff0c;屬于簡單…

final 在 java 中有什么作用?

final 在 java 中有什么作用&#xff1f; 修飾變量 修飾基本數據類型變量&#xff1a; 當用final修飾基本數據類型變量時&#xff0c;該變量就變成了常量&#xff0c;其值在初始化后不能被改變。 final int num 10; // num 20; // 這行代碼會導致編譯錯誤&#xff0c;因…

Dubbo/Hession2序列化Immutable類型的集合異常問題

問題排查 根據堆棧信息可見&#xff0c;dubbo使用默認的hession2進行序列化時出現了異常&#xff0c;異常堆棧根原因為&#xff1a;null array 位于java.util.CollSer#readResolve方法中&#xff0c;即在序列化集合時&#xff0c;集合數組為空。 向上追溯jdk.internal.ref…

目標檢測任務,如何區分兩個相近似的目標

首先&#xff0c;要了解清楚檢測的場景下&#xff0c;肉眼能否區分出目標的差異性。 如果可以區分&#xff0c;那觀察數據周圍背景的差異是否較大&#xff0c;可以先通過添加樣本來提升模型的檢測精度。添加樣本時一定要注意&#xff0c;樣本標注的準確性&#xff0c;樣本的豐…

Java面試黃金寶典1

1. 8 種基本數據類型 整數類型 byte&#xff1a; 它是最小的整數類型&#xff0c;占用 1 個字節&#xff08;8 位&#xff09;。在一些對內存使用要求極高的場景&#xff0c;比如嵌入式系統開發、數據傳輸時對數據量有嚴格限制的情況&#xff0c;會使用 byte 類型。例如&#x…

OSGEarth

OSGEarth 基于 OpenSceneGraph 構建的一個擴展庫&#xff0c;專門用于地球科學和地理信息系統&#xff08;GIS&#xff09;數據的可視化。它允許開發者創建逼真的三維地球模型&#xff0c;并在其上展示各種地理空間數據。 高端一點的表述 基于三維引擎osg開發的三維數字地球…

Word 小黑第34套

對應大貓34 設置第二頁水印&#xff0c;取消第一頁的&#xff1a;取消第二頁頁眉鏈接&#xff0c;刪除第一張水印圖片&#xff08;delete&#xff09; 調整水印圖片&#xff1a;點開頁眉頁腳 雙擊圖片 可以調整 郵件合并 -創建標簽 橫標簽數3 豎標簽5 表布局 -查看網格線 插…

2.5.1 io_uring

文章目錄 2.5.1 io_uring1. 對比1. select、poll、epoll 對比表格2. 關鍵特性說明&#xff1a;3. 應用場景 2. 異步io1. 頻繁copy2. 如何做到線程安全 3. io_uring1. 實現2. 關鍵點&#xff1a;3. 問題1. Reactor 與 Proactor 的三點不同2. epoll 與 io_uring 的區別 2.5.1 io_…

K8S學習之基礎三十六:node-exporter部署

Prometheus v2.2.1 ? 編寫yaml文件&#xff0c;包含創建ns、configmap、deployment、service # 創建monitoring空間 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitoring# 創建SA并綁定權限 kubectl create serviceaccount monitor -n monito…