場景:我通過deployment更新pod,ingress是怎么把新的請求流量發送到我新的pod的?是怎么監控到我更新的pod的?
在 Kubernetes 中,Ingress 是一種 API 對象,用于管理外部訪問到集群內服務的 HTTP 和 HTTPS 路由。當你通過 Deployment 更新一個 Pod 時,Ingress 并不會直接監控 Pod 的更新,而是通過一系列的機制來感知服務的變化并更新路由規則。以下是整個過程的詳細解釋:
1.Deployment 更新 Pod 的過程
當你更新 Deployment 的配置(例如修改鏡像版本)時,Kubernetes 的控制器會根據新的配置逐步替換舊的 Pod,創建新的 Pod 并刪除舊的 Pod。這個過程稱為滾動更新(Rolling Update)。
2.Service 的作用
在 Kubernetes 中,Pod 是動態的,可能會因為更新、故障等原因被銷毀和重建。為了確保外部流量能夠穩定地訪問到服務,通常會使用 Service 來抽象 Pod 的訪問方式。Service 通過一個穩定的虛擬 IP(ClusterIP)和端口,將流量轉發到后端的 Pod。
當 Deployment 更新 Pod 時,Service 會自動感知后端 Pod 的變化。這是因為 Kubernetes 的 Endpoint Controller 會監控 Pod 的狀態變化,并更新 Service 的 Endpoint 列表。Endpoint 列表記錄了所有健康且可用的 Pod 的 IP 地址和端口。
3.Ingress 的工作原理
Ingress 本身并不直接管理 Pod,而是通過 Ingress Controller 來實現 HTTP/HTTPS 流量的路由。Ingress Controller 是一個獨立的組件,它會監控 Kubernetes 集群中的 Ingress 資源,并根據 Ingress 的配置動態生成和更新路由規則。
4.Ingress 如何感知 Pod 的更新
當 Deployment 更新 Pod 時,Ingress 通過以下機制感知并更新路由規則:
4.1 監控 Service 的 Endpoint
Ingress Controller 會監控 Service 的 Endpoint 列表。當 Deployment 更新 Pod 時,Endpoint Controller 會更新 Service 的 Endpoint 列表,移除舊 Pod 的 IP 地址并添加新 Pod 的 IP 地址。
Ingress Controller 會定期輪詢或通過 Kubernetes 的事件機制(Watch API)感知 Endpoint 列表的變化。
4.2 更新路由規則
當 Ingress Controller 檢測到 Endpoint 列表的變化時,它會重新生成路由規則。這些路由規則通常會根據 Ingress 資源的配置和 Service 的 Endpoint 列表動態生成。
例如,如果 Ingress 配置了一個 HTTP 路由規則,將流量轉發到某個 Service,Ingress Controller 會根據 Service 的 Endpoint 列表更新負載均衡器的后端目標。如果 Endpoint 列表中有新的 Pod IP 地址,Ingress Controller 會將流量轉發到新的 Pod。
4.3 負載均衡
Ingress Controller 通常會使用負載均衡算法(如輪詢、最少連接等)將流量分配到后端的 Pod。當 Pod 更新后,Ingress Controller 會根據新的 Endpoint 列表重新分配流量,確保流量能夠到達新的 Pod。
示例:
假設你有一個 Deployment 和一個 Service,以及一個 Ingress 資源,以下是整個流程的簡化示例:
1.更新 Deployment
你更新了 Deployment 的鏡像版本。
Kubernetes 控制器開始滾動更新 Pod,創建新的 Pod 并刪除舊的 Pod。
2.Endpoint 更新
Endpoint Controller 檢測到 Pod 的變化,更新 Service 的 Endpoint 列表。
Endpoint 列表中移除了舊 Pod 的 IP 地址,添加了新 Pod 的 IP 地址。
3.Ingress Controller 感知變化
Ingress Controller 通過 Watch API 檢測到 Endpoint 列表的變化。
Ingress Controller 重新生成路由規則,更新負載均衡器的后端目標。
4.流量轉發
Ingress Controller 根據新的路由規則將流量轉發到新的 Pod。
用戶訪問 Ingress 的域名時,流量會通過 Ingress Controller 轉發到新的 Pod。