ConfigMap 和 Secret 是 Kubernetes 系統(tǒng)上兩種特殊類型的存儲卷,前者用于為容器中的應(yīng)用提供配置數(shù)據(jù)以定制程序的行為,而敏感的配置信息,例如密鑰、證書等則通常由后者來配置。ConfigMap 和 Secret 將相應(yīng)的配置信息保存于資源對象中,而后在 Pod 對象上以存儲卷的形式將其掛載并加載相關(guān)的配置,降低了配置與鏡像文件的耦合關(guān)系。
Dockerfile 中的 ENTRYPOINT 和 CMD 指令用于指定容器啟動時(shí)要運(yùn)行的程序及其相關(guān)的參數(shù)。其中,CMD 指令以列表形式指定要運(yùn)行的程序及其相關(guān)的參數(shù),若同時(shí)存在 ENTRYPOINT 指令,則 CMD 指令中的列表所有元素均被視作由 ENTRYPOINT 指定程序的命令行參數(shù)。另外,在基于某鏡像創(chuàng)建容器時(shí),可以通過向 ENTRYPOINT 中的程序傳遞額外的自定義參數(shù),甚至還可以修改要運(yùn)行的應(yīng)用程序本向。
配置文件嵌入鏡像文件,是指用戶在 Dockerfile 中使用 COPY 指令把定義好的配置文件復(fù)制到鏡像文件系統(tǒng)上的目標(biāo)位置,或者使用 RUN 指令調(diào)用 sed 或 echo 一類的命令修改配置文件,從而達(dá)到為容器化應(yīng)用提供自定義配置文件之目的。
Docker 存儲卷能夠?qū)⑺拗鳈C(jī)之上的任何文件或目錄映射進(jìn)容器文件系統(tǒng)上,因此,可以事先將配置文件放置于宿主機(jī)之上的某特定路徑中,而后在啟動容器時(shí)進(jìn)行加載。這種方式靈活易用,但也依賴于用戶事先將配置數(shù)據(jù)提供在宿主機(jī)上的特定路徑。
通過環(huán)境變量配置容器化應(yīng)用時(shí),需要在容器配置段中嵌套使用 env 字段,它的值是一個(gè)由環(huán)境變量構(gòu)建的列表。每個(gè)環(huán)境變量通常由 name 和 value(或 valueFrom)字段構(gòu)成。
name
value
ConfigMap 資源用于在運(yùn)行時(shí)將配置文件、命令行參數(shù)、環(huán)境變量、端口號以及其他配置工件綁定至 Pod 的容器和系統(tǒng)組件。Kubernetes 借助于 ConfigMap 對象實(shí)現(xiàn)了將配置文件從容器鏡像中解耦,從而增強(qiáng)了工作負(fù)載的可移植性,使配置更易于更改和管理,并防止將配置數(shù)據(jù)硬編碼到 Pod 配置清單中。但 ConfigMap 資源用于存儲和共享非敏感、未加密的配置信息,若要在集群中使用敏感信息,則必須使用 Secret 資源。
一個(gè) ConfigMap 對象就是一系列配置數(shù)據(jù)的集合,這些數(shù)據(jù)可注入到 Pod 的容器當(dāng)中為容器應(yīng)用所使用,注入的途徑有直接掛載存儲卷和傳遞為環(huán)境變量兩種。ConfigMap 支持存儲諸如單個(gè)屬性一類的細(xì)粒度的信息,也可用于存儲粗粒度的信息,例如將整個(gè)配置文件保存在 ConfigMap 對象之中。
ConfigMap 是 Kubernetes 標(biāo)準(zhǔn)的 API 資源類型,它隸屬名稱空間級別,支持命令式命令、命令式對象配置及聲明式對象配置 3 種管理接口。命令式命令的創(chuàng)建操作可通過 kubectl create configmap 進(jìn)行,它支持基于目錄、文件或字面量(literal)值獲取配置數(shù)據(jù)完成 ConfigMap 對象的創(chuàng)建。
Pod 資源配置清單中,除了使用 value 字段直接給定變量值之外,容器環(huán)境變量的賦值還支持通過在 valueFrom 字段中嵌套 configMapKeyRef 來引用 ConfigMap 對象的鍵值。
以存儲卷方式引用的 ConfigMap 對象必須先于 Pod 對象存在,除非在 Pod 對象中把它們統(tǒng)統(tǒng)標(biāo)記為 optional,否則將會導(dǎo)致 Pod 無法正常啟動;同樣,即使 ConfigMap 對象存在,但引用的鍵名不存在時(shí),也會導(dǎo)致同樣的錯(cuò)誤。
以環(huán)境變量方式引用的 ConfigMap 對象的鍵不存在時(shí)會被忽略,Pod 對象可以正常啟動,但錯(cuò)誤引用的信息會以 InvalidVariableNames 事件記錄于日志中。
ConfigMap 對象是名稱空間級的資源,能夠引用它的 Pod 對象必須位于同一名稱空間。
Kubelet 僅支持那些由 API Server 管理的 Pod 資源來引用 ConfigMap 對象,因而那些由 kubelet 在節(jié)點(diǎn)上通過--manifest-url 或--config 選項(xiàng)加載配置清單創(chuàng)建的靜態(tài) Pod,以及由用戶直接通過 kubelet 的 RESTful API 創(chuàng)建的 Pod 對象。
ConfigMap 無法替代配置文件,它僅在 Kubernetes 系統(tǒng)上代表對應(yīng)用程序配置文件的引用,我們可以將它類比為在 Linux 主機(jī)上表示/etc 目錄及內(nèi)部文件的一種方法。