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