如何簡潔優雅地實現Kubernetes的服務暴露

詳細教程!Step by step 教你如何使用端口映射在Rancher 2.0中暴露Kubernetes工做負載。本文將介紹Kubernetes中用於爲工做負載暴露公共端口的選項及其優缺點,爲您提供有效參考。nginx


使用容器部署應用程序時,經常須要將外部流量路由到應用程序容器。git

要提供外部訪問,一般使用的標準方法是在部署應用程序的節點上公開公共端口,或在應用程序容器前放置負載均衡器。github

相信使用Rancher 1.6的Cattle的用戶,都熟悉如何使用端口映射來暴露服務。在本文中,咱們將探討如何使用端口映射在Rancher 2.0中暴露Kubernetes工做負載。使用負載均衡解決方案是一個更大的主題,咱們往後會有專門的文章來探討它。docker

Rancher 1.6中的端口映射後端

Rancher 1.6中,用戶可以經過端口映射來部署容器化應用並暴露它們。負載均衡

用戶能夠選擇主機上的特定端口,或讓Rancher分配一個隨機端口,並打開該端口以容許外部訪問。 此公共端口會將流量路由到該主機上運行的服務容器的專用端口。ide

Rancher 2.0中的端口映射工具

Rancher 2.0還支持將端口映射添加到部署在Kubernetes集羣上的工做負載中。Kubernetes中用於爲工做負載暴露公共端口的選項有:ui

  • HostPort3d

  • NodePort

如上所示,Rancher 2.0中端口映射的UI與1.6體驗很是類似。Rancher在爲Kubernetes集羣建立部署時,會在內部添加必要的Kubernetes HostPort或NodePort規範。

下面讓咱們更詳細地來分別看一下HostPort和NodePort。

什麼是HostPort?

建立Kubernetes中的工做負載時,你必須在「容器」部分的Kubernetes YAML規範中指定HostPort設置。當您選擇HostPort進行映射時,Rancher會在內部執行此操做。

指定HostPort後,在部署pod容器的主機上,該端口會暴露給外部訪問。在<host IP>:<HostPort>上的流量將會被路由到pod容器的專用端口。

以下是咱們的Nginx工做負載的Kubernetes YAML如何指定'ports'部分下的HostPort設置:

將HostPort用於Kubernetes pod,至關於在Rancher 1.6中爲Docker容器暴露一個公共端口。

HostPort的優勢:

  • 經過HostPort設置,您能夠請求暴露主機上的任何可用端口。

  • 配置很簡單,HostPort設置直接放在Kubernetes pod規範中。與NodePort相比,不須要建立其餘對象來暴露應用程序。

HostPort的缺點:

  • 使用HostPort會限制pod的調度,由於只有那些具備指定端口可用的主機才能用於部署。

  • 若是工做負載的規模大於Kubernetes集羣中的節點數,部署會失敗。

  • 指定了相同HostPort的任何兩個工做負載,都將沒法部署在同一節點上。

  • 若是運行pod的主機出現故障,Kubernetes將不得不將pod從新安排到不一樣的節點。如此一來,能夠訪問工做負載的IP地址將發生變化,從而破壞應用程序的外部客戶端。當pod從新啓動時也會發生一樣的事情,Kubernetes會在不一樣的節點上從新安排它們。

什麼是NodePort?

在咱們深刻研究如何建立NodePort來暴露Kubernetes工做負載以前,讓咱們先了解一些Kubernetes服務的背景知識。

Kubernetes服務

Kubernetes服務是一個REST對象,它抽象了對Kubernetes pod的訪問。Kubernetes pod監聽的IP地址不能用做公共訪問工做負載的可靠端點,由於pod有可能被動態地銷燬和從新建立,從而更改其IP地址。

Kubernetes服務爲pod提供靜態端點。所以,經過Kubernetes服務的界面,即便pod切換IP地址,依賴於經過這些pod啓動的工做負載的外部客戶端也可以繼續訪問工做負載,不會中斷,也對後端pod的從新建立無感。

默認狀況下,你能夠在內部IP上的Kubernetes集羣中訪問服務。此內部做用域使用服務規範的type參數定義。所以,默認狀況下,對於服務,yaml是type:ClusterIP。

