自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Kubernetes的三種外部訪問方式:NodePort、LoadBalancer和Ingress

云計(jì)算
最近有些同學(xué)問我 NodePort,LoadBalancer 和 Ingress 之間的區(qū)別。它們都是將集群外部流量導(dǎo)入到集群內(nèi)的方式,只是實(shí)現(xiàn)方式不同。讓我們看一下它們分別是如何工作的,以及你該如何選擇它們。

最近有些同學(xué)問我 NodePort,LoadBalancer 和 Ingress 之間的區(qū)別。它們都是將集群外部流量導(dǎo)入到集群內(nèi)的方式,只是實(shí)現(xiàn)方式不同。讓我們看一下它們分別是如何工作的,以及你該如何選擇它們。

注意:這里說的每一點(diǎn)都基于Google Kubernetes Engine。如果你用 minikube 或其它工具,以預(yù)置型模式(om prem)運(yùn)行在其它云上,對應(yīng)的操作可能有點(diǎn)區(qū)別。我不會太深入技術(shù)細(xì)節(jié),如果你有興趣了解更多,官方文檔[1]是一個(gè)非常棒的資源。

[[225771]]

ClusterIP

ClusterIP 服務(wù)是 Kubernetes 的默認(rèn)服務(wù)。它給你一個(gè)集群內(nèi)的服務(wù),集群內(nèi)的其它應(yīng)用都可以訪問該服務(wù)。集群外部無法訪問它。

ClusterIP 服務(wù)的 YAML 文件類似如下:

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata:   
  4.   name: my-internal-service 
  5. selector:     
  6.   app: my-app 
  7. spec: 
  8.   type: ClusterIP 
  9.   ports:   
  10.   - name: http 
  11.     port: 80 
  12.     targetPort: 80 
  13.     protocol: TCP 

如果 從Internet 沒法訪問 ClusterIP 服務(wù),那么我們?yōu)槭裁匆懻撍??那是因?yàn)槲覀兛梢酝ㄟ^ Kubernetes 的 proxy 模式來訪問該服務(wù)!

啟動 Kubernetes proxy 模式:

  1. $ kubectl proxy --port=8080 

這樣你可以通過Kubernetes API,使用如下模式來訪問這個(gè)服務(wù):

  1. http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/ 

要訪問我們上面定義的服務(wù),你可以使用如下地址:

  1. http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/ 

何時(shí)使用這種方式?

有一些場景下,你得使用 Kubernetes 的 proxy 模式來訪問你的服務(wù):

  • 由于某些原因,你需要調(diào)試你的服務(wù),或者需要直接通過筆記本電腦去訪問它們。
  • 容許內(nèi)部通信,展示內(nèi)部儀表盤等。

這種方式要求我們運(yùn)行 kubectl 作為一個(gè)未認(rèn)證的用戶,因此我們不能用這種方式把服務(wù)暴露到 internet 或者在生產(chǎn)環(huán)境使用。

NodePort

NodePort 服務(wù)是引導(dǎo)外部流量到你的服務(wù)的最原始方式。NodePort,正如這個(gè)名字所示,在所有節(jié)點(diǎn)(虛擬機(jī))上開放一個(gè)特定端口,任何發(fā)送到該端口的流量都被轉(zhuǎn)發(fā)到對應(yīng)服務(wù)。

NodePort 服務(wù)的 YAML 文件類似如下:

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata:   
  4.   name: my-nodeport-service 
  5. selector:     
  6.   app: my-app 
  7. spec: 
  8.   type: NodePort 
  9.   ports:   
  10.   - name: http 
  11.     port: 80 
  12.     targetPort: 80 
  13.     nodePort: 30036 
  14.     protocol: TCP 

NodePort 服務(wù)主要有兩點(diǎn)區(qū)別于普通的“ClusterIP”服務(wù)。***,它的類型是“NodePort”。有一個(gè)額外的端口,稱為 nodePort,它指定節(jié)點(diǎn)上開放的端口值 。如果你不指定這個(gè)端口,系統(tǒng)將選擇一個(gè)隨機(jī)端口。大多數(shù)時(shí)候我們應(yīng)該讓 Kubernetes 來選擇端口,因?yàn)槿缭u論中 thockin 所說,用戶自己來選擇可用端口代價(jià)太大。

何時(shí)使用這種方式?

  1. 這種方法有許多缺點(diǎn):
  2. 每個(gè)端口只能是一種服務(wù)
  3. 端口范圍只能是 30000-32767

如果節(jié)點(diǎn)/VM 的 IP 地址發(fā)生變化,你需要能處理這種情況

基于以上原因,我不建議在生產(chǎn)環(huán)境上用這種方式暴露服務(wù)。如果你運(yùn)行的服務(wù)不要求一直可用,或者對成本比較敏感,你可以使用這種方法。這樣的應(yīng)用的***例子是 demo 應(yīng)用,或者某些臨時(shí)應(yīng)用。

