摘要:在华为开发者大会(Cloud)2021上,工商银行Paas云*台架构师沈一帆发表了《工商银行多k8s集群管理及容灾实践》主题演讲,分享了工商银行使用多云容器编排引擎Karmada的落地实践过程。

本文分享自华为云社区《Karmada | 工商银行多k8s集群管理及容灾实践》,原文作者:技术火炬手。

在华为开发者大会(Cloud)2021上,工商银行Paas云*台架构师沈一帆发表了《工商银行多k8s集群管理及容灾实践》主题演讲,分享了工商银行使用多云容器编排引擎Karmada的落地实践过程。

演讲主要包含4个方面的内容:

  • 1)工行云*台现状
  • 2)业界多集群管理方案及选型
  • 3)为什么选择Karmada?
  • 4)落地情况及未来展望

工行云计算的业务背景

*几年互联网的崛起,对金融行业的金融模式及服务模式都产生了巨大的冲击,这令我们不得不做出一些巨大的革新。同时从现在的角度来看,银行业务系统入云已是大势所趋,截止目前,工商银行已形成了以基础设施云、应用*台云、金融生态云以及比较有工行特色的分行云4个模块,组成了我们整体的云*台架构。

工商银行云*台的整体架构

工行云*台技术栈

采用了业界比较领先的云产品和主流开源技术,在此基础上结合了我们一些金融的业务场景,进行了深度化定制。

  • 基础设施云:基于华为云Stack8.0产品结合运营运维需求进行客户化定制,构建新一代基础设施云。
  • 应用*台云:通过引入开源容器技术Docker、容器集群调度技术Kubernetes等,自主研发建设应用*台云。
  • 上层应用方案:基于HaProxy、Dubbo、ElasticSerch等建立负载均衡、微服务、全息监控、日志中心等周边配套云生态。

工行金融云成效

在容器云方面,工行的金融云成效也是非常大的,首先体现在它的入云规模大,截至目前应用*台云容器规模超20万,业务容器占到55,000个左右,整体的一些核心业务都已入容器云内部。除了在同业的入云规模最大之外,我们的业务场景涉及非常广泛,一些核心的应用,核心的银行业务系统,包括个人金融体系的账户,快捷支付、线上渠道、纪念币预约等,这些核心的业务应用也已容器化部署;另外,我们的一些核心技术支撑类应用如MySQL,还有一些中间件以及微服务框架,这一类核心支撑类应用也已入云;此外,一些新技术领域,包括物联网、人工智能、大数据等。

当越来越多的核心业务应用入云之后,对我们最大的挑战是容灾以及高可用,在这方面我们也做了很多实践:

1)云*台支持多层次故障保护机制,确保同一业务的不同实例会均衡分发到两地三中心的不同资源域,确保单个存储、单个集群甚至单个数据中心发生故障时,不会影响业务的整体可用性。

2)在故障情况下,云*台通过容器重启及自动漂移,实现故障的自动恢复。

在整体容器云实践下,我们也遇到了一些问题,其中比较突出的是 pass层容器层的多集群的现状。现在工行内部整体的k8s总数,k8s集群的总数已*百个,主要的原因有4个:

1)集群种类多:刚刚也说了我们的业务场景非常的广泛,比如GPU要有不同支持GPU的设备,一些中间件,数据库它对底层的网络容器存储的需求是不同的,那势必会产生不同的解决方案,因此我们需要为不同的业务场景定制不同集群。

2)受到k8s本身性能的限制,包括scheduler、 etcd 、API server等一些性能瓶颈,每一个集群也有它数量的上限。

3)业务扩展非常快。

4)故障域分区多,我们两地三中心的架构至少有三个DC,每个DC内部还有不同的网络区域,通过防火墙进行隔离, 这样的倍乘关系,中间就会产生很多集群故障域的分布。

