2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Kubernetes 服务发现入门:如何高效管理服务?

  • 2020-05-18
  • 本文字数:1876 字

    阅读完需:约 6 分钟

Kubernetes服务发现入门:如何高效管理服务?

愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率。Kubernetes 为微服务提供了完美的环境,并能够让其与 Kubernetes 的工具组件和功能兼容。当应用程序的每个部分放置在一个容器中,整个系统就会更具可伸缩性。


微服务和容器的运作方式也适合当下的 CI/CD 工作流程,即无需关闭整个系统进行更新,因为可以分别更新每个微服务(容器)。但是,这会使容器或 pod 的生命周期缩短,其 IP 地址会发生变化。


在应用程序及其微服务的生命周期中,其中某些部分可能会出现错误,无法运行,进而导致意外状况,IP 地址也很有可能发生变化。此时,服务网格可以帮助应用程序重新路由、提升安全性。

动态 IP 分配

在我们了解如何管理服务以及如何高效建立服务发现之前,我们必须了解服务发现所面临的首要挑战:IP 分配问题。具体而言,Kubernetes 将 IP 地址动态分配给 Pod 和服务的方式。


我们固然可以为单个 Pod 和服务定义 IP 地址,但这样做会限制 Kubernetes 环境的可伸缩性。在默认情况下,环境在每次重新启动集群、pod 或服务时,任意资源都会获得新的 IP 地址,因此我们只能对服务使用唯一的名称。


为了克服这一问题,你可以使用两种方法。其一,查看服务的环境变量。与 Docker 允许容器相互通信的方式类似,Kubernetes 允许你扫描注入到容器中的环境变量。


如果你有在多个端口上运行的服务,你可以运行 kubectl exec memcached-rm58b env 命令,然后对服务名称进行快速 grep 操作,之后将会显示分配给该服务的可用 IP 地址和端口。不过,这并不是管理服务发现的最有效方法。因为,这种方法中依赖的服务必须在 pod 启动之前就存在,不然是不会出现在环境变量中的。

Kube-DNS 救场

长远来看,以下阐述的第二种方法通常被认为效率更高,这得益于 Kubernetes 的插件 Kube-DNS。我们先来了解什么是 Kube-DNS。顾名思义,Kube-DNS 是充当内部 DNS 解析器的附加组件。它是一个数据库,其中包含用于查找的键值对。键是 Kubernetes 服务的名称,值是服务所运行的 IP 地址。


Kube-DNS 仅依赖命名空间,无需以其他方式配置 Pod 和服务,甚至无需修改集群、Pod 和服务的配置文件即可进行基于 DNS 的服务发现。


Kube-DNS 同时也支持高级 DNS 查询以及 DNS 策略。例如,你可以对每个 Pod 进行配置,将其配置为遵循与其运行的节点不同的 DNS 属性。这意味着你可以使用私有 DNS 空间来自定义 pod 之间如何进行通信。


这一方法还能更进一步,在每个 pod 的基础上配置 DNS 策略。你需要做的就是将节点 DNS 策略设置为“None”,然后手动配置每个 Pod 以满足你的特定需求。

Label 和 Selectors

正如前文所述,你可以使用参数来进一步影响 Pod 之间和服务之间的通信方式。Kubernetes 服务发现支持对高级控件使用 label 和 selector,特别是在管理复杂集群时,label 尤为方便。你可以将 label 分配给组件和容器,以便于识别。


Kubernetes 处理 label 和 selector 的方式使得这些参数更易于使用。本质上,它们时添加到元数据中的简单键值参数。也就是说,它们实际上并不会影响系统或环境中的其他部分,你可以在复杂的环境中跨 pod 和服务(甚至跨节点)自由使用 label 和 selector。


接下来,我们要使用副本控制器。同样,顾名思义,它是一个可以使 Kubernetes 的系统具有高可用性和可伸缩性的工具。你可以使用副本控制器来创建和管理 pod 副本并且维护高可用。同时,你也可以轻松地一次性删除 pod 及其副本。

Service Mesh 和高度弹性伸缩系统

