为什么 kubernetes 天然适合微服务 (3)

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验

四、Kubernetes 本身就是微服务架构

基于上面这十个设计要点,我们再回来看 Kubernetes,会发现越看越顺眼。

首先 Kubernetes 本身就是微服务的架构,虽然看起来复杂,但是容易定制化,容易横向扩展。

如图黑色的部分是 Kubernetes 原生的部分,而蓝色的部分是网易云为了支撑大规模高并发应用而做的定制化部分。

Kubernetes 的 API Server 更像网关,提供统一的鉴权和访问接口。

众所周知,Kubernetes 的租户管理相对比较弱,尤其是对于公有云场景,复杂的租户关系的管理,我们只要定制化 API Server,对接 Keystone,就可以管理复杂的租户关系,而不用管其他的组件。

在 Kubernetes 中几乎所有的组件都是无状态化的,状态都保存在统一的 etcd 里面,这使得扩展性非常好,组件之间异步完成自己的任务,将结果放在 etcd 里面,互相不耦合。

例如图中 pod 的创建过程,客户端的创建仅仅是在 etcd 中生成一个记录,而其他的组件监听到这个事件后,也相应异步的做自己的事情,并将处理的结果同样放在 etcd 中,同样并不是哪一个组件远程调用 kubelet,命令它进行容器的创建,而是发现 etcd 中,pod 被绑定到了自己这里,方才拉起。

为了在公有云中实现租户的隔离性,我们的策略是不同的租户,不共享节点,这就需要 Kubernetes 对于 IaaS 层有所感知,因而需要实现自己的 Controller,Kubernetes 的设计使得我们可以独立创建自己的 Controller,而不是直接改代码。

API-Server 作为接入层,是有自己的缓存机制的,防止所有的请求压力直接到后端数据库上。但是当仍然无法承载高并发请求时,瓶颈依然在后端的 etcd 存储上,这和电商应用一摸一样。当然能够想到的方式也是对 etcd 进行分库分表,不同的租户保存在不同的 etcd 集群中。

有了 API Server 做 API 网关,后端的服务进行定制化,对于 client 和 kubelet 是透明的。

如图是定制化的容器创建流程,由于大促和非大促期间,节点的数目相差比较大,因而不能采用事先全部创建好节点的方式,这样会造成资源的浪费,因而中间添加了网易云自己的模块 Controller 和 IaaS 的管理层,使得当创建容器资源不足的时候,动态调用 IaaS 的接口,动态的创建资源。这一切对于客户端和 kubelet 无感知。

为了解决超过 3 万个节点的规模问题,网易云需要对各个模块进行优化,由于每个子模块仅仅完成自己的功能,Scheduler 只管调度,Proxy 只管转发,而非耦合在一起,因而每个组件都可以进行独立的优化,这符合微服务中的独立功能,独立优化,互不影响。而且 Kubernetes 的所有组件都是 Go 开发的,更加容易一些。所以 Kubernetes 上手慢,但是一旦需要定制化,会发现更加容易。

五、Kubernetes 更加适合微服务和 DevOps 的设计

好了,说了 K8S 本身,接下来说说 K8S 的理念设计,为什么这么适合微服务。

前面微服务设计的十大模式,其中一个就是区分无状态和有状态,在 K8S 中,无状态对应 deployment,有状态对应 StatefulSet。

deployment 主要通过副本数,解决横向扩展的问题。

而 StatefulSet 通过一致的网络 ID,一致的存储,顺序的升级,扩展,回滚等机制,保证有状态应用,很好地利用自己的高可用机制。因为大多数集群的高可用机制,都是可以容忍一个节点暂时挂掉的,但是不能容忍大多数节点同时挂掉。而且高可用机制虽然可以保证一个节点挂掉后回来,有一定的修复机制,但是需要知道刚才挂掉的到底是哪个节点,StatefulSet 的机制可以让容器里面的脚本有足够的信息,处理这些情况,实现哪怕是有状态,也能尽快修复。

在微服务中,比较推荐使用云平台的 PaaS,例如数据库,消息总线,缓存等。但是配置也是非常复杂的,因为不同的环境需要连接不同的 PaaS 服务。

K8S 里面的 headless service 是可以很好地解决这个问题的,只要给外部服务创建一个 headless service,指向相应的 PaaS 服务,并且将服务名配置到应用中。由于生产和测试环境分成 Namespace,虽然配置了相同的服务名,但是不会错误访问,简化了配置。

