From af6fa738b3d671cdb5ba7c2c01e9cae44dde0df7 Mon Sep 17 00:00:00 2001 From: faweizhao26 Date: Wed, 22 Jun 2022 16:16:14 +0800 Subject: [PATCH] add new case Signed-off-by: faweizhao26 --- content/zh/case/_index.md | 4 + content/zh/case/xdf.md | 200 ++++++++++++++++++++++++++++++++ static/images/case/logo-xdf.png | Bin 0 -> 27421 bytes 3 files changed, 204 insertions(+) create mode 100644 content/zh/case/xdf.md create mode 100644 static/images/case/logo-xdf.png diff --git a/content/zh/case/_index.md b/content/zh/case/_index.md index b870738a6..aca600eec 100644 --- a/content/zh/case/_index.md +++ b/content/zh/case/_index.md @@ -80,6 +80,10 @@ section2: content: "广西交科集团有限公司是一家在交通运输系统中具有重要影响力的高新技术企业,致力于为建设交通强国贡献智慧解决方案。" link: "gxjtkyy/" + - icon: "images/case/logo-xdf.png" + content: "新东方教育科技集团定位于以学生全面成长为核心,以科技为驱动力的综合性教育集团。" + link: "xdf/" + section3: title: 'KubeSphere 助力各行各业' tip: 全部 diff --git a/content/zh/case/xdf.md b/content/zh/case/xdf.md new file mode 100644 index 000000000..cd096ac96 --- /dev/null +++ b/content/zh/case/xdf.md @@ -0,0 +1,200 @@ +--- +title: xdf +description: + +css: scss/case-detail.scss + +section1: + title: 新东方教育科技集团 + content: 新东方教育科技集团定位于以学生全面成长为核心,以科技为驱动力的综合性教育集团。 + +section2: + listLeft: + - title: 公司简介 + contentList: + - content: 新东方教育科技集团定位于以学生全面成长为核心,以科技为驱动力的综合性教育集团。 + - content: 集团由 1993 年成立的北京新东方学校发展壮大而来,拥有短期培训系统、文化传播系统、咨询服务系统、科技产业系统等多个发展平台,打造了新东方学习成长中心、新东方国际教育、新东方大学生学习与发展中心、新东方在线、新东方前途出国、新东方国际游学、新东方满天星、新东方大愚文化等诸多知名教育品牌。 + - content: 作为中国著名私立教育机构,新东方教育科技集团于2006年9月7日在美国纽约证券交易所成功上市,2020 年 11 月 9 日在香港联合交易所成功二次上市。 + image: + + - title: 新东方有状态服务 In K8s 的现状 + contentList: + - content: 如图所示,上层 Pod 由自定义的 Operator 和 StatefulSet 控制器来托管,Pod 关联 PVC,PVC 绑定 PV,最下层是存储服务。 + - content: 最下层的存储服务包含本地存储和远端存储两类,对于一般的存储需求,首选是远端存储服务;而对于高性能 IO 的存储需求,那就要选择本地存储服务。目前,本地存储服务包含 K8s 原生 local 存储服务和自研的 xlss 存储服务 2 种。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-1.png + + - title: 原生 K8s 支撑有状态服务的能力 + contentList: + - content: 原生 K8s 支撑有状态服务的能力是有状态服务建设的基础,其管理模式是:StatefulSet 控制器 + 存储服务。 + - content: 由于虚拟机的账户密码每 3 个月就会更换一次,所以每次登录都需要先查表才能知道最新的密码,非常麻烦。另外,每次更换密码也都需要运维人员大量纯手工操作,极其耗费时间。开发人员上 + image: + - title: + contentList: + - specialContent: + text: StatefulSet 控制器 + level: 3 + - content: StatefulSet 控制器:用来管理有状态应用的工作负载 API 对象的控制器。管理某 Pod 集合的部署和扩缩,并为这些 Pod 提供持久存储和持久标识符。 + - content: StatefulSet 资源的特点: + - content: 稳定的、唯一的网络标识; + - content: 稳定的、持久的存储; + - content: 有序的、优雅的部署和缩放; + - content: 有序的、自动的滚动更新。 + - content: StatefulSet 资源的局限: + - content: 关于存储,StatefulSet 控制器是不提供存储供给的。 + - content: 删除或者缩容时,StatefulSet 控制器只负责 Pod; + - content: 人工要建一个无头服务,提供每个 Pod 创建唯一的名称; + - content: 优雅删除 StatefulSet,建议先缩放至 0 再删除; + - content: 有序性也导致依赖性,比如编号大的 pod 依赖前面 pod 的运行情况,前面 pod 无法启动,后面 pod 就不会启动。 + - content: 这 5 点局限可进一步概括为:StatefulSet 控制器管理 Pod 和部分存储服务(比如扩容时 pvc 的创建),其它的就无能为力。有序性引起的依赖性也会带来负面影响的,需要人工干预治愈。 + image: + - title: + contentList: + - specialContent: + text: 存储服务 + level: 3 + - content: 这是 CNCF 官网关于云原生存储的一副截图。截图时间是 2021 年 7 月初,有 50 多种存储产品,接近半数属于商业产品,开源产品多数都是远端存储类型,有支持文件系统的、有支持对象存储的、还有支持块存储的。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-2.png + - title: + contentList: + - content: 数据来源于官网,原生 K8s 支持的 PV 类型,有常用的 rbd、hostpath、local 等类型。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-3.png + - title: + contentList: + - content: 控制器只有 StatefulSet 控制器可使用,存储产品很多,PV 类型也不少,该怎么选择呢? + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-4.png + - title: + contentList: + - content: 选择存储产品,需要考虑哪些因素呢?新东方在选择存储产品时考虑了以下一些因素: + - content: 开源 VS 商业; + - content: 本地 VS 远端; + - content: 动态供给 VS 静态供给; + - content: 数据高可用方案。 + - content: 做选择是令人头疼的事情,比如选择开源,好处是不用花钱,但稳定性就很难保证,甚至提供的能力也有限;商业产品能力和稳定性有保证,但要付费。在这里先不下结论,最终还是要看需求。 + image: + + - title: 自研存储产品 XLSS + contentList: + - content: 新东方有状态服务建设的关键需求:良好的性能,支持 IO 密集型应用;数据可用性,具有一定的容灾能力;动态供给,实现有状态服务的完全自动化管理。 + - content: XLSS(XDF Local Storage Service)中文全称:新东方本地存储服务产品,是一种基于本地存储的高性能、高可用存储方案。可以解决 K8s 中本地存储方案的不足之处:localpv 只能静态供给;使用 localpv 时,pod 与 node 的亲和性绑定造成的可用性降低;本地存储存在数据丢失的风险。 + - content: 应用场景: + - content: 高性能应用,IO 密集型的应用软件,比如 Kafka + - content: 本地存储的动态化管理 + - content: 数据安全,应用数据定期备份,备份数据加密保护 + - content: 存储资源监控告警,比如 K8s Pv 资源的使用量监控告警 + image: + - title: + contentList: + - content: 如图所示,XLSS 在 K8s 中的运行状态是 Xlss 的 3 个组件以容器形式运行在 K8s 集群中,使用本地存储为有状态服务提供存储服务,并定期执行数据的备份作业,Xlss 会提供有关存储和相关作业的 metrics 数据。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-5.png + - title: + contentList: + - content: XLSS 核心组件介绍: + - content: xlss-scheduler:基于 kube-scheduler 的自定义调度器;对于有状态服务的 pod 的调度,自动识别 xlss localpv 的使用身份,智能干预 pod 调度,消除 pod 与 node 的亲和性绑定造成的可用性降低 + - content: xlss-rescuer:以 DaemonSet 资源类型运行在 k8s 集群中;按照数据备份策略,执行数据备份作业;监视数据恢复请求,执行数据恢复作业;提供 metrics 数据 + - content: xlss-localpv-provisioner:动态供给本地存储 + image: + - title: + contentList: + - content: xlss-scheduler 关键逻辑实现思路: + - content: 如图,这是 K8s 调度器的调度框架模型,在调度流程中包含了许多扩展点。xlss-scheduler 就是基于该调度框架模型,通过编写自定义的插件实现,主要在 3 个扩展点上做了增强: + - content: Prefilter:依据 Pod 的节点亲和性,分析亲和性节点的健康状态,若节点异常,对 Pod 设置特殊标记; + - content: Filter:针对设置特殊标记的 Pod,解除节点亲和性; + - content: Prebind:对设置特殊标记的 Pod,删除特殊标记,根据调度结果,发送数据恢复请求。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-6.png + - title: + contentList: + - content: xlss-rescuer 数据备份作业实现逻辑: + - content: 图中 3 个部分,左右各一个循环逻辑,中间通过一个缓存队列实现通信。左边的循环实现的功能:收集备份作业策略,并更新到缓存队列中。主要 3 步: + - content: 1. watch pod 事件; + - content: 2. 从 pod 注解当中获取备份策略,备份作业的配置信息是通过 pod 注解实现的; + - content: 3. 同步备份策略到缓存队列。 + - content: 右边的循环实现的功能:执行备份作业。也是 3 步: + - content: 1. 对缓存队列元素排序,排序按照下次备份作业的执行时间点进行升序排列; + - content: 2. 休眠等待,若当前时间还没有到最近的一个备份作业执行时间,就会进行休眠等待; + - content: 3. 执行备份作业。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-7.png + - title: + contentList: + - content: xlss-rescuer 数据恢复作业实现逻辑: + - content: 数据恢复作业流程和数据备份作业流程实现思路是类似的,但在具体实现逻辑上有所不同。左边的循环实现的功能:监视恢复作业请求,并更新到缓存队列中。主要 3 步: + - content: 1. watch CRD,监视数据恢复请求,接收 xlss-scheduler 发出的数据恢复请求(数据恢复请求以 CRD 方式实现); + - content: 2. 分析 CRD 状态,避免重复处理; + - content: 3. 同步恢复请求到缓存队列。 + - content: 右边的循环实现的功能:执行恢复作业。这里是 4 步: + - content: 1. 更新 CRD 实例状态; + - content: 2. 恢复快照数据到指定目录; + - content: 3. 更新 PV 与 PVC; + - content: 4. 删除 CRD 实例 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-8.png + - title: + contentList: + - content: xlss-localpv-provisioner 存储创建实现思路: + - content: xlss-localpv-provisioner 组件,其功能比较专一,实现本地存储的动态创建。其工作流程当 provisioner pod 获取到创建存储的请求时,首先会创建一个临时的 helper pod,这个 helper pod 会被调度到指定的 node 上面,创建文件目录作为本地存储使用,这就完成了 pv 实际后端存储的创建,当存储创建完毕,provisioner pod 会将这个 helper pod 删除。至此,一次本地存储的动态创建完成。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-9.png + - title: + contentList: + - content: xlss 自动灾难恢复工作流程: + - content: 完整的自动灾难恢复工作流程要经历 6 个阶段: + - content: 1. 数据备份:以 pod 为粒度,对 pv 数据进行备份; + - content: 2. 节点异常:此时集群出现异常情况,某一节点发生异常,比如服务器损坏,引起在其上面的 pod 工作异常,最后有状态服务的 pod 就会一直处于 Terminating 状态; + - content: 3. 异常 pod 处理:当有状态服务的 pod 处于 Terminating 状态时,要清理掉这些 pod,可以手动删除,也可借助工具,让这些有状态的 pod 有重新创建的机会; + - content: 4. 智能调度 :解除亲和性,将新 pod 调度到健康的节点上; + - content: 5. 数据恢复:拉取该 pod 对应的最新的快照数据进行数据恢复; + - content: 6. 服务恢复:启动应用,对外提供服务。 + - content: 至此,一个完整的自动灾难恢复工作流程结束,最后又回到起点。 + image: + + - title: 大规模存储型中间件服务 + contentList: + - content: Kafka Cluster In K8s: + - content: 以 kafka 集群为例,通过定制化的 kafka operator 来部署 kafka 集群,指定存储服务使用 xlss 存储。采取定制化 Operator + xlss 模式去建设存储型中间件服务。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-10.png + - title: + contentList: + - content: 有状态中间件服务 In K8s: + - content: 有状态中间件服务在 K8s 中的运行状态如上图所示,这些存储型中间件服务集群托管于对应的 Operator,底层存储根据业务需要适配各类存储。随着中间件服务集群规模的日益扩大,我们建设了 PaaS 控制面,用户可以通过该控制面来管理运行在 K8s 中的各类中间件服务集群。控制面可以直接和 apiserver 交互,用户通过控制面增删改 CRD 资源,Operator 根据 CRD 资源的最新状态,调和中间件服务集群的状态。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-11.png + - title: + contentList: + - content: 用户申请中间件服务示例: + - content: 这是用户申请中间件服务的示例:用户通过管理台申请服务,填写相关的配置信息后,申请通过后,就可以在 K8s 集群里面创建相应的服务了。 + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-12.png + + - type: 1 + contentList: + - content: 降低开发人员使用 Kubernetes 的门槛 + - content: 提高了服务打包部署效率 + - content: 提高了系统可观测性能力 + + - title: 基于 KubeSphere 部署 XLSS + contentList: + - content: 若是首次部署,首先要做好本地磁盘的规划,创建好提供给 xlss 使用的存储空间。然后,就是将 xlss 的各个组件运行到 K8s 集群中。将 xlss 组件部署到 K8s 集群中,我们借助了 KubeSphere 的 CI/CD 流水线。自定义流水线一共 5 步,实现将 xlss 组件从静态代码到运行在 K8s 中的容器的转换,高度自动化维护。 + - content: CI/CD 流水线如下图所示: + image: https://pek3b.qingstor.com/kubesphere-community/images/xdf-13.png + + - type: 2 + content: 'Kubesphere 帮助我们简化了多集群管理,服务发布效率得到大幅提升,监控日志集中管理,让集群排障不再是黑盒。' + author: '新东方' + + - title: Road Map + contentList: + - content: 第一阶段:“云前时代”。有状态服务容器化的起点,确定了容器化的目标。这个阶段有状态服务主要特征是 VM+PaaS 组合的模式管理有状态服务。实现的主要功能:资源管理、白屏运维、简单调度策略、运行时管理。 + - content: 第二阶段:“初上云端”。从这个阶段开始,尝试将有状态服务从 VM 中解脱出来,迁移到 K8s 平台。这个阶段有状态服务主要特征是 K8s+Operator 组合的模式管理有状态服务。这时,运行时被托管到 K8s,有状态服务由 Opeartor 接管,自动化程度显著提高。此时也暴露出一些不足:比如远端存储的性能不够好,本地存储的可用性不能保证。 + - content: 第三阶段:“自研之路”。主要是新东方自研 xlss 的实践阶段,前面章节已有涉及。此阶段有状态服务建设的典型特征:Scheduler + Logical Backup 组合模式。这基本达到了我们期望的:本地存储 + 动态供给 + 数据可用性保证。 + - content: 第四阶段:“追求卓越”。在这个阶段,有状态服务建设的典型特征:Isolation + Physical Backup 组合模式。重点会解决第三阶段发现的瑕疵。大致的解决思路是:利用 LVM 技术实现存储的隔离;利用 DRBD 技术,增加 DRBD 同步物理备份能力,实现应用数据的同步实时备份,解决由于数据量大导致恢复时间增长的问题。在使用 DRBD 技术时,有一个需要权衡的地方,那就是副本数量的设置。若副本数量设置多些,则会增大存储资源使用量;若副本数量设置少些,在 K8s 集群 node 异常情况下,有状态服务 Pod 漂移可选择的 node 数量就会减少。最终需要根据业务场景做出合理选择。 + image: + + rightPart: + icon: /images/case/logo-xdf.png + list: + - title: 行业 + content: 教育 + - title: 地点 + content: 中国 + - title: 云类型 + content: 私有云 + - title: 挑战 + content: 一站式服务生命周期管理,集群运维管理 + - title: 采用功能 + content: DevOps、日志、监控、多集群管理 +--- diff --git a/static/images/case/logo-xdf.png b/static/images/case/logo-xdf.png new file mode 100644 index 0000000000000000000000000000000000000000..bc02fb18ce3be69fd96460ddb81b7337af801835 GIT binary patch literal 27421 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 bKOX>+LSm$=dSw4ygay!2(|cYIvW@;fuqq!W literal 0 HcmV?d00001