Kubernetes NodePort vs Loadbalancer vs Ingress 在生成中如何选择?
最近,有人問我NodePort,LoadBalancers和Ingress之間有什么區(qū)別。它們都是將外部流量帶入群集的不同方法,并且它們都以不同的方式進行。簡單的說,生產(chǎn)環(huán)境建議使用Loadbalancer和Ingress,四層(TCP/UDP)代理使用Loadbalancer,七層(HTTP/HTTPS)代理使用Ingress。
?
讓我們看一下它們各自的工作方式以及何時使用它們。
?
ClusterIP
ClusterIP是默認(rèn)的Kubernetes服務(wù)類型。它為你提供了群集內(nèi)部的服務(wù)訪問方式,集群內(nèi)的應(yīng)用程序可以訪問該服務(wù)。外部應(yīng)用不能訪問。
ClusterIP服務(wù)的YAML如下所示:
apiVersion: v1 kind: Service metadata:name: my-internal-service spec:selector:app:my-apptype: ClusterIPports:- name: httpport: 80targetPort: 80 protocol: TCP如果您無法從Internet訪問ClusterIP服務(wù),為什么要談?wù)撍?原來您可以使用Kubernetes代理訪問它!
啟動Kubernetes代理:
$ kubectl proxy --port=8080
現(xiàn)在,您可以使用以下方案瀏覽Kubernetes API以訪問該服務(wù):
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
因此,要訪問我們上面定義的服務(wù),您可以使用以下地址:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
什么時候用代理?
在某些情況下,您將使用Kubernetes代理訪問服務(wù)。
調(diào)試服務(wù),或出于某些原因直接從筆記本電腦連接到服務(wù)
允許內(nèi)部流量,顯示內(nèi)部儀表板等
?
因為此方法要求您以經(jīng)過身份驗證的用戶身份運行kubectl,所以不應(yīng)使用此方法將服務(wù)公開到Internet或?qū)⑵溆糜谏a(chǎn)服務(wù)。
NodePort
NodePorrt服務(wù)是將外部流量直接轉(zhuǎn)到服務(wù)的最原始的方法。顧名思義,NodePort會在所有節(jié)點(VM)上打開一個特定的端口,并且發(fā)送到該端口的所有流量都將轉(zhuǎn)發(fā)到該服務(wù)。
NodePort服務(wù)的YAML如下所示:
apiVersion: v1 kind: Service metadata:name: my-nodeport-service sepc:selector:app:my-apptype: NodePortports:- name: httpport: 80targetPort: 80nodePort: 30036 protocol: TCP基本上,NodePort服務(wù)于普通的"ClusterIP"服務(wù)有兩個區(qū)別。首先,類型為"NodePort"。還有一個名為nodePort的附加端口,用于指定要在節(jié)點上打開的端口。如果您未指定此端口,它將選擇一個隨機端口。大多數(shù)時候,您應(yīng)該讓Kubernetes選擇端口。如thockin所說,有許多可使用的端口的警告。
什么時候用NodePort?
此方法有很多缺點:
- 每個端口只能提供一次服務(wù)
- 您只能使用端口30000-32767
- 如果您的節(jié)點/VM IP地址更改,則需要處理
由于這些原因,不建議在生產(chǎn)中使用此方法直接公開您的服務(wù)。如果您運行的服務(wù)不一定總是可用,或者您對成本非常敏感,則此方法將對您有用。NodePort服務(wù)一個很好的例子是演示應(yīng)用程序或臨時應(yīng)用程序。
?
LoadBalancer
LoadBalancer服務(wù)是將服務(wù)公開到Internet的標(biāo)準(zhǔn)方法。在華為云CCE上,這將啟動網(wǎng)絡(luò)負(fù)載均衡器,該網(wǎng)絡(luò)負(fù)載均衡器姜維您提供一個IP地址,該地址會將所有流量轉(zhuǎn)到您的服務(wù)。
什么時候用Loadbalancer?
如果要直接公開服務(wù),這是默認(rèn)方法。您指定的端口上的所有流量都將轉(zhuǎn)發(fā)到服務(wù)。沒有過濾,沒有路由等。這意味著您可以向它發(fā)送幾乎任何類型的流量,例如HTTP,TCP,UDP,Websockets,gRPC或其他任何內(nèi)容。
最大的缺點是,使用LoadBalancer公開的每個服務(wù)都將獲得其自己的IP地址,并且您必須為每個公開的服務(wù)支付LoadBalancer的費用,這可能會變得昂貴!
Ingress
與上述所有示例不同,Ingress實際上不是一種服務(wù)。相反,它位于多種服務(wù)的前面,并充當(dāng)“智能路由器”或集群的入口點。
您可以使用Ingress進行許多不同的操作,并且有許多類型的Ingress控制器具有不同的功能。
默認(rèn)的CCE Ingress控制器將為您啟動HTTP(S)負(fù)載均衡器,這將使您可以同時進行局域路徑和基于子域的到后端服務(wù)的路由。例如,您可以將foo.yourdomain.com上的所有內(nèi)容發(fā)送到foo服務(wù),并將yourdomain.com/bar/路徑下的所有內(nèi)容發(fā)送到bar服務(wù)。
具有L7 HTTP負(fù)載均衡器的CCE上Ingress對象的YAML可能看起來像這樣:
kind: Ingress metadata:name: my-ingress spec:backend:serviceName: otherservicePort: 8080rules:- host: foo.mydomain.comhttp:paths:- backend:serviceName:fooservicePort: 8080- host: mydomain.comhttp:paths:- path: /bar/*backend:serviceName: barservicePort: 8080什么時候用Ingress?
Ingress可能是公開服務(wù)的最強大方法,但也可能是最復(fù)雜的。華為云端負(fù)載均衡器,Nginx,Contour,Istio等,有很多類型的Ingress控制器。還有一些用于Ingress控制器的插件,例如cert-manager,可以為您的服務(wù)自動設(shè)置SSL證書。
?
如果要在同一IP地址下公開多個服務(wù),并且這些服務(wù)都使用相同的L7協(xié)議(通常為HTTP),則Ingress最有用。
?
總結(jié)
以上是生活随笔為你收集整理的Kubernetes NodePort vs Loadbalancer vs Ingress 在生成中如何选择?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Golang自定义Kubernete
- 下一篇: Kubernetes之yaml文件详解(