基于以上4点,针对当前的现状,我们现有的解决方案还是依靠容器云的云管*台,通过云管*台管理这些多k8s集群,另外上层的业务应用需要自主选择它的集群,包括它需要的偏好、网络、区域等,去选择它具体的某一个k8s集群。在选择到k8s集群之后,我们内部是通过故障率进行自动打散的调度。

但现有的解决方案对上层应用还是暴露出非常多的问题:

1)对上层应用来说,它可能上了容器云比较关心的一个部分,就是我们具有在业务峰值的过程中自动伸缩的能力,但自动伸缩现在只是在集群内部,没有整体的跨集群自动伸缩的能力。

2)无跨集群自动调度能力,包括调度的能力可能都是在集群内部,应用需要自主的选择具体的集群

3)集群对上层用户不透明

4)无跨集群故障自动迁移能力。我们还是主要依靠两地三中心架构上副本的冗余,那么在故障恢复的自动化恢复过程中,这一块的高可用能力是有缺失的。

业界多集群管理方案及选型

基于目前的现状,我们定下了一些目标,对业界的一些方案进行整体的技术选型,总共分为5个模块:

为什么希望它是一个具有一定社区支持度的开源项目,主要是三点的考虑:

  • 1)希望整体方案是企业内部自主可控的,这点也是开源的一大益处
  • 2)不希望花费更多的能力
  • 3)为什么不把调度以及故障恢复的能力全部集成到刚刚的云管*台。这部分是我们希望整体的多集群管理模块,从云管*台中隔离出来,下沉到下面的一个多集群管理模块。

基于以上这些目标,我们进行社区解决方案的一些调研。

Kubefed

我们调研的第一个是之前比较火的一个集群联邦federation项目, federation整体是分v1和v2的版本,我们去调研的时候,那个时候已经主要是v2也就是Kubefed。

Kubefed本身也能解决一部分问题,它具有集群生命周期管理、Override以及基础调度的能力,但对我们来说它有几点致命的硬伤,目前还无法满足我们的需求:

1)调度层面是非常基础的一个调度能力,他们也不准备在调度方面花费更大的精力支持自定义调度,不支持按资源余量调度。

2)第二点也是比较为人所诟病的,它本身不支持原生k8s对象,我要在它的管理集群中使用它新定义的CRD,对于我们已经使用了这么久的k8s原生资源对象的上层应用,云管*台本身对接API方面,我们也需要重新进行开发,这部分成本是非常大的。

3)它基本不具备故障自动迁移能力

RHACM

我们调研的第二个项目是RHACM,该项目主要由红帽和 IBM主导,整体调研下来,发现它的功能是比较健全的,包括我们刚刚所提的能力也是具备的,而且它上层应用application层对于对用户那一层的能力比较靠*云管*台这样一个定位,但它仅仅支持Openshift,对于我们已经存量有这么多的k8s集群来说,改造成本非常大,而且太重了。而在我们进行研究的时候,它还没有开源,社区的整体支持力度是不够的。

Karmada

当时我们和华为交流到了多集群管理的一个现状以及痛点,包括对社区联邦类项目的讨论,我们双方也非常希望能够在这方面革新,下图为Karmada的功能视图:

Karmada功能视图

从它整体功能视图及规划来看,和我们上文提到的目标非常契合,它有集群整体的生命周期管理、集群注册、多集群伸缩、多集群调度、整体统一的API、底层标准API支持,它都是CNI/CSI在它整体功能视图里,包括上层的应用、对Istio、Mash、CI/CD等都有整体规划上的考虑。因此基于整体思路,它的功能与我们非常契合,工行也决定投入到这个项目中来,跟华为和我们很多的项目伙伴共建Karmada项目,并把它回馈到我们社区整体。

为什么选择Karmada

技术架构

在我个人的理解上,它有以下优势:

1)Karmada以类k8s的形式部署,它有API Server、Controller Manager等,对我们已经拥有存量那么多k8s集群的企业来说,改造成本是比较小的,我们只需在上面部署一个管理集群即可

2)Karmada-Controller-Manager管理包括cluster、policy、binding、works等多种CRD资源作为管理端资源对象,但是它没有侵入到原生的我们想要部署的那些k8s原生资源对象。

