您好,登录后才能下订单哦!
这篇文章将为大家详细讲解有关如何简洁优雅地实现Kubernetes的服务暴露,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
如何使用端口映射在Rancher 2.0中暴露Kubernetes工作负载。
小编将介绍Kubernetes中用于为工作负载暴露公共端口的选项及其优缺点。
使用容器部署应用程序时,常常需要将外部流量路由到应用程序容器。
要提供外部访问,通常使用的标准方法是在部署应用程序的节点上公开公共端口,或在应用程序容器前放置负载均衡器。
相信使用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 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的服务暴露就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。