[英]Routing traffic to kubernetes cluster
我有一個與Kubernetes網絡相關的問題。
我有一個運行在Pod中的微服務(例如numcruncherpod ),該Pod通過端口9000
為請求提供服務,並且我創建了一個相應的類型為NodePort
( numcrunchersvc )的服務,該服務公開的節點端口為30900
。
我的集群有3個具有以下IP的節點:
我將通過反向代理(nginx)將流量路由到我的集群。 據我在nginx中了解,我需要指定所有這些集群節點的IP才能將流量路由到集群,我的理解正確嗎?
我擔心的是,由於nginx不會了解群集,因此決定將流量發送到的群集節點可能不是一個很好的判斷。 那么是否有更好的方法將流量路由到我的kubernetes集群?
PS:我沒有在任何雲平台上運行群集。
這個答案有點晚,而且有點長,所以我在開始之前要求原諒。 :)
對於不在Cloud Providers上運行kubernetes集群的人們,有4種不同的選項可以將集群內部運行的服務暴露給外部環境。
服務type: NodePort
。 這是最簡單和默認的。 Kubernetes為您的服務分配一個隨機端口。 群集中的每個節點都偵聽到此特定端口的流量,然后將該流量轉發到支持該服務的任何一個Pod。 這通常由kube-proxy處理,它使用循環策略利用iptables和負載平衡。 通常,由於此設置的UX不太美觀,因此人們經常添加外部“代理”服務器,例如HAProxy,Nginx或httpd,以偵聽單個IP上的流量並將其轉發到這些后端之一。 這是您OP描述的設置。
要做到這一點,可以使用type: ExternalIP
的服務。 這與NodePort
服務相同,不同之處在於它還使kubernetes在所有kubernetes節點上添加一條附加規則,該規則說“到達目標IP ==的所有流量也必須轉發到Pod”。 基本上,您可以將任何任意IP指定為服務的“外部IP”。 只要發往該IP的流量到達群集中的節點之一,它將被路由到正確的Pod。 但是,作為群集管理員,您必須負責將流量發送到任何節點。 這樣做的好處是,如果您指定一個節點(例如,一個主節點)的物理接口之一的IP,則不再需要運行haproxy / nginx安裝程序。 此外,您將跳數減少了一個。
服務type: LoadBalancer
。 這種服務類型使裸機集群與雲提供商處於同等地位。 一個功能齊全的負載平衡器提供程序可以從預定義的池中選擇IP,自動將其分配給您的服務,並在正確配置的情況下將其發布到網絡。 對於裸機上的kubernetes網絡,這是您將獲得的最“無縫”的體驗。 大多數LoadBalancer提供程序實現都使用BGP與上游L3路由器進行通話和通告。 Metallb和kube-router是適合此領域的兩個FOSS項目。
Kubernetes入口。 如果您的需求僅限於REST API,HTTP微服務等L7應用程序,則可以設置單個Ingress提供程序(nginx是這樣的提供程序之一),然后為所有微服務配置Ingress資源,而不是服務資源。 部署入口提供程序,並確保它具有外部可用的可路由IP(您可以將其固定到主節點,並為該節點使用物理接口IP)。 與服務相比,使用Ingress的優勢在於Ingress對象可以原生理解HTTP mircoservices,並且可以執行更智能的運行狀況檢查,路由和管理。
人們通常將(1),(2),(3)中的一個與(4)組合在一起,因為前三個是L4(TCP / UDP),而(4)是L7。 因此,諸如URL路徑/域路由,SSL終止等之類的事情都由入口提供商處理,而IP生命周期管理和路由則由服務層負責。
對於您的用例,理想的設置將涉及:
LoadBalancer
提供程序在Ingress提供程序的前面,這樣您就不必手動配置Ingress的網絡。 正確。 您可以將流量路由到任何或所有K8奴才。 必要時,K8網絡層將轉發到適當的仆從。
例如,如果僅運行一個Pod,nginx將很可能循環請求。 當請求到達未運行Pod的小仆時,請求將被轉發到未運行Pod的小仆。
如果您運行3個Pod,每個爪牙一個,那么無論是爪牙還是從Nginx獲取請求,該請求都會被處理。
如果您在每個仆從上運行多個Pod,則請求將輪循到每個仆從,然后輪循到該仆從上的每個Pod。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.