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