出于增強可移植性的需求,我們應該從容器鏡像中解耦的不僅有配置數據,還有默認口令(例如 Redis 或 MySQL 服務的訪問口令)、用于 SSL 通信時的數字證書和私鑰、用于認證的令牌和 ssh key 等,但這些敏感數據不宜存儲于 ConfigMap 資源中,而是要使用另一種稱為 Secret 的資源類型。


Secret 對象存儲數據的機制及使用方式都類似于 ConfigMap 對象,它們以鍵值方式存儲數據,在 Pod 資源中通過環境變量或存儲卷進行數據訪問。不同的地方在于,Secret 對象僅會被分發至調用了該對象的 Pod 資源所在的工作節點,且僅支持由節點將其臨時存儲于內存中。另外,Secret 對象的數據存儲及打印格式為 Base64 編碼的字符串而非明文字符,用戶在創建 Secret 對象時需要事先手動完成數據的格式轉換。但在容器中以環境變量或存儲卷的方式訪問時,它們會被自動解碼為明文數據。


Secret 資源主要有兩種用途:一是作為存儲卷注入 Pod 對象上,供容器應用程序使用;二是用于 kubelet 為 Pod 里的容器拉取鏡像時向私有倉庫提供認證信息。不過,后面使用 ServiceAccount 資源自建的 Secret 對象是一種更安全的方式。


Secret 對象劃分為如下 3 種類別:

generic:基于本地文件、目錄或字面量值創建的 Secret,一般用來存儲密鑰、信息、證書等數據。docker-registry:用于認證到 Docker Registry 的 Secret,以使用私有容器鏡像。

tls:基于指定的公鑰/私鑰對創建 TLS Secret,專用于 TLS 通信中;指定公鑰和私鑰必須事先存在,公鑰證書必須采用 PEM 編碼,且應該與指定的私鑰相匹配。


通用類型的 Secret 資源用于保存除用于 TLS 通信之外的證書和私鑰,以及專用于認證到 Docker 注冊表服務之外的敏感信息,包括訪問服務的用戶名和口令、SSH 密鑰、OAuth 令牌、CephX 協議的認證密鑰等。


Kubernetes 系統上還有一種專用于保存 ServiceAccount 認證令牌的 Secret 對象,它存儲有 Kubernetes 集群的私有 CA 的證書(ca.crt)以及當前 Service 賬號的名稱空間和認證令牌。該類資源以 kubernetes.io/service-account-token 為類型標識,并附加專用資源注解 kubernetes.io/service-account.name 和 kubernetes.io/service-account.uid 來指定所屬的 ServiceAccount 賬號名稱及 ID 信息。


在 Pod 資源上使用 docker-registry Secret 對象的方法有兩種。一種方法是使用 spec.imagePullSecrets 字段直接引用;另一種是將 docker-registry Secret 對象添加到某特定的 ServiceAccount 對象之上,而后配置 Pod 資源通過 spec.serviceAccountName 來引用該服務賬號.


Pod 資源以環境變量方式消費 Secret 對象也存在兩種途徑:① 一對一地將指定鍵的值傳遞給指定的環境變量;② 將 Secret 對象上的全部鍵名和鍵值一次性全部映射為容器的環境變量。前者在容器上使用 env.valueFrom 字段進行定義,而后者則直接使用 envFrom 字段。


Pod 資源上的 Secret 存儲卷插件的使用方式同 ConfigMap 存儲卷插件非常相似,除了其類型及引用標識要替換為 secret 及 secretName 之外,幾乎完全類似于 ConfigMap 存儲卷,包括支持使用掛載整個存儲卷、只掛載存儲卷中指定鍵值以及獨立掛載存儲卷中的鍵等使用方式。


Downward API 并不會將所有可用的元數據統統注入容器中,而是由用戶在配置 Pod 對象自行選擇需要注入容器中的元數據??蛇x擇注入的信息包括 Pod 對象的 IP、主機名、標簽、注解、UID、請求的 CPU 與內存資源量及其限額,甚至是 Pod 所在的節點名稱和節點 IP 等。