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

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

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

在应用程序及其微服务的生命周期中,其中某些部分可能会出现错误,没法运行,进而致使意外情况,IP地址也颇有可能发生变化。此时,服务网格能够帮助应用程序从新路由、提高安全性。架构

动态IP分配

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

咱们当然能够为单个Pod和服务定义IP地址,但这样作会限制Kubernetes环境的可伸缩性。在默认状况下,环境在每次从新启动集群、pod或服务时,任意资源都会得到新的IP地址,所以咱们只能对服务使用惟一的名称。微服务

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

若是你有在多个端口上运行的服务,你能够运行kubectl exec memcached-rm58b en命令,而后对服务名称进行快速grep操做,以后将会显示分配给该服务的可用IP地址和端口。不过,这并非管理服务发现的最有效方法。由于,这种方法中依赖的服务必须在 pod 启动以前就存在,否则是不会出如今环境变量中的。ui

Kube-DNS救场

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

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

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

这一方法还能更进一步,在每一个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以前来回传递数据而不会中断。

相关文章
相关标签/搜索