阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Kubernetes,旧貌新颜?

  • 2019-08-28
  • 本文字数:3740 字

    阅读完需:约 12 分钟

Kubernetes,旧貌新颜?

架构问题

作为一名软件工程师或者系统架构师,当我们在构造大型应用系统时,常常需要画出一个体系架构图,来表现要开发的应用系统的软件架构。


我想很多软件开发人员都有这样的疑问:这几年业界都在谈微服务容器化,这样的技术变化的原因是什么?新的或者原有的软件系统到底该用什么样的技术架构体系?如果需要改造,应该怎么做?


希望通过阅读本文给您一些启发。

技术背景

应用服务器是近十几年来应用开发的主流部署环境。以 Java 语言社区为例,Java EE (现名 Jakarta EE)应用服务器是软件中间件开发领域的主要产品,包括以 Weblogic, Websphere 商业产品, JBoss AS(Wildfly),Glassfish 开源产品,还有 Tomcat, Jetty 等 Servlet 容器服务器,Spring Framework 应用框架等,这些共同组成商业业务软件最重要的部分。


容器 Docker,容器编排 Kubernetes 等带来了容器化微服务软件技术浪潮,互联网公司作为先行者,并在国内外引领软件设计的方法变革,Cloud Native 已经成为当前软件设计中必须考虑的要素。


那么,“传统”的应用服务器和 Kubernetes 之间是否有技术关联性?如果有,它们的内在联系是什么?

相似之处

我在专业技术网站找到了两幅图片,分别是完整的 Java EE 实现 Wildfly 应用服务器域模式和 kubernetes 架构体系图。




以上两幅图,并不能表现这两个产品所有技术架构细节,但已经能够充分表现它们的架构特点和组件之间的关系。


我们发现,两者的架构有很多一致的地方:


  1. 都有一个主控节点。Kubernetes 称为 Master Node,Wildfly 中含有 domain controller 的 host1,也是作为主控节点。

  2. 通过主控节点管理多个工作节点。Kubernetes 有两个 Worker Node,Wildfly 图中也有两个工作节点 host2 和 host3。

  3. 管理员通过管理接口 (Rest API) 来对整个系统进行管理,Kubernetes 是通过 kubectl 访问 API server,Wildfly 是通过 jboss-cli 工具访问管理接口,服务器处理组件是 domain controller。当然,它们也都提供图形管理工具。

  4. 工作节点上都有控制进程,Kubernetes 是 kubelet 和 kube-proxy,Wildfly 为 host controller 和 process controller,其中 kubelet 和 host controller 作用类似,都是起到工作节点和主控节点通信和管理节点工作进程的作用。

  5. 每个工作节点上都有多个工作进程,只不过 Kubernetes 是由容器管理 Pod,而 Wildfly 是 JVM 进程管理工作线程。


另外在图示中没有表示出来,在逻辑上概念相似的还有:


  1. Kubenetes 中的 controller-manager 包括各类功能的控制器模块。Wildlfy 中有类似的功能模块,也在 domain controller 中,它们都具备可扩展能力。

  2. Rest API 对外接口采用简单易懂的 Json 格式。而各个节点间为了高效率,通信方式为二进制数据流,可以配置加密方式。

  3. 尽管在工作进程中,Pod 和线程是不同的。但它们逻辑上也有相似之处:都是独立的工作主体;都有完整的生命周期;Pod 间共享网络,存储等信息,线程间可以传递上下文。我个人更愿意把 Pod 看作是高一个或者半个维度的,隔离性更好的“工作线程池”。

  4. 不同的节点或者进程中的服务工作单元,可以动态组成服务群组。Wildfly 中有 Server Group 概念,一个应用可以被同时部署到 Server Group 的所有工作单元;Kubernetes 的 Pod 可以通过定义的 Label 来 Selector,即可以筛选出具有某些标记的 Pod,而作为服务群组对外提供服务。

  5. Kubernetes 有 Service 来提供服务,对于服务消费者,后面的 Pod 服务提供者的信息都是透明的,而且还有 Ingress 对外部应用进一步暴露服务能力。Wildfly 提供了 Wildfly-cluster 作为服务组件的反向代理,虽然做不到像 Service 那样直接通过 iptables 底层机制去映射网络访问端口,但同样也有强大的根据负载能力调节转发请求量的特性,更多起到 Ingress 的作用。

  6. Kubernetes 对有状态的组件支持,是通过 StatefulSet,挂接 Persistent Volumes,启动时重新构建相同状态的工作容器。而 Wildfly 中对状态的管理,包含 Stateful SessionBean, Servlet session 等等,都是通过 Infinispan 的分布式机制,复制状态到多个节点。而且还有一种远程 Infinispan 的配置方法,和 Kubernates 对状态的管理在逻辑上完全一致了。

  7. 对于 Master 主控节点的安全性管理,两者都有完备 RBAC 用户管理认证授权机制,以及完备的加密方式,密钥配置管理等功能。


