NodePort、LoadBalancers和Ingress在Kubernetes生產中如何選擇?

  • 2019 年 12 月 4 日
  • 筆記

最近,有人問我NodePortLoadBalancersIngress之間有什麼區別。它們都是將外部流量帶入群集的不同方法,並且它們都以不同的方式進行。簡單的說,生產環境建議使用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-app

type: ClusterIP

ports:

– name: http

port: 80

targetPort: 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代理訪問服務。

  1. 調試服務,或出於某些原因直接從筆記本電腦連接到服務
  2. 允許內部流量,顯示內部儀錶板等

因為此方法要求您以經過身份驗證的用戶身份運行kubectl,所以不應使用此方法將服務公開到Internet或將其用於生產服務。

NodePort

NodePort服務是將外部流量直接轉發到服務的最原始的方法。顧名思義,NodePort會在所有節點(VM)上打開一個特定的端口,並且發送到該端口的所有流量都將轉發到該服務。

原圖不準確,具有一定的誤導性

NodePort服務的YAML如下所示:

apiVersion: v1

kind: Service

metadata:

name: my-nodeport-service

spec:

selector:

app: my-app

type: NodePort

ports:

– name: http

port: 80

targetPort: 80

nodePort: 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: other

servicePort: 8080

rules:

– host: foo.mydomain.com

http:

paths:

– backend:

serviceName: foo

servicePort: 8080

– host: mydomain.com

http:

paths:

– path: /bar/*

backend:

serviceName: bar

servicePort: 8080

什麼時候用Ingress?

Ingress可能是公開服務的最強大方法,但也可能是最複雜的。華為雲端負載均衡器,Nginx,Contour,Istio等,有很多類型的Ingress控制器。還有一些用於Ingress控制器的插件,例如cert-manager,可以為您的服務自動設置SSL證書。

如果要在同一IP地址下公開多個服務,並且這些服務都使用相同的L7協議(通常為HTTP),則Ingress最有用。

原文地址:

https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0