3)Karmada仅管理资源在集群间的调度,子集群内分配高度自治

Karmada整体的Resources是如何进行分发的?

  • 第一步,集群注册到Karmada
  • 第二步,定义Resource Template
  • 第三步,制定分发策略Propagation Policy
  • 第四步,制定Override策略
  • 第五步,看Karmada干活

下图为整体的下发流程:

当我们定义了deployment之后,它通过 Propagation Policy进行匹配,然后它就会产生一个绑定关系,就是Propagation Binding,然后再通过一个 override的一个policy,就产生了每一个works。这个works其实就是在子集群中各个资源对象的一个封装。在这里我觉得比较重要的是propagation以及workers机制。

Propagation机制

首先我们定义的是 Propagation的Policy,可以看到整体yaml得话,我们先定了一个比较简单的策略,选择了一个cluster,它叫member 1; 第二个就是我需要这条策略到底匹配哪些K8s resource template,它匹配的是我们定义了一个namespace为default的nginx deployment。它除了支持Cluster的亲和性之外,还支持集群容忍,按集群标签、故障域分发。

当定义完Propagation Policy之后,之前定义的想要下发的K8s resource template会自动跟它进行匹配,匹配之后,deployment会被分发到比如说ABC三个集群,这样就跟ABC三个集群产生了绑定,这个绑定关系就是Resource Bindding。

Resource Bindding整体的yaml可能就是你选择的一个cluster,在这里就是member 1这样一个cluster,现在整个Resource Bindding是支持cluster和namespace两种级别的,这两种级别相当于对应了不同的场景,namespace级别是当一个集群内部是用namespace做租户隔离时,可能Resource Bindding用的namespace的 scope。还有一个cluster场景,就是整个子集群都是给一个人用的,给一个租户用的,我们直接用Cluster Resource Bindding绑定即可。

Work机制

在我们已经建立了Propagation Bindding之后,那work是怎么进行分发的?

当Propagation Bindding产生了之后,比如产生了ABC三个集群,这里的1:m就是指这三个集群。找到这三个集群之后,Bindding Controller就会工作,然后去产生基于 resource template以及你的绑定关系,去产生具体的works对象,works对象整体就是具体的子集群中resource的封装,那么同时 works 的一个status有一个子集群resource的反馈,可以看到整个work yaml,可以看到manifests下面就是整体的一个子集群,具体已经override过,具体要分发到子集群里面的整体的一个deployment yaml都在这里了,所以说它只是一个resource的封装。

Karmada优势

工行在具体使用与验证之后,发现Karmada有以下几点优势:

1)资源调度

  • 自定义跨集群调度策略
  • 对上层应用透明
  • 支持两种资源绑定调度

2)容灾

  • 动态binding调整
  • 按照集群标签或故障域自动分发资源对象

3)集群管理

  • 支持集群注册
  • 全生命周期管理
  • 统一标准的API

4)资源管理

  • 支持k8s原生对象
  • works支持子集群资源部署状态获取
  • 资源对象分发既支持pull也支持push方式

Karmada在工行的落地情况及对未来展望

首先我们看下Karmada其中的两个功能怎么去纳管集群和资源下发?

目前为止工行的测试环境中Karmada已经对存量集群进行了一些纳管,在对未来规划方面,一个比较关键的点是如何跟我们整体云*台进行集成。

云*台集成

在这方面我们希望之前提到的多集群管理、跨集群调度、跨集群伸缩、故障恢复以及资源整体视图方面都全部下沉到Karmada这样一个控制*面。

对于上层的云管*台,我们更注重它对用户业务的管理,包括用户管理、应用管理、进项管理等,也包括由Karmada衍生出来的比如说Policy定义在云*台上。上图比较简略,具体的云*台可能还要连一根线到每一个k8s集群,比如pod在哪个node上,Karmada的*面可能是不关心的,但具体要知道pod位置类的信息,可能还要从k8s的子集群获取,这个也可能是我们后面集成中需要去解决的问题,当然这也是符合Karmada本身的设计理念,它是不需要关心具体的pod在k8s子集群的哪个位置。