Java EE 技术一直是一个完整的开发生态,同样,Kubernetes 也快速形成了更加庞大的生态体系,我们从其中一些对开发很重要的方面进行分析。


  1. JavaEE 有一套标准的打包方式,如构建 jar,组合成应用 war,进而打包成企业完整应用 ear。Kubernetes 是利用容器镜像,即 docker 的打包机制来管理容器。在 docker 之上,Kubernetes 提出 Pod 概念。对于整体的应用部署,目前 Kubernetes 社区提供了 helm 工具和 chart 包格式。当然也类似 yum 工具管理的 rpm 格式。

  2. Kubernetes 动态扩容,即 ReplicaSets 定义的创建特定数目的实例,可以说是 Kubernetes 最重要的特性之一。JavaEE 定义的 Stateless SessionBean,在应用服务器实现中,会创建一个池来实例化多个,虽然实例个数控制粒度没有那么细,但也是可以通过控制台来定义其实例数量的,实例池由容器来保证其可用实例数目。

  3. Kubernetes 用 ConfigMap 来定义配置信息,用 Secrets 来定义安全方面的配置信息。JavaEE 也有类似的定义,比如 Resource 和 Securtiy 方面的 annotation。在应用服务器扩展方面,Wildfly 可以自行定义 xml schema,提供友好可读的 xml 配置信息,以及 Security Domain/Realm 来定义安全方面的配置信息。

  4. 原 Coreos(后被红帽收购)定义的 Operator Framework(运维框架),基于 Kubernetes CRD(Custom Resource Definitions),定义了完整的一套打包,部署,管理应用的方法,有了这样的工具,第三方软件产品,可以用一种相对“标准”的方式提供容器化的产品。Custom Resource Definitions 是 Kubernetes 的扩展机制,可以预见 Kubernetes 三方扩展将会如雨后春笋般出现。对应的,Wildfly 有子系统(subsystem 扩展机制),可以在 Wildfly 服务器内核之上,开发子系统来扩展功能,Wildfly 所有的 Java EE 都是通过子系统方式实现的。它们都是通过扩展 Controller 的功能,把管理命令挂接到 API server 之上,设计思路惊人的一致!

  5. Wildfly 工作节点的管理,可以通过暴露信息发给主控节点,也可以利用 JMX,Java agent,Interceper 等方式来发送数据到分布式数据中心上(比如可以加载 jolokia),再用独立的或者统一的控制台来管理。同样的,Istio 项目,也是利用 sidecar 模式,在 pod 工作进程上,挂接一个 envoy 模块,由其完成流量分配,安全管理,policy 设置等功能,再由控制台统一管理。

  6. Kubernetes 被成为容器编排产品,所谓编排 (orchestration),就是把不同的应用运行组件,按照实现定义好的规则,根据其依赖性能够启动运行,并保证其运行健壮的能力。Java EE 各个规范间也有依赖性,比如 Webservice 依赖于 Servlet,Wildfly 有一个组件成为 DeploymentFramework,也是处理组件之间的依赖关系的,服务器会按照应用定义好的最终状态声明,按照自己的依赖性原则,逐个启动各个服务,保证应用最后可用。

技术差异

毕竟 Kubernetes 是演进后技术,具有大量新的特性:


  1. 存储方面的特性,Kubernetes 可以挂载各种存储,包括普通的文件系统,NFS,云端的 S3,开源存储方案 Ceph 等应有尽有。Wildfly 还是使用标准的操作系统的文件和目录。利用容器,Kubernetes 能更方便的对文件限额,资源使用量等进行定义和限制操作。

  2. 网络方面的特性,Wildfly 定义了网络接口配置属性,可以对网络 IP,端口,偏移值等进行设置。但这些和 Kubernetes 相比就是九牛一毛,Kubernetes 在 Service 层,就利用 iptables 等方法做网络请求的路由映射,而且商业 Kubernetes 产品都会加入 SDN(软件定义网络)的方案,网络管理成为应用体系重要的一部分。

  3. Kubernetes 中非常重要的组件是 scheduler 调度器,这个在 Wildfly 中没有功能完全一致的组件,因为企业应用的集群部署是按组整体部署的。Wildfly 提供了控制台工具来部署到不同的节点上,尽管这个过程可以自动化,甚至可以引入一些智能的成分来“调度”,但还是和 Kubernetes 提供的调度能力相差甚远。

  4. 对工作节点的管理的规模不同。企业应用服务器集群一般在数十台左右,和互联网动则成千上万的服务器差了几个数量级。对事务的一致性要求也是不同的,它们对于状态信息的分布式分发复制方式存在差别。

  5. 企业级应用服务器,应用上下文信息包含了事务,安全等信息,在线程间进行传递。而应用分布化后,微服务之间也要传递安全,事务等信息,就要用 OIDC/Jwt,TCC/Saga 等分布式方案。业务目标是一致的,但实现方法有很大差异,也对软件架构设计提出了非常高的要求。

