如何简洁优雅地实现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!

相关文章
相关标签/搜索