若是你想在Kubernetes集羣外部暴露服務,請參閱Kubernetes中的這些ServiceType選項:

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types。

而ServiceType中的其中一種類型就是咱們下文要說的NodePort,它提供對爲工做負載窗口建立的Kubernetes服務的外部訪問。

如何定義NodePort

再回過頭來看運行Nginx鏡像的工做負載。對於此工做負載,咱們須要對外暴露私有容器端口80。

要實現這一目的,咱們能夠爲工做負載建立NodePort服務。NodePort服務規範以下所示:

若是咱們指定NodePort服務,Kubernetes將在每一個節點上分配一個端口。 選擇的NodePort將在建立後在服務規範中可見,正如上所示。或者,咱們也能夠在建立服務時指定要在規範中用做NodePort的特定端口。若是未指定特定的NodePort,將隨機選取Kubernetes集羣上配置的範圍(默認值:30000-32767)中的端口。

從Kubernetes集羣外部,進入<NodeIP>:<NodePort>的流量將被定向到工做負載(由kube-proxy組件完成這項工做)。NodeIP能夠是Kubernetes集羣中任何節點的IP地址。

NodePort的優勢:

  • 建立NodePort服務將爲工做負載pod提供靜態的公共端點。所以,即便pod被動態銷燬,Kubernetes也能夠在集羣中的任何位置部署工做負載,而無需更改公共端點。

  • pod的規模不受集羣中節點數量的限制。Nodeport容許將公共訪問與pod的數量和位置分離。

NodePort的缺點:

  • 使用NodePort時,即便工做負載從未在該節點上部署,<NodeIP>:<NodePort>也會在Kubernetes集羣中爲每一個節點保留。

  • 您只能從配置的範圍中指定端口,而不能指定任何隨機端口。

  • 須要額外的Kubernetes對象(類型爲NodePort的Kubernetes服務)來暴露您的工做負載。所以,瞭解您的應用程序是如何暴露的並不簡單。

從Docker Compose到Kubernetes YAML

上文的內容介紹了與1.6相比,Cattle用戶能如何在Rancher 2.0 UI中添加端口映射。如今讓咱們看看咱們如何經過compose文件和Rancher CLI來作一樣的事情。

咱們可使用Kompose工具將docker-compose.yml文件從Rancher 1.6轉換爲Kubernetes YAML,而後使用Rancher CLI在Kubernetes集羣中部署應用程序。

這是在1.6上運行的上述Nginx服務的docker-compose.yml配置:

Kompose會爲在Rancher 2.0中部署Nginx工做負載所需的Kubernetes部署和服務對象生成YAML文件。Kubernetes部署規範定義了pod和容器規範,而服務規範定義了對pod的公共訪問。

經過Kompose和Rancher CLI添加HostPort

即便docker-compose.yml指定了暴露的端口,Kompose也不會將所需的HostPort構造添加到咱們的部署規範中。所以,爲了複製Rancher 2.0集羣中的端口映射,咱們能夠手動將HostPort構造添加到nginx-deployment.yaml中的pod容器規範中,並使用Rancher CLI進行部署。

經過Kompose和Rancher CLI添加NodePort

要經過Kompose爲部署添加NodePort服務,應根據Kompose文檔將標籤kompose.service.type添加到docker-compose.yml文件中:

https://github.com/kubernetes/kompose/blob/master/docs/user-guide.md#labels

如今docker-compose.yml已經包含了所需的NodePort服務以及部署規範了,那麼咱們就能夠開始使用這一docker-compose.yml運行Kompose了。使用Rancher CLI,咱們能夠經過NodePort成功部署以暴露工做負載了。

總 結

在本文中,咱們探討了如何在Rancher 2.0中使用端口映射來將應用程序工做負載暴露給公共訪問。Rancher 1.6中端口映射的功能能夠輕鬆轉換到Kubernetes平臺。此外,Rancher 2.0 UI在建立或升級工做負載時爲映射端口提供了相同的直觀體驗。

在後續的文章中,咱們將探討如何使用Kubernetes監控應用程序工做負載的運行情況,並一塊兒來看看Cattle提供的健康檢查是否能夠徹底遷移到Rancher 2.0!

相關文章
相關標籤/搜索