如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

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:07777

评论

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

企业网站搭建避坑指南

姜奋斗

网站 新手指南 企业 网站搭建 避坑

learn go with tests 学习笔记(一) hello world

Geek_4z9ami

Go 语言

learn go with tests 学习笔记(四)依赖注入

Geek_4z9ami

Go 语言

政策加持迎来区块链技术应用“红利期”

CECBC

关于微服务架构思考

Axe

Executor看不懂?教你如何盘它

Edison

后端 线程池

“啰嗦”是成事唯一正确的方法

霍太稳@极客邦科技

团队管理 个人成长 团队协作 沟通

踩坑记 | Flutter升级影响了NestedScrollView?

哈利迪

android

话题讨论 | 特朗普正式封禁微信,iPhone 和微信二选一?

InfoQ写作社区官方

写作平台 话题讨论

learn go with tests 学习笔记(五)并发

Geek_4z9ami

Go 语言

《effective-go》 学习笔记

Geek_4z9ami

Go 语言

500行代码写一个俄罗斯方块游戏

程序员生活志

我是如何参与硅谷顶级开源项目并赚得2500美金

阿水

硅谷 Minio

RocketMQ源码解析-开篇

Edison

RocketMQ 中间件

人生修炼秘籍

xiaoboey

时间管理 人生修炼 知行合一 熵增 时间复利

learn go with tests 学习笔记(六)进程同步

Geek_4z9ami

Go 语言

learn go with tests 学习笔记(七)反射

Geek_4z9ami

反射 Go 语言

疫情之年 下半年区块链应用落地会加速么?

CECBC

区块链 场景应用落地

消息疯狂堆积!RocketMQ出Bug了?

Edison

RocketMQ 中间件

以区块链为基础 通证经济是下一代互联网的数字经济

CECBC

区块链 落地应用

Web 开发必须掌握的三个技术:Token、Cookie、Session

华为云开发者联盟

HTTP Token web开发 session Cookie

字符串匹配 - Sunday算法

Geek_4z9ami

数据结构与算法 字符串匹配算法

learn go with tests 学习笔记(二) 数组与切片

Geek_4z9ami

Go 语言

零代码/无代码 vs 低代码 如何分类?如何区别?到底有什么不同?分析超过20款零代码低代码产品

代码制造者

编程 低代码 行业资讯 零代码

Netty之旅:你想要的NIO知识点,这里都有!

一枝花算不算浪漫

Netty nio

Python爬取微信公众号文章保存到数据库

wjchenge

learn go with tests 学习笔记(三) 指针和错误

Geek_4z9ami

Go 语言

用户体验(UX)设计≠用户界面(UI)设计

刘华Kenneth

敏捷 设计 UX 用户体验

MySQL事物-学习笔记

Edison

MySQL 数据库 数据库事务

nested exception is java.lang.IllegalStateException: refreshAfterWrite requires a LoadingCache异常解决

谙忆

数据采集能力受限?企业数字化运营如何迈出第1步

易观大数据

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