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