未来展望1-跨集群调度

对于跨集群调度方面,Karmada已经支持了上文提到的故障域打算、应用偏好、权重对比。但是我们希望它也能够根据集群的资源与量去进行调度,这样不会产生各个子集群当中资源不均衡的状态。虽然它暂时是没有实现的,但它的一个CRD叫cluster, cluster有一个状态信息,这个状态信息里面会去收集node ready的状态, node上剩余的Allocatable,就是CPU内存的剩余信息。其实有了这些信息之后,我们再做自定义调度,完全是规划中的一个事情。

整体的调度设计完之后,我们希望在工行产生的效果如下图,当我调度 deployment A时,它是因为偏好的设置调度到cluster 1; deployment B因为一个故障域打散,它可能调度到了cluster 123三个集群;deployment C也是一个故障域打散,但是因为资源余量的原因,它多余的pod被调度到了cluster 2这样一个集群。

未来展望2-跨集群伸缩

跨集群伸缩现在也是在Karmada规划当中,现在我们可能还是需要解决一些问题:

1)考虑它跨集群伸缩和子集群伸缩之间的关系,因为现在往往我们上层业务应用配置的是单个集群伸缩的策略,那么整体跨集群的策略与子集群伸缩策略都配置时,它们之间的关系,到底是上层整体去做管理,还是有优先级,这可能是我们后面需要考虑的。

2)跨集群伸缩和跨集群调度间的关系,我觉得整体上还是以一个调度器为准。我的一个Multi-cluster仅仅负责伸缩的部分,比如到达了多少CPU、多少的内存,比如说70% -80%的时候去进行伸缩,伸缩到多少个,具体的调度还是由整体scheduler去进行。

3)需要汇聚各个集群的metric,包括可能有一些性能瓶颈,它整体的工作模式,是需要我们后续去考虑的。

未来展望3-跨集群故障恢复及高可用

1)子集群健康状态的判断策略:可能只是与管理集群失联,子集群本身业务容器均无损

2)自定义的故障恢复策略:Like RestartPolicy,Always、Never、OnFailure

3)重新调度和跨集群伸缩的关系:希望它多集群的调度是整体的一个调度器,而伸缩控制好它自己伸缩的一个策略即可。

整体对我们工行的一些业务场景而言,Karmada现在的能力及以后的规划,可预见应该都是能解决我们业务场景痛点的。很高兴有机会能够加入到Karmada项目,希望有更多的开发者能够加入Karmada,与我们共建社区,共建这样一个多云管理的新项目。

附:Karmada社区技术交流地址

项目地址:https://github.com/karmada-io/karmada
Slack地址:https://karmada-io.slack.com

点击关注,第一时间了解华为云新鲜技术~

