查看原文
其他

如何简洁优雅地实现Kubernetes的服务暴露

Prachi Damle RancherLabs 2019-03-29

使用容器部署应用程序时,常常需要将外部流量路由到应用程序容器。

要提供外部访问,通常使用的标准方法是在部署应用程序的节点上公开公共端口,或在应用程序容器前放置负载均衡器。

相信使用Rancher 1.6的Cattle的用户,都熟悉如何使用端口映射来暴露服务。在本文中,我们将探讨如何使用端口映射在Rancher 2.0中暴露Kubernetes工作负载。使用负载均衡解决方案是一个更大的主题,我们日后会有专门的文章来探讨它。


Rancher 1.6中的端口映射


Rancher 1.6中,用户能够通过端口映射来部署容器化应用并暴露它们。



用户可以选择主机上的特定端口,或让Rancher分配一个随机端口,并打开该端口以允许外部访问。 此公共端口会将流量路由到该主机上运行的服务容器的专用端口。


Rancher 2.0中的端口映射


Rancher 2.0还支持将端口映射添加到部署在Kubernetes集群上的工作负载中。Kubernetes中用于为工作负载暴露公共端口的选项有: 

  • HostPort

  • 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 ComposeKubernetes 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的公共访问。



通过KomposeRancher CLI添加HostPort


即使docker-compose.yml指定了暴露的端口,Kompose也不会将所需的HostPort构造添加到我们的部署规范中。因此,为了复制Rancher 2.0集群中的端口映射,我们可以手动将HostPort构造添加到nginx-deployment.yaml中的pod容器规范中,并使用Rancher CLI进行部署。



通过KomposeRancher 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!



拓展阅读:

《如何从Rancher 1.6迁移到Rancher 2.0?这份清单可以帮助你!》

《Rancher 2.0集群与工作负载告警》

《如何在桌面上安装运行Rancher 2.0》


Rancher Labs由硅谷云计算泰斗、CloudStack之父梁胜创建,致力于打造创新的开源软件,帮助企业在生产环境中运行容器与Kubernetes。旗舰产品Rancher是一个开源的企业级Kubernetes平台,是业界首个且唯一可以管理所有云上、所有发行版、所有Kubernetes集群的平台。解决了生产环境中企业用户可能面临的基础设施不同的困境,改善Kubernetes原生UI易用性不佳以及学习曲线陡峭的问题,是企业落地Kubernetes的不二之选。


Rancher在全球已有9000万次下载和超过20000个生产节点部署,且在全球范围内已经拥有包含迪斯尼、IBM、乐高、美国农业部、SONY、中国平安、海航集团在内数百家大中型政府及企业客户。


公众号:RancherLabs

官    网:cnrancher.com

加它好友👆进技术群

9月1日上海,Rancher携手JFrog杰蛙举办容器技术沙龙,聚焦企业容器落地实践,等你来约~!

点击“阅读原文”,报名活动

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存