2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

  • 2020-04-15
  • 本文字数:2984 字

    阅读完需:约 10 分钟

如何简洁优雅地实现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 监控应用程序工作负载的运行状况,并一起来看看 Cattle 提供的健康检查是否可以完全迁移到 Rancher 2.0!


2020-04-15 23:052551

评论

发布
暂无评论
发现更多内容

一图看懂华为云CodeArts Board5大特性,带你玩转看板服务

华为云PaaS服务小智

云计算 数据可视化 华为云 企业研发管理 数据看板

搜索语义模型的大规模量化实践

百度Geek说

paddle NLP 大模型 企业号 6 月 PK 榜 6 月 优质更文活动 INT8

IoT场景时序数据库性能对比报告出炉,TDengine 远超 InfluxDB & Timescal

电子信息发烧客

华为开发者大会—开发者的一站式代码检查利器:华为云代码检查CodeArts Check

华为云PaaS服务小智

云计算 华为云 华为开发者大会2023

3dMax 应该用哪个渲染器?Vray、Corona、Arnold?

Finovy Cloud

Scrum看板工具在项目管理中的作用

顿顿顿

敏捷工具 scrum工具 scrum敏捷工具

零基础自学:2023年的今天,请谨慎进入网络安全行业

网络安全学海

黑客 网络安全 信息安全 计算机 渗透测试

强化学习从基础到进阶-案例与实践[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

汀丶人工智能

人工智能 深度学习 强化学习 6 月 优质更文活动 A3C算法

什么是区块链?

TiAmo

区块链 去中心化 6 月 优质更文活动

Flutter性能优化的一些路径思考

Onegun

flutter 移动开发

直播程序源码技术分享主播邀请上麦功能

山东布谷科技

软件开发 程序 源码搭建 直播源码

唯一入选中国厂商!灵雀云获Gartner® 首份《DevOps平台魔力象限报告》“荣誉提及”

York

容器 DevOps 云原生 Gartner 平台工程

复旦大学智能计算平台与世界科学智能大赛启动仪式

新云力量

智能 计算 复旦大学

es笔记一之es安装与介绍

Hunter熊

elasticsearch Kibana 安装Kibana

最佳实践|亚马逊可持续发展的架构模型

亚马逊云科技 (Amazon Web Services)

JavaScript

STC89C52+DHT20设计的环境温湿度检测仪

DS小龙哥

6 月 优质更文活动

李彦宏:AI原生应用比大模型数量更重要

飞桨PaddlePaddle

人工智能 百度 paddle 大模型

解决QT QGraphicsView提升到QChartView报错的问题

芯动大师

【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(通用语言体系)

码界西柚

领域驱动设计 DDD 领域驱动设计思想 领域驱动模型

StarRocks & Friends 上海站活动回顾(含 PPT 下载链接)

StarRocks

数据库 OLAP MPP 大数据 开源

复旦发布云上最大科研智算平台

新云力量

智能 计算 复旦 科研智算平台

提升测试质量的四个关键特征

老张

质量保障 测试质量

架构实战营(一)

架构实战营

小程序容器技术在移动警务中的业务价值

FinFish

小程序容器 移动警务 警务app

强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

汀丶人工智能

人工智能 深度学习 强化学习 6 月 优质更文活动

浅析 Jetty 中的线程优化思路

vivo互联网技术

jetty EatWhatYouKill 线程策略

入门指南:使用Spring Boot构建Java应用程序

2756

入门学习

工业物联网SCADA软件推荐

2D3D前端可视化开发

工业物联网 工业控制系统 web组态软件 HMI SCADA软件

实现 AI 大语言模型的关键在于超高性能存储能力

焱融科技

如何简洁优雅地实现Kubernetes的服务暴露_文化 & 方法_Rancher_InfoQ精选文章