工商银行:应用多k8s集群管理及容灾实践的更多相关文章

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

    k8s 集群管理和微服务 适合做啥 都知道k8s是集群 适合微服务 有很多教程 但你可以先了解他能干啥 traefix 是负载均衡工具 k8s 适合部署无状态依赖的微服务 可以按需求开启多个微服务 管 ...

  2. 整理全网最全K8S集群管理工具、平台

    整理常见的整理全网最全K8S集群管理工具.平台解决方案. 1 Rancher Rancher中文官网:https://docs.rancher.cn/ 2 KubeSphere 官网:https:// ...

  3. 主从集群搭建及容灾部署redis

    redis主从集群搭建及容灾部署(哨兵sentinel) Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主 ...

  4. 强大多云混合多K8S集群管理平台Rancher入门实战

    @ 目录 概述 定义 为何使用 其他产品 安装 简述 规划 基础环境 Docker安装 Rancher安装 创建用户 创建集群 添加Node节点 配置kubectl 创建项目和名称空间 发布应用 偏好 ...

  5. 近万字案例:Rancher + VMware PKS实现全球数百站点K8S集群管理

    Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的.基于云的技术平台,以更好地应对业务挑战.曾连续3年提名CRN,并且在2012 ...

  6. NVIDIA-GPU归入K8S集群管理的安装文档--第二版

    一,nvidia K80驱动安装 1,  查看服务器上的Nvidia(英伟达)显卡信息,命令lspci |grep NVIDIA 2,  按下来,进行显卡驱动程序的安装,驱动程序可到nvidia的官网 ...

  7. 多k8s集群管理

    多集群的切换是K8s运维中比不可少的问题,常见的基于多个集群进行切换的方法有三种: 切换config文件 通过context进行集群切换 用kubecm进行集群切换 切换config文件 我们先看看放 ...

  8. elasticsearch集群扩容和容灾

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.集群健康 Elasticsearch 的集群监控信息 ...

  9. Redis Sentinel集群双机房容灾实施步骤

    概要目标防止双机房情况下任一个机房完全无法提供服务时如何让Redis继续提供服务.架构设计A.B两机房,其中A机房有一Master一Slave和两个Sentinel,B机房只有2个Sentinel,如 ...

  10. redis主从集群搭建及容灾部署(哨兵sentinel)

    Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...

随机推荐

  1. Hyper-V 下的 Debian 双网卡配置

    Debian 双网卡配置 因为 Hyper-v 不能在 Hyper-v Manger 里设置网卡的静态 IP, 而每次开机自启之后又要连接 Debian 虚拟机,所以使用了双网卡. 双网卡分为内网网卡 ...

  2. 运行 Python 脚本/代码的几种方式

    哈喽大家好,我是咸鱼 我们知道,python 脚本或者说 python 程序其实是一个包含了 python 代码的文件.要让它们实现特定功能,我们需要知道该如何运行(run)它 通过运行 python ...

  3. QT编程过程中遇到的问题

    QT编程过程中遇到的问题 (一)QT卡死 (二)mingw转msvc编码问题 (三)内存泄漏问题 1. vld检查内存泄漏问题 2. QTextEdit造成内存泄漏 (end)后面会更新 (一)QT卡 ...

  4. mybatis 操作 mysql 动态创建数据表

    Map 数据一般是根据需求生成的,例如 map.put("ticketId",176),map.put("ticketName","测试工单" ...

  5. JVM-Java虚拟机是怎么实现synchronized的?

    1. JVM的锁优化 今天我介绍了 Java 虚拟机中 synchronized 关键字的实现,按照代价由高至低可分为重量级锁.轻量级锁和偏向锁三种. 重量级锁会阻塞.唤醒请求加锁的线程.它针对的是多 ...

  6. Java IO教程- Java文件

    创建文件 我们可以从中创建一个 File 对象 路径名 父路径名和子路径名 URI(统一资源标识符) 我们可以使用File类的以下构造函数之一创建一个文件: File(String pathname) ...

  7. PZthon

    一道新式题目,python.exe的分析 这个时候没有思路不要紧,直接wp 先用特别的软件执行.exe程序,就是对.exe进行反编译 然后在反编译脚本的目录写就有了一个打包文件夹 在里面找到文件的.p ...

  8. 高效的 Json 解析框架 kotlinx.serialization

    一.引出问题 你是否有在使用 Gson 序列化对象时,见到如下异常: Abstract classes can't be instantiated! Register an InstanceCreat ...

  9. 吉特日化MES系统&各类化妆品检验标准汇总

    在日化行业中,生产配料过程中,对产品的检验主要分为四大类: (1) 感官指标 (2) 理化指标 (3) 微生物指标 (4) 毒理指标 根据每个产品的不同,其指标会有所不同

  10. cocos2d-Js 各类碰撞检测

    这里总结一下点.圆.矩形之间的简单碰撞检测算法(矩形不包括旋转状态) 点和圆的碰撞检测: 1.计算点和圆心的距离 2.判断点与圆心的距离是否小于圆的半径 isCollision: function(p ...