要完成设置,我们需要使用与现有基础架构和平台相关的高级服务发现方法。AWS Cloud Map 是一个十分有意思的例子。AWS 环境中的应用程序资源可以拥有唯一的名称,并且那些资源会被 Cloud Map 自动映射。它们注册完成后,服务会自动变为可发现的,并且在启动 Pod 或服务后立即进行注册过程。


现在有一个新的方法,通过使用服务网格让管理微服务的复杂阵列变得容易。服务网格标准化了服务和 Pod 的通信方式。如果你要创建一个高可用的系统,那么在环境中使用服务网格来维护 Pod 的可见性是一个完美的解决方案。


但是,如果你的环境在 AWS 上,则可以以 AWS App Mesh 的形式利用其服务网格功能。它会自动处理所有事情,包括流量路由、流量均衡、调用以及使用 API 调用的 circuit breaking。所有微服务都能够启用 API Mesh,以简化管理。由于此工具是 Amazon 生态的一部分,因此它会自动和 Amazon EKS、IAM 等其他工具一起使用。


Kubernetes 服务发现使得容器平台具有强大功能以及灵活性,服务网格等方法无疑通过标准化使 Kubernetes 服务发现更加强大。只要服务在运行,就可以使正确的 API 调用在每个 Pod 之前来回传递数据而不会中断。


2020-05-18 18:07792

评论

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

[ Kitex 源码解析] 函数式编程

baiyutang

golang 微服务 Go 语言 11月日更

Android C++系列:Linux文件系统(一)

轻口味

c++ android jni 11月日更

在浏览器里使用 SAP GUI

汪子熙

SAP abap SAPGUI 11月日更

测试左移实践介绍

刘冉

TDD 自动化测试 测试驱动开发 测试左移 ATTD

研发效能提升的八项实践建议

博文视点Broadview

北京主题展|2022第十五届北京国际物联网展览会

InfoQ_caf7dbb9aa8a

精选案例 | YRCloudFile 引领自动驾驶存储技术新趋势

焱融科技

自动驾驶 云计算 分布式 高性能 文件存储

只需10分钟,让你的企业应用具备OCR能力

明道云

货币“大动作”,中国数字货币DCEP即将落地!

CECBC

复杂JSON结构创建语法

FunTester

Java json 接口测试 测试开发 FunTester

前端开发:Node版本引起的报错问题

三掌柜

11月日更

部署Apollo

小鲍侃java

11月日更

Vue进阶(贰佰):前端UI框架介绍

No Silver Bullet

Vue UI 11月日更

【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例

冰河

Java 并发编程 多线程 高并发 异步编程

论文解读丨文本行识别模型的再思考

华为云开发者联盟

数据集 文档 文本 文本识别 语言模型

WebRTC DTLS | 谈谈 DTLS Fragment

泰一

DTLS

SAP UI 搜索分页技术

汪子熙

JavaScript Web SAP 11月日更

Prometheus Exporter (二)Windows Exporter

耳东@Erdong

Prometheus exporter 11月日更 Windows Exporter

flutter 开发中 vscode 插件推荐 3

坚果

flutter 11月日更

dart系列之:创建Library package

程序那些事

flutter dart 程序那些事 11月日更

Hi,Contributor,有一份专属周边礼包等你领取!

SphereEx

开源社区 ShardingSphere SphereEx Contributor 周边

建设区块链基础设施,加速区块链等新技术与传统行业深度融合发展

CECBC

直播 | 大数据能力体系构建的技术方法全在这了!

百度开发者中心

大数据 百度 直播 开发者沙龙

Java将增加虚拟线程,挑战Go协程

编程宝库

Java golang 并发

Java编程中忽略这些细节,Bug肯定找上你

华为云开发者联盟

Java 编程 对象 垃圾回收 switch语句

提升RTC音频体验 - 从搞懂硬件开始

Wilber

音视频 RTC 3A 音频技术 音频3A

明道云初学者如何速成报表管理系统

明道云

【Flutter 专题】04 图解第一个程序遇到的安装依赖问题

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

【LeetCode】整数替换Java题解

Albert

算法 LeetCode 11月日更

北京智博会主题展|2022第十五届北京国际物联网展览会

InfoQ_caf7dbb9aa8a

数字藏品是什么?有风险吗?谁来监管?

CECBC

Kubernetes服务发现入门:如何高效管理服务?_文化 & 方法_Rancher_InfoQ精选文章