微服务少不了服务发现,除了应用层可以使用 SpringCloud 或者 Dubbo 进行服务发现,在容器平台层当然是用 Service了,可以实现负载均衡,自修复,自动关联。

服务编排,本来 K8S 就是编排的标准,可以将 yml 文件放到代码仓库中进行管理,而通过 deployment 的副本数,可以实现弹性伸缩。

对于配置中心,K8S 提供了 configMap,可以在容器启动的时候,将配置注入到环境变量或者 Volume 里面。但是唯一的缺点是,注入到环境变量中的配置不能动态改变了,好在 Volume 里面的可以,只要容器中的进程有 reload 机制,就可以实现配置的动态下发了。

统一日志和监控往往需要在 Node 上部署 Agent,来对日志和指标进行收集,当然每个 Node 上都有,daemonset 的设计,使得更容易实现。

当然目前最最火的 Service Mesh,可以实现更加精细化的服务治理,进行熔断,路由,降级等策略。Service Mesh 的实现往往通过 sidecar 的方式,拦截服务的流量,进行治理。这也得力于  Pod 的理念,一个 Pod 可以有多个容器,如果当初的设计没有 Pod,直接启动的就是容器,会非常的不方便。

所以 K8S 的各种设计,看起来非常冗余和复杂,入门门槛比较高,但是一旦想实现真正的微服务,K8S 可以给你各种可能的组合方式。实践过微服务的人,往往会对这一点深有体会。

六、Kubernetes 常见的使用方式

下面我们来看一下,微服务化的不同阶段,Kubernetes 的使用方式。

第一阶段:使用公有云虚拟机

也即没有微服务化的阶段,基本上一个进程就能搞定,两个进程做高可用,不需要使用容器,虚拟机就非常好。

第二阶段:容器作为持续集成工具

当微服务开始拆分了,如何保证拆分后功能的一致性,需要持续集成作为保证,如前面的论述,容器是非常好的持续集成工具,是解决 CI/CD 中 D 的,所以一开始用 host 网络就可以,这样可以保证部署方式和原来兼容。

如果想用私有云进行部署,直接部署在物理机上,在性能要求没有很高,但是又要和其他物理机很好的通信的情况下,可以用 bridge 打平网络的方式比较好。通过创建网桥,将物理网卡,容器网卡都连接到一个网桥上,可以实现所有的容器和物理机在同样的一个二层网络里面。

如果性能要求比较高,例如要部署类似缓存,则可以使用 sr-iov 网卡。

如果想实现租户的简单隔离,则往往使用各种 Overlay 的网络模式,这是最常用的部署方式。图中的数据来自网络。Flannel,Calico 都是非常好的网络插件,虽然 Flannel 一开始使用用户态的模式性能不好,后来使用内核态,性能大大改善,使用 gw 模式后,和 Calico 性能相当。

网易云采用了 Kubernetes 和 IaaS 深度融合的方式,类似 AWS 的 Fargate 的模式,一方面可以使得原来使用虚拟机的用户平滑地迁移到容器,另一方面可以实现公有云的租户隔离。

如图是融合的网易云容器服务的架构,这个管理 OpenStack 和 Kubernetes 的管理平台,也是用的微服务架构,有 API 网关,熔断限流功能,拆分成不同的服务,部署在 K8S 上的,所以处处是微服务。

网易云轻舟微服务是围绕应用和微服务打造的一站式 PaaS 平台,帮助用户快速实现易接入、易运维的微服务解决方案。

相关阅读:为什么 kubernetes 天然适合微服务 (1)

为什么 kubernetes 天然适合微服务 (2)

为什么 kubernetes 天然适合微服务 (3)

相关文章:
【推荐】 react技术栈实践(1)
【推荐】 深入解析SQLServer高可用镜像实现原理

原文地址:https://www.cnblogs.com/163yun/p/10006673.html

时间: 2024-11-11 22:40:14

为什么 kubernetes 天然适合微服务 (3)的相关文章

Kubernetes才是微服务和DevOps的桥梁