LoadBalancer

LoadBalancer 服務(wù)是暴露服務(wù)到 internet 的標(biāo)準(zhǔn)方式。在 GKE 上,這種方式會啟動一個(gè) Network Load Balancer[2],它將給你一個(gè)單獨(dú)的 IP 地址,轉(zhuǎn)發(fā)所有流量到你的服務(wù)。

何時(shí)使用這種方式?

如果你想要直接暴露服務(wù),這就是默認(rèn)方式。所有通往你指定的端口的流量都會被轉(zhuǎn)發(fā)到對應(yīng)的服務(wù)。它沒有過濾條件,沒有路由等。這意味著你幾乎可以發(fā)送任何種類的流量到該服務(wù),像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意種類。

這個(gè)方式的***缺點(diǎn)是每一個(gè)用 LoadBalancer 暴露的服務(wù)都會有它自己的 IP 地址,每個(gè)用到的 LoadBalancer 都需要付費(fèi),這將是非常昂貴的。

Ingress

有別于以上所有例子,Ingress 事實(shí)上不是一種服務(wù)類型。相反,它處于多個(gè)服務(wù)的前端,扮演著“智能路由”或者集群入口的角色。

你可以用 Ingress 來做許多不同的事情,各種不同類型的 Ingress 控制器也有不同的能力。

GKE 上的默認(rèn) ingress 控制器是啟動一個(gè) HTTP(S) Load Balancer[3]。它允許你基于路徑或者子域名來路由流量到后端服務(wù)。例如,你可以將任何發(fā)往域名 foo.yourdomain.com 的流量轉(zhuǎn)到 foo 服務(wù),將路徑 yourdomain.com/bar/path 的流量轉(zhuǎn)到 bar 服務(wù)。

GKE 上用 L7 HTTP Load Balancer[4]生成的 Ingress 對象的 YAML 文件類似如下:

  1. apiVersion: extensions/v1beta1 
  2. kind: Ingress 
  3. metadata: 
  4.   name: my-ingress 
  5. spec: 
  6.   backend: 
  7.     serviceName: other 
  8.     servicePort: 8080 
  9.   rules: 
  10.   - host: foo.mydomain.com 
  11.     http: 
  12.       paths: 
  13.       - backend: 
  14.           serviceName: foo 
  15.           servicePort: 8080 
  16.   - host: mydomain.com 
  17.     http: 
  18.       paths: 
  19.       - path: /bar/* 
  20.         backend: 
  21.           serviceName: bar 
  22.           servicePort: 8080 

何時(shí)使用這種方式?

Ingress 可能是暴露服務(wù)的***大方式,但同時(shí)也是最復(fù)雜的。Ingress 控制器有各種類型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio,等等。它還有各種插件,比如 cert-manager[5],它可以為你的服務(wù)自動提供 SSL 證書。

如果你想要使用同一個(gè) IP 暴露多個(gè)服務(wù),這些服務(wù)都是使用相同的七層協(xié)議(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要為一個(gè)負(fù)載均衡器付費(fèi),且由于 Ingress是“智能”的,你還可以獲取各種開箱即用的特性(比如 SSL、認(rèn)證、路由等等)。

相關(guān)鏈接:

https://kubernetes.io/docs/concepts/services-networking/service/

https://cloud.google.com/compute/docs/load-balancing/network/

https://cloud.google.com/compute/docs/load-balancing/http/

https://cloud.google.com/compute/docs/load-balancing/http/

https://github.com/jetstack/cert-manager

責(zé)任編輯:武曉燕 來源: Docker
相關(guān)推薦

2022-03-03 08:42:10

NodePortServiceKubernetes

2010-09-13 12:19:03

2023-11-08 07:50:41

KubernetesIngress

2009-03-09 11:27:55

2021-08-31 09:55:57

服務(wù)開發(fā)K8S

2024-05-27 00:20:00

2024-08-13 08:25:16

C#外部程序方式

2009-11-05 10:12:12

2012-07-17 09:16:16

SpringSSH

2010-09-25 15:15:32

2010-08-13 15:08:55

Flex數(shù)據(jù)訪問

2023-03-07 08:25:39

探針Kubernetes

2014-12-31 17:42:47

LBSAndroid地圖

2021-06-24 08:52:19

單點(diǎn)登錄代碼前端

2021-11-05 21:33:28

Redis數(shù)據(jù)高并發(fā)

2019-11-20 18:52:24

物聯(lián)網(wǎng)智能照明智能恒溫器

2020-11-01 17:10:46

異步事件開發(fā)前端

2010-03-12 17:52:35

Python輸入方式

2021-03-07 10:17:40

RDMA網(wǎng)絡(luò)傳輸網(wǎng)絡(luò)協(xié)議

2024-07-08 09:03:31

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號