Kubernetes 控制面到節(jié)點通信

2022-04-29 09:58 更新

控制面到節(jié)點通信

本文列舉控制面節(jié)點(確切說是 API 服務(wù)器)和 Kubernetes 集群之間的通信路徑。 目的是為了讓用戶能夠自定義他們的安裝,以實現(xiàn)對網(wǎng)絡(luò)配置的加固,使得集群能夠在不可信的網(wǎng)絡(luò)上 (或者在一個云服務(wù)商完全公開的 IP 上)運行。

節(jié)點到控制面

Kubernetes 采用的是中心輻射型(Hub-and-Spoke)API 模式。 所有從集群(或所運行的 Pods)發(fā)出的 API 調(diào)用都終止于 API 服務(wù)器。 其它控制面組件都沒有被設(shè)計為可暴露遠(yuǎn)程服務(wù)。 API 服務(wù)器被配置為在一個安全的 HTTPS 端口(通常為 443)上監(jiān)聽遠(yuǎn)程連接請求, 并啟用一種或多種形式的客戶端身份認(rèn)證機制。 一種或多種客戶端鑒權(quán)機制應(yīng)該被啟用, 特別是在允許使用匿名請求 或服務(wù)賬號令牌的時候。

應(yīng)該使用集群的公共根證書開通節(jié)點,這樣它們就能夠基于有效的客戶端憑據(jù)安全地連接 API 服務(wù)器。 一種好的方法是以客戶端證書的形式將客戶端憑據(jù)提供給 kubelet。 請查看 kubelet TLS 啟動引導(dǎo) 以了解如何自動提供 kubelet 客戶端證書。

想要連接到 API 服務(wù)器的 Pod 可以使用服務(wù)賬號安全地進行連接。 當(dāng) Pod 被實例化時,Kubernetes 自動把公共根證書和一個有效的持有者令牌注入到 Pod 里。 ?kubernetes ?服務(wù)(位于 ?default ?名字空間中)配置了一個虛擬 IP 地址,用于(通過 kube-proxy)轉(zhuǎn)發(fā) 請求到 API 服務(wù)器的 HTTPS 末端。

控制面組件也通過安全端口與集群的 API 服務(wù)器通信。

這樣,從集群節(jié)點和節(jié)點上運行的 Pod 到控制面的連接的缺省操作模式即是安全的, 能夠在不可信的網(wǎng)絡(luò)或公網(wǎng)上運行。

控制面到節(jié)點

從控制面(API 服務(wù)器)到節(jié)點有兩種主要的通信路徑。 第一種是從 API 服務(wù)器到集群中每個節(jié)點上運行的 kubelet 進程。 第二種是從 API 服務(wù)器通過它的代理功能連接到任何節(jié)點、Pod 或者服務(wù)。

API 服務(wù)器到 kubelet

從 API 服務(wù)器到 kubelet 的連接用于:

  • 獲取 Pod 日志
  • 掛接(通過 kubectl)到運行中的 Pod
  • 提供 kubelet 的端口轉(zhuǎn)發(fā)功能。

這些連接終止于 kubelet 的 HTTPS 末端。 默認(rèn)情況下,API 服務(wù)器不檢查 kubelet 的服務(wù)證書。這使得此類連接容易受到中間人攻擊, 在非受信網(wǎng)絡(luò)或公開網(wǎng)絡(luò)上運行也是 不安全的。

為了對這個連接進行認(rèn)證,使用 ?--kubelet-certificate-authority? 標(biāo)志給 API 服務(wù)器提供一個根證書包,用于 kubelet 的服務(wù)證書。

如果無法實現(xiàn)這點,又要求避免在非受信網(wǎng)絡(luò)或公共網(wǎng)絡(luò)上進行連接,可在 API 服務(wù)器和 kubelet 之間使用 SSH 隧道。

最后,應(yīng)該啟用 kubelet 用戶認(rèn)證和/或鑒權(quán) 來保護 kubelet API。

API 服務(wù)器到節(jié)點、Pod 和服務(wù)

從 API 服務(wù)器到節(jié)點、Pod 或服務(wù)的連接默認(rèn)為純 HTTP 方式,因此既沒有認(rèn)證,也沒有加密。 這些連接可通過給 API URL 中的節(jié)點、Pod 或服務(wù)名稱添加前綴 ?https:? 來運行在安全的 HTTPS 連接上。 不過這些連接既不會驗證 HTTPS 末端提供的證書,也不會提供客戶端證書。 因此,雖然連接是加密的,仍無法提供任何完整性保證。 這些連接 目前還不能安全地 在非受信網(wǎng)絡(luò)或公共網(wǎng)絡(luò)上運行。

SSH 隧道 

Kubernetes 支持使用 SSH 隧道來保護從控制面到節(jié)點的通信路徑。在這種配置下,API 服務(wù)器建立一個到集群中各節(jié)點的 SSH 隧道(連接到在 22 端口監(jiān)聽的 SSH 服務(wù)) 并通過這個隧道傳輸所有到 kubelet、節(jié)點、Pod 或服務(wù)的請求。 這一隧道保證通信不會被暴露到集群節(jié)點所運行的網(wǎng)絡(luò)之外。

SSH 隧道目前已被廢棄。除非你了解個中細(xì)節(jié),否則不應(yīng)使用。 Konnectivity 服務(wù)是對此通信通道的替代品。

Konnectivity 服務(wù) 

FEATURE STATE: Kubernetes v1.18 [beta]

作為 SSH 隧道的替代方案,Konnectivity 服務(wù)提供 TCP 層的代理,以便支持從控制面到集群的通信。 Konnectivity 服務(wù)包含兩個部分:Konnectivity 服務(wù)器和 Konnectivity 代理,分別運行在 控制面網(wǎng)絡(luò)和節(jié)點網(wǎng)絡(luò)中。Konnectivity 代理建立并維持到 Konnectivity 服務(wù)器的網(wǎng)絡(luò)連接。 啟用 Konnectivity 服務(wù)之后,所有控制面到節(jié)點的通信都通過這些連接傳輸。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號