总结和展望

毫无疑问 Kubernetes 已经赢得了容器之战,甚至取代 Docker 成为容器技术中最重要的开源产品。开发工程师和架构师也需要适应微服务化技术的变化,部署应用到云端上,这个趋势已经开始了。同时,Kubernetes 和其生态,对于应用开发和运维也提出更高的要求。企业在开发软件应用时,也要多方位考虑,包括应用复杂度,访问量,事务的要求,运维能力等。再选择技术方案和中间件产品 / 云计算平台。软件设计从来都没有银弹,最适合的才是最好的。


2019-08-28 14:4912740

评论

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

YonMaster开发者认证线上赋能培训班定档4月18日

YonBuilder低代码开发平台

好的测试数据管理,到底要怎么做?

禅道项目管理

测试 数据 数据管理

一文带你使用 Apache IoTDB 系统监控模块

Apache IoTDB

来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注

王吉伟频道

RPA 收购 机器人流程自动化 来也科技 Mindsay

聚焦供应链布局,新能源汽车企业重塑产业核心竞争能力

数商云

数字化转型 供应链 新能源汽车

thinkphp5框架新建页面相关规范详解

CRMEB

QIP 25周年

亚马逊云科技 (Amazon Web Services)

量子计算 量子技术 量子纠错

云图说丨叮咚,您有一份短信通关攻略待查收

华为云开发者联盟

短信 签名 消息 签名模板 MSGSMS

java高级用法之:JNA中的Function

程序那些事

Java Netty 程序那些事 4月月更

一文读懂 TsFile

Apache IoTDB

jackson学习之十(终篇):springboot整合(配置类)

程序员欣宸

Java web 4月月更

计算机存储层次简析

懒时小窝

计算机基础

WeTest平台产品&技术合作伙伴招募

WeTest

科创人·富士康CDO史喆:To B产品切忌臃肿,数字化不分对错只求更好

科创人

MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系

阿里巴巴云原生

知识管理的目的及意义——提高社会资源的配置效率

小炮

知识管理

易观分析:三大协会发声NFT,未来监管走向几何?

易观分析

区块链 NFT

2022年提高远程工作效率的三大实用技巧汇总

行云管家

远程办公 居家办公 办公软件

JS/TS项目里的Module都是什么?

华为云开发者联盟

js Module loaders bundlers

Prime Video 如何使用机器学习来确保视频质量

亚马逊云科技 (Amazon Web Services)

计算机视觉 Amazon Prime Video WACV

hyengine - 面向移动端的高性能通用编译/解释引擎

阿里巴巴终端技术

编译 移动端 引擎

教你用ab命令进行并发与压力测试

华为云开发者联盟

并发 压力测试 ab测试 ab命令 请求次数

免费下载|KubeMeet 城市站实录合辑,N 场容器开源分享打包看

阿里巴巴云原生

五大应用示范,为社区/企业防疫管理减负提效

明道云

“东数西算”超级工程利好云计算,多云管理背后却暗藏汹涌!

行云管家

云计算 多云 东数西算 云管

使用 Sanic 框架进行 Python Web 开发

宇宙之一粟

Python 4月月更 sanic

Redis是怎样通讯的?

ooooooh灰灰

redis 后端 协议 4月月更

【Zeekr_Tech】汽车软件RTOS-之AUTOSAR OS多核控制简介

Zeekr_Tech

Linux 软件架构

从容器化到资源池化,数栈云原生技术实践探索之路

袋鼠云数栈

大数据 flink 云原生 k8s

TASKCTL ETL作业类型的插件与维护管理

TASKCTL

kettle 元数据 ETL 自动化运维 调度任务

5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

MASA技术团队

C# .net 微软 测试 压测

Kubernetes,旧貌新颜?_容器_张建峰_InfoQ精选文章