Ingress介紹
在前面的學習中已經知道,Service對集群之外暴露服務的主要方式有兩種:NodePort和LoadBalancer,但是這兩種方式,都有一定的缺點:
- NodePort方式的缺點是會占用很多集群機器的端口,那么當集群服務變多的時候,這個缺點就愈發明顯
- LB方式的缺點是每個service需要一個LB,浪費、麻煩,並且需要k8s之外設備的支持
基於這種現狀,k8s提供了Ingress資源對象,Ingress只需要一個NodePort或者一個LB就可以滿足暴露多個Service的需求。工作機制大致如下表所示:
實際上,Ingress相當於一個7層的負載均衡器,是k8s對反向代理的一個抽象,它的工作原理類似於Nginx,可以理解成在Ingress里建立諸多映射規則,Ingress Controller通過監聽這些配置規則並轉化成Nginx的配置,然后對外部提供服務。在這里有兩個核心概念:
- ingress:k8s中的一個對象,作用是定義請求如何轉發到service的規則
- ingress controller:具體實現反向代理及負載均衡的程序,對ingress定義的規則進行解析,根據配置的規則來實現請求轉發,實現方式有很多,比如nginx,contour,haproxy等等。
Ingress(以nginx為例)的工作原理如下:
- 用戶編寫ingress規則,說明哪個域名對應k8s集群中的哪個service
- ingress控制器動態感知ingress服務規則的變化,然后生成一段對應的nginx配置
- ingress控制器會將生成的nginx配置寫入到一個運行着的nginx服務中,並動態更新
- 到此為止,其實真正在工作的就是一個nginx了,內部配置了用戶定義的請求轉發規則