Kubernetes向集群外部暴露服務的方式,你知道嗎?
Kubernetes向進群外暴露服務的方式有三種:Ingress、LoadBlancer類型的Service、NodePort類型的Service。
Ingress
Ingress相當于service的service,可以將外部請求通過按照不同規則轉發到對應的service。實際上,ingress相當于一個7層的負載均衡器,是k8s對反向代理的一個抽象,大概的工作原理類似于Nginx。
Ingress工作原理(以Nginx Ingress為例):
Ingress-controller通過和Kubernetes APIServer交互,動態感知集群中Ingress規則的變化,感知到規則的變化后生成對應的Nginx配置,將配置寫到nginx-ingress-controller的pod里(ingress-controller的pod里運行著一個Nginx服務,ingress-controller會把生成的 nginx配置寫入/etc/nginx.conf文件中),然后執行reload使配置生效。
LoadBlancer類型的Service
創建service時,指定type類型為LoadBalancer,需要有外部負載均衡器的支持,絕大部分云廠商都支持創建外部負載均衡。
NodePort類型的Service
創建service時,指定type類型為NodePort,這樣,服務就會暴露在集群節點ip的指定端口上。
幾種方式的優缺點
NodePort方式有如下缺點:
- 當服務比較多的時候,會占用集群節點的大量端口,難以維護;
- 多了一層NAT,請求量比較大的時候會對性能產生影響。
LoadBlancer方式有如下缺點:
- 每個service一個外部負載均衡器,麻煩又浪費;
- 需要有外部負載均衡器支持,有局限性。
Ingress相比上面兩種方式,只需要一個NodePort或者一個LoadBlancer就可以滿足所有service對集群外暴露服務的需求,簡單靈活。