出于增強(qiáng)可移植性的需求,我們應(yīng)該從容器鏡像中解耦的不僅有配置數(shù)據(jù),還有默認(rèn)口令(例如 Redis 或 MySQL 服務(wù)的訪問(wèn)口令)、用于 SSL 通信時(shí)的數(shù)字證書(shū)和私鑰、用于認(rèn)證的令牌和 ssh key 等,但這些敏感數(shù)據(jù)不宜存儲(chǔ)于 ConfigMap 資源中,而是要使用另一種稱為 Secret 的資源類(lèi)型。
Secret 對(duì)象存儲(chǔ)數(shù)據(jù)的機(jī)制及使用方式都類(lèi)似于 ConfigMap 對(duì)象,它們以鍵值方式存儲(chǔ)數(shù)據(jù),在 Pod 資源中通過(guò)環(huán)境變量或存儲(chǔ)卷進(jìn)行數(shù)據(jù)訪問(wèn)。不同的地方在于,Secret 對(duì)象僅會(huì)被分發(fā)至調(diào)用了該對(duì)象的 Pod 資源所在的工作節(jié)點(diǎn),且僅支持由節(jié)點(diǎn)將其臨時(shí)存儲(chǔ)于內(nèi)存中。另外,Secret 對(duì)象的數(shù)據(jù)存儲(chǔ)及打印格式為 Base64 編碼的字符串而非明文字符,用戶在創(chuàng)建 Secret 對(duì)象時(shí)需要事先手動(dòng)完成數(shù)據(jù)的格式轉(zhuǎn)換。但在容器中以環(huán)境變量或存儲(chǔ)卷的方式訪問(wèn)時(shí),它們會(huì)被自動(dòng)解碼為明文數(shù)據(jù)。
Secret 資源主要有兩種用途:一是作為存儲(chǔ)卷注入 Pod 對(duì)象上,供容器應(yīng)用程序使用;二是用于 kubelet 為 Pod 里的容器拉取鏡像時(shí)向私有倉(cāng)庫(kù)提供認(rèn)證信息。不過(guò),后面使用 ServiceAccount 資源自建的 Secret 對(duì)象是一種更安全的方式。
Secret 對(duì)象劃分為如下 3 種類(lèi)別:
generic:基于本地文件、目錄或字面量值創(chuàng)建的 Secret,一般用來(lái)存儲(chǔ)密鑰、信息、證書(shū)等數(shù)據(jù)。docker-registry:用于認(rèn)證到 Docker Registry 的 Secret,以使用私有容器鏡像。
tls:基于指定的公鑰/私鑰對(duì)創(chuàng)建 TLS Secret,專(zhuān)用于 TLS 通信中;指定公鑰和私鑰必須事先存在,公鑰證書(shū)必須采用 PEM 編碼,且應(yīng)該與指定的私鑰相匹配。
通用類(lèi)型的 Secret 資源用于保存除用于 TLS 通信之外的證書(shū)和私鑰,以及專(zhuān)用于認(rèn)證到 Docker 注冊(cè)表服務(wù)之外的敏感信息,包括訪問(wèn)服務(wù)的用戶名和口令、SSH 密鑰、OAuth 令牌、CephX 協(xié)議的認(rèn)證密鑰等。
Kubernetes 系統(tǒng)上還有一種專(zhuān)用于保存 ServiceAccount 認(rèn)證令牌的 Secret 對(duì)象,它存儲(chǔ)有 Kubernetes 集群的私有 CA 的證書(shū)(ca.crt)以及當(dāng)前 Service 賬號(hào)的名稱空間和認(rèn)證令牌。該類(lèi)資源以 kubernetes.io/service-account-token 為類(lèi)型標(biāo)識(shí),并附加專(zhuān)用資源注解 kubernetes.io/service-account.name 和 kubernetes.io/service-account.uid 來(lái)指定所屬的 ServiceAccount 賬號(hào)名稱及 ID 信息。
在 Pod 資源上使用 docker-registry Secret 對(duì)象的方法有兩種。一種方法是使用 spec.imagePullSecrets 字段直接引用;另一種是將 docker-registry Secret 對(duì)象添加到某特定的 ServiceAccount 對(duì)象之上,而后配置 Pod 資源通過(guò) spec.serviceAccountName 來(lái)引用該服務(wù)賬號(hào).
Pod 資源以環(huán)境變量方式消費(fèi) Secret 對(duì)象也存在兩種途徑:① 一對(duì)一地將指定鍵的值傳遞給指定的環(huán)境變量;② 將 Secret 對(duì)象上的全部鍵名和鍵值一次性全部映射為容器的環(huán)境變量。前者在容器上使用 env.valueFrom 字段進(jìn)行定義,而后者則直接使用 envFrom 字段。
Pod 資源上的 Secret 存儲(chǔ)卷插件的使用方式同 ConfigMap 存儲(chǔ)卷插件非常相似,除了其類(lèi)型及引用標(biāo)識(shí)要替換為 secret 及 secretName 之外,幾乎完全類(lèi)似于 ConfigMap 存儲(chǔ)卷,包括支持使用掛載整個(gè)存儲(chǔ)卷、只掛載存儲(chǔ)卷中指定鍵值以及獨(dú)立掛載存儲(chǔ)卷中的鍵等使用方式。
Downward API 并不會(huì)將所有可用的元數(shù)據(jù)統(tǒng)統(tǒng)注入容器中,而是由用戶在配置 Pod 對(duì)象自行選擇需要注入容器中的元數(shù)據(jù)??蛇x擇注入的信息包括 Pod 對(duì)象的 IP、主機(jī)名、標(biāo)簽、注解、UID、請(qǐng)求的 CPU 與內(nèi)存資源量及其限額,甚至是 Pod 所在的節(jié)點(diǎn)名稱和節(jié)點(diǎn) IP 等。