一.从企业上云的三大架构看容器平台的三种视角 一切都从企业上云的三大架构开始. 如图所示,企业上的三大架构为IT架构,应用架构和数据架构,在不同的公司,不同的人,不同的角色,关注的重点不同. 对于大部分的企业来讲,上云的诉求是从IT部门发起的,发起人往往是运维部门,他们关注计算,网络,存储,试图通过云计算服务来减轻CAPEX和OPEX. 有的公司有ToC的业务,因而累积了大量的用户数据,公司的运营需要通过这部分数据进行大数据分析和数字化运营,因而在这些企业里面往往还需要关注数据架构. 从事互联网

为什么Docker适合微服务架构?

微服务架构日益成熟,不但得到了初创公司和创新型公司的认可,一些传统企业也在逐步接受微服务架构.我们仍然在学习如何利用其在扩展性,易于维护和构建等方面的优势.当然我们也必须承担微服务增加的成本,比如从SOA架构的迁移,编排,备份,以及对技能提升的需求等等. 一个典型的微服务架构可能是这样的: Touchbase,一个Node.js写的应用作为技术栈的核心: Nginx,作为Touchbase节点的负载均衡: Couchbase,作为数据层: Consul,服务发现: Containerbuddy,

使用Netsil监控Kubernetes上的微服务

ubernetes是容器编排和调度领域的王者,它击败了竞争对手Docker Swarm和Apache Mesos,开启了闪耀的未来,微服务可以自修复,可以自动扩展,可以跨zone,region甚至跨云供应商进行federate.在这样的云原生应用程序的新纪元里,能够以简单的方式洞察服务之间是如何交互的变得日益重要--这可和大海捞针般大范围寻找导致性能问题的某个特定的原因是不一样的. 我们花了些时间研究Netsil并且将其解决方案打包成原生的Kubernetes Deployment.Netsil

SpringBoot + Kubernetes云原生微服务实践 - (1) 介绍与案例需求

学习目标 Dev 掌握微服务架构和前后分离架构设计 掌握基于Spring Boot搭建微服务基础框架 进一步提升Java/Spring微服务开发技能 掌握Spring Boot微服务测试和相关实践 理解SaaS多租户应用的架构和设计 Ops 理解可运维架构理念和相关实践 掌握服务容器化和容器云部署相关实践 理解云时代的软件工程流程和实践 案例需求:Staffjoy工时排班(Scheduling)SaaS服务 功能 管理员Admin管理公司和排班 雇员Worker管理个人信息 非功能 SaaS +

SpringBoot + Kubernetes云原生微服务实践 - (6) 微服务测试设计和实践

微服务测试设计和实践 微服务测试的最大挑战:依赖.解决方案是采用分而治之的策略:a.先针对每一个微服务进行隔离测试,在对每一个微服务进行测试的时候再按照分层的方式进行隔离测试:测试过程中采用mock等技术来隔离依赖简化测试:b.在确保每个微服务通过隔离测试后,再进行整个应用的端到端集成测试 微服务测试分类和技术 Spring(Boot)应用分层 controller 服务的对外接口层,负责接收请求和发送响应 中间涉及到消息,一般是json跟对象间的转换,术语叫做序列化,一般由框架封装 控制器需要

传统行业转型微服务的挖坑与填坑

原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不完全是技术问题. 当时想微服务既然是改造应用,做微服务治理,类似注册,发现,熔断,限流,降级等,当然应该从应用开发组切入,一般一开始聊的会比较开心,从单体架构,到SOA,再到微服务架构,从Dubbo聊到SpringCloud,但是必然会涉及到微服务的发布和运维问题,涉及到DevOps和容器层,这些都

【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https://dzone.com/articles/quick-guide-to-microservices-with-kubernetes-sprin 作者:Piotr Mińkowski 译者:Darren Luo 在本教程中你将学习如何使用 Kubernetes 和 Docker 快速启动并运行 Sp

k8s 集群管理和微服务 适合做啥

k8s 集群管理和微服务 适合做啥 都知道k8s是集群 适合微服务 有很多教程 但你可以先了解他能干啥 traefix 是负载均衡工具 k8s 适合部署无状态依赖的微服务 可以按需求开启多个微服务 管理工具能自动发现并均衡 像redis sql ceph(对象存储)这些 支撑 和有状态依赖的服务 并不适合k8 原文地址:https://www.cnblogs.com/ham-731/p/12231693.html

.NET Core微服务之基于Consul实现服务治理

一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单. Consul用Golang实现,因此具有天然可移植性(支持Linux.windows和Ma