目錄
- 什么是ConfigMap
- 創建ConfigMap
- 1:基于目錄創建ConfigMap
- 1.創建conf目錄,放置文件
- 2.基于目錄下的所有文件創建ConfigMap
- 3.查看當前創建的ConfigMap
- 2:基于文件創建ConfigMap
- 1.單個文件創建ConfigMap
- 2.使用帶有key的命令創建ConfigMap
- 3.多個文件創建ConfigMap
- 3:基于ENV文件創建ConfigMap
- 1.創建測試用的key-value文件
- 2.創建ConfigMap
- 4:基于字符值創建ConfigMap
- 5:刪除創建的ConfigMap
- ConfigMap實踐
- 1:使用valueFrom定義容器的環境變量
- 1.先以字符集的形式創建ConfigMap
- 2.使用valueFrom從ConfigMap中定義變量
- 3.創建此pod
- 2:使用envFrom定義容器的環境變量
- 1.使用envFrom從ConfigMap中定義變量
- 2.創建此pod
- 3:以文件形式掛載ConfigMap
- 1.使用帶有key的命令創建ConfigMap
- 2.編寫文件,將名為spec-config的ConfigMap掛載到容器的/etc/conf目錄下
- 3.登錄容器
- 4:自定義文件名掛載ConfigMap
- 1.編寫pod文件
- 2.創建此pod
- 3.登錄容器
- 5:指定掛載文件權限
- 1.編寫pod文件
- 2.創建此pod
- 3.登錄容器
- 6:利用SubPath解決掛載覆蓋的問題
- 1.創建配置文件
- 2.使用帶有key的命令創建ConfigMap
- 3.創建pod文件,掛載文件
- 4.登錄容器
- 加密數據管理
- 1:創建secret
- 1.使用kubectl命令創建secret
- 2.通過yaml文件創建secret
- 2:解碼secret
- 3:在pod中應用secret
什么是ConfigMap
在傳統架構中,配置文件往往被保存在宿主機上,程序啟動是可以指定某個配置文件,但是使用容器部署時,容器所在的節點并不固定,所以不能使用這種方式,此處在構建鏡像時,如果把配置文件也放在容器里面,那么配置文件一旦有更改的話,也是一件非常麻煩的事情。所以k8s 抽象了一個configMap的概念,將配置與 pod 和組件分開,這有助于保持工作負載的可移植性,使配置更易于更改和管理。比如在生產環境中,可以將 Nginx、Redis 等應用的配置文件存儲在 configMap 上,然后將其掛載即可使用。
相對于 secret,ConfigMap 更傾向于存儲和共享非敏感、未加密的配置信息,假如是集群中使用敏感信息,最好使用 secret。
ConfigMap 用來在鍵值對數據庫(etcd)中保存非加密數據。一般用來保存配置文件。
ConfigMap 可以用作環境變量、命令行參數或者存儲卷。
ConfigMap 將環境配置信息與 容器鏡像 解耦,便于配置的修改。
ConfigMap 在設計上不是用來保存大量數據的。
ConfigMap中保存的數據不可超過1mb。
創建ConfigMap
ConfigMap 可以用目錄(目錄下有多個文件)、單個文件或字符值的方式創建,使用 kubect1 創建一個 ConfigMap 的命令格式如下:
kubectl create configmap <map-name><data-source>
map-name:ConfigMap 的名稱
data-source:數據源,可以使數據的目錄、文件或字符值
ConfigMap 中的數據是以鍵值對(key-value pair)的形式保存的,其中🔑文件名或秘鑰
value:文件內容或字符值
1:基于目錄創建ConfigMap
假如一次性需要多個文件來創建 ConfigMap,可以使用 kubectl create configmap 命令從同一個
目錄中的多個文件創建 configMap。
1.創建conf目錄,放置文件
2.基于目錄下的所有文件創建ConfigMap
注意:
ConfigMap 是按namespace 隔離的,不同的namespace 之間的configMap 的名稱可以相同,但是不能跨namespace 進行訪問,創建ConfigMap 時,可以使用-n選項指定資源所在的namespace。
3.查看當前創建的ConfigMap
注意:
由于該 ConfigMap 是直接基于目錄創建的,沒有指定 ConfigMap 中的 key 名,因此默認是按照目錄下的文件名作為 ConfigMap 數據中的 key 名。
2:基于文件創建ConfigMap
1.單個文件創建ConfigMap
注意:
由于沒有指定 ConfigMap 的 key,因此使用文件名作為 key。
2.使用帶有key的命令創建ConfigMap
3.多個文件創建ConfigMap
3:基于ENV文件創建ConfigMap
假如有一個文件 game-env-file.cfg,里面存儲的 key=value 形式的數據,此類文件可以當做某個應用的環境變量配置,此時可以使用–from-env-file 從 ENV 文件創建 configMap。
1.創建測試用的key-value文件
2.創建ConfigMap
4:基于字符值創建ConfigMap
利用字符值創建ConfigMap
5:刪除創建的ConfigMap
ConfigMap實踐
本實踐案例將 CM 創建的變量引入到 pod 內。
在 kubernetes 中,用戶可以使用環境變量引用 ConfigMap 中的數據,當容器啟動時,kubernetes會將 configMap 數據作為環境變量注入到容器的進程中。為了使用 configMap 中的數據,用戶需要在 pod的規范(spec)中定義一個 env 字段,并指定 configMap 中的“鍵值對”
1:使用valueFrom定義容器的環境變量
1.先以字符集的形式創建ConfigMap
2.使用valueFrom從ConfigMap中定義變量
在此案例中,env 用于定義環境變量,valueFrom 指定了環境變量的值來源于ConfigMap。“name:my-name01”用于定義容器中用的變量名,其值來自于 CM 中的 name1 的值。“name1”是在 CM 中定義的 key。
用 valueFrom 的方式引入 pod 中的變量名,可以在定義 pod 的之后指定成另一個名稱。相當于在 pod中起了一個新的名字,但是值還是原來 ConfigMap 中給定的值。
3.創建此pod
2:使用envFrom定義容器的環境變量
k8s 從 1.6的版本開始,引入了一個新的字段 envFrom,實現了在 Pod 中將 configMap 中所有定義的key=value 自動生成為環境變量。
使用 envFrom 時,環境變量的名字是 configMap 中數據的 key 名。
備注:valueFrom 和envfrom的區別
通過 valueFrom 來配置環境變量,Pod 的環境變量名與 configMap 中定義的變量名不必相同valueFrom 是指定變量進行映射。
通過 envFrom 會把 configMap 的所有鍵值對都映射到 Pod 的環境變量中去envFrom 配置的環境變量和 Pod 的環境變量名是相同的
1.使用envFrom從ConfigMap中定義變量
2.創建此pod
3:以文件形式掛載ConfigMap
大部分情況下,ConfigMap 定義的都是配置文件,而不是環境變量,因此需要將 ConfigMap 的文件掛載到 Pod 中,然后 Pod 中的容器就可以引用,此時可以通過 Pod 的 volume 字段進行掛載。
1.使用帶有key的命令創建ConfigMap
2.編寫文件,將名為spec-config的ConfigMap掛載到容器的/etc/conf目錄下
注意:
容器的/etc/config 目錄會被覆蓋掉
3.登錄容器
4:自定義文件名掛載ConfigMap
很多情況下,需要更改掛載的文件名,可以使用 path 字段指定 ConfigMap 掛載的文件名,比如將文件 app2.conf 掛載到/etc/conf 下,并重命名為 app2.cfg。
1.編寫pod文件
2.創建此pod
3.登錄容器
5:指定掛載文件權限
1.編寫pod文件
備注:
defaultMode:0666
沒有設置權限的其他文件默認的權限
2.創建此pod
3.登錄容器
6:利用SubPath解決掛載覆蓋的問題
當掛載 ConfigMap 或 Secret 到容器內部時,會覆蓋容器中的目錄,也就是是說,在容器中的對應的目錄中,就只剩下我們掛載進去的文件,此目錄中其他的文件都會丟失。從而導致容器無法正常運行。為了解決掛載覆蓋的問題,需要使用 subPath 的方式進行掛載。
1.創建配置文件
2.使用帶有key的命令創建ConfigMap
3.創建pod文件,掛載文件
備注:
mountPath 表示容器中目錄
subPath 表示configMap 中文件的key 名
items::這部分定義了如何將 configMap 中的鍵值對映射到文件系統中。
key: nginx.conf:這個鍵(key)是指 ConfigMap 中的一個鍵值對的鍵名,這里的鍵名是nginx.conf.
path:nginx.conf:這指定了當這個鍵被注入到容器的文件系統時,它將被寫入的具體路徑和文件名
4.登錄容器
加密數據管理
上一節講解的 ConfigMap 主要用于非安全的數據,與其對應的是 Secret 對象類型,用來保存敏感信息,例如密碼、令牌或 SSH Key,將這些信息放在 Serret 中比較安全和靈活。用戶可以創建 Secret 并且引用到 Pod 中,比如使用 Secre 初始化 Redres、MySQL 密碼等。
1:創建secret
1.使用kubectl命令創建secret
創建賬戶信息
備注:
generic:通用類型
user-pass:創建的secret 的名字
查看Secret:
備注:
Opaque:不透明的,表示 secret是加密的形式保存數據的
默認情況下,get 和 describe 命令都不會顯示文件的內容,這是為了防止 Secret 中的內容被意外暴露。所以,顯示出來的信息中 Data字段沒有對應的值,只顯示了文件的名字。
2.通過yaml文件創建secret
手動創建 Secret 時,每一項內容必須是 base64 編碼的,所以要先對明文進行編碼:
創建一個secret
2:解碼secret
3:在pod中應用secret
secret 和 ConfigMap 的用法類似,也可以作為數據卷掛載,或作為環境變量以供 Pod 的容器使用。
和 configMap 一樣,可以在 Pod 的 volume 中使用 Secret: