From 4bd331d0a29287dbbebe1eb88d1dc5cab37764b9 Mon Sep 17 00:00:00 2001 From: faweizhao26 Date: Wed, 13 Apr 2022 16:49:12 +0800 Subject: [PATCH] add new case of turing Signed-off-by: faweizhao26 --- content/zh/case/_index.md | 12 ++- content/zh/case/turing.md | 147 +++++++++++++++++++++++++++++ static/images/case/logo-turing.png | Bin 0 -> 8639 bytes 3 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 content/zh/case/turing.md create mode 100644 static/images/case/logo-turing.png diff --git a/content/zh/case/_index.md b/content/zh/case/_index.md index 772d52e65..ac1209d85 100644 --- a/content/zh/case/_index.md +++ b/content/zh/case/_index.md @@ -39,15 +39,15 @@ section2: - icon: "images/case/section6-zto.png" content: "中通快递创建于 2002 年,是一家以快递为核心业务,集跨境、快运、商业、云仓、航空、金融、智能、传媒、冷链等生态版块于一体的综合物流服务企业。" link: "zto/" - + - icon: "images/case/section6-hongya.png" content: "红亚科技成立于 2012 年,是一家聚焦信息技术发展,为教育从业者提供优质教育服务的创新型科技公司。" link: "hongyaa/" - + - icon: "images/case/chinamobile-iot.png" content: "中移物联网有限公司是中国移动通信集团有限公司的全资子公司,是中国移动在物联网领域的主责企业。" link: "chinamobile-iot/" - + - icon: "images/case/uisee.png" content: "驭势科技 UISEE 是中国领先的自动驾驶公司,致力于为全行业、全场景提供 AI 驾驶服务,交付赋能出行和物流新生态的 AI 驾驶员。" link: "uisee/" @@ -59,11 +59,15 @@ section2: - icon: "images/case/segmentfault-logo.png" content: "SegmentFault 思否是国内领先的新一代开发者社区和技术媒体,是中国最大的 Hackathon 组织者,目前已覆盖和服务上千万中国软件开发者和 IT 信息从业者。" link: "segmentfault/" - + - icon: "images/case/logo-msxf.png" content: "马上消费金融股份有限公司(简称“马上消费”)是一家经中国银保监会批准,持有消费金融牌照的科技驱动型金融机构。" link: "msxf/" + - icon: "images/case/logo-turing.png" + content: "图菱(成都)科技有限公司成立于 2020 年,主要的业务是为互联网在线模版网站提供模版输出以及系统化解决方案。" + link: "turing/" + section3: title: 'KubeSphere 助力各行各业' tip: 全部 diff --git a/content/zh/case/turing.md b/content/zh/case/turing.md new file mode 100644 index 000000000..e8ef3c0cb --- /dev/null +++ b/content/zh/case/turing.md @@ -0,0 +1,147 @@ +--- +title: qunar +description: + +css: scss/case-detail.scss + +section1: + title: 图菱科技 + content: 图菱(成都)科技有限公司成立于 2020 年,主要的业务是为互联网在线模版网站提供模版输出以及系统化解决方案。 + +section2: + listLeft: + - title: 公司简介 + contentList: + - content: 图菱(成都)科技有限公司成立于 2020 年,创始人团队有丰富的创业经验。图菱科技主要的业务是为互联网在线模版网站提供模版输出以及系统化解决方案。目前已与多家互联网模版公司签署了正式的商务合同。我们建立了标准化的模版输出体系和人力模型,为大量客户解决批量化输出的问题。我们需要大量的优秀的设计人员加入我们团队,我们会为优秀的人员提供高于业界标准的薪资待遇。给予更广阔的发展空间。并能够锻炼设计人员的管理能力。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-1.png + + - title: 背景介绍 + contentList: + - content: 早在 2020 年之前,公司 IT 团队规模比较小,开发还要兼职运维测试。发展初期,基本上由业务驱动开发。基于资源方面因素,所以在系统架构上首先是满足功能使用,快速开发推出产品,系统架构建设也是基于阿里云一步步从单体到多模块,再到微服务做演进。 + - content: 公司初期业务方向是印刷类商品的私人订制,满足个性化的输出的移动端应用,配套生产的供应的订单管理系统,同时涉及到旅行行业,为旅行社提供定制线路设计的 SaaS 系统,模板海报的输出系统,以及图库等旅行社所需要的素材资源。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-2.png + + - title: 业务痛点 + contentList: + - content: 经过几年发展,业务系统服务开始增多,基础技术架构难以应付业务的快速变化,研发团队也亟需合理的开发流程来支持后续管理。我们将主要面临困难进行了梳理,大致有以下几点: + - content: 开发环境和生产环境不一致:在项目迭代过程中,有时出现开发环境和生产环境配置不一致的问题,导致生产系统和业务问题不一致; + - content: 无统一发布管理系统:初期由于各方面管理粗犷,缺乏自动化构建系统,版本功能完后,开发需要专门手动编译,打包上线发布,过程复杂还不好管理; + - content: 资源协调:虽然业务系统已经采用 SpringCloud 整体微服务化,但各个服务资源的分配却无法协调。印刷服务在生成印刷文件时需要占用系统资源比普通业务系统高几倍,但又不是实时需要。之前都是专门用一台机器来做,但其实这种不太灵活。所以亟需能自动扩缩容的方案。 + image: + + - title: 方案选型 + contentList: + - content: 基于上述的痛点,结合自身业务系统,准备进行容器化改造。 + - content: 最开始接触 Kubernetes 时了解到官方提供的管理平台,通过调研和尝试了下后发现它只是管理 Kubernetes 容器的基本信息,并不是简单将业务放上去就能开箱即用,而涉及业务上的日志平台,监控系统,链路最终等基础运维体系还需自己去引入管理,最后还是通过朋友公司他们的一些经验建议使用一些集成的平台解决方案,类似 Rancher, KubeSphere 等。 + - content: 经过对比后决定采用 KubeSphere,主要基于以下几点: + - content: Kubernetes 这块全新的知识体系要掌握达到生产落地学习时间成本较高,对于我们应用性企业需要的是能简单上手的产品; + - content: Rancher 侧重于运维管理,学习成本相对较高;KubeSphere 偏向与业务应用为中心,更符合我们公司情况; + - content: Rancher 需要自己部署 Jenkins 等插件;KubeSphere 在一些组件整合上做的较好,比如 DevOps 能做到开箱即用。而发布部署是我们目前最迫切需要的; + - content: KubeSphere 是由国内青云科技推出的产品,使用更符合国人习惯,而且完全开源。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-5.jpeg + + - title: 实践过程 + contentList: + - specialContent: + text: 已有硬件资源 + level: 3 + - content: 公司整个业务基础设施构建在阿里云上,包括 ECS、数据库和 OSS 存储等。 + - content: P6 台 ECS 分布如下: + - content: ECS-1~ECS-4:业务服务 + - content: ECS-5:测试机器。 + - content: ECS-6:公司内部项目管理,包括 Bug 管理,Git 等。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-6.jpeg + - title: + contentList: + - specialContent: + text: 主要实施步骤 + level: 3 + - content: 1. 搭建镜像仓库:在 ECS-6 上,搭建 Harbor 仓库。提供公司业务容器应用的私有镜像管理工具。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-7.png + - title: + contentList: + - content: 2. 构建业务系统镜像:对每个业务服务添加相应配置文件 Dockerfile, 用于平台流水线发布时构建镜像。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-8.png + - title: + contentList: + - content: 3. 准备系统环境 + - content: 系统环境主要是 Kubernetes 搭建,这里主要考虑存储和网络选型。 + - content: 存储:最开始考虑使用 Ceph,搭建 demo 使用后发现,如果和 Kubernetes 搭建于同一集群环境,对资源还是有一定消耗。基于目前业务设计(基本上没有有状态服务需要涉及)、以及当前业务体量,最终采用相对轻量的 NFS 共享盘方式。 + - content: 网络:Kubernetes 主流的网络插件目前主要有 Calico 和 Flannel,我们参考社区的经验,最终选择了 Calico。 + image: + - title: + contentList: + - content: 4. 安装 KubeSphere 平台 + - content: KubeSphere 平台是按照官网提供的文档基于 Kubernetes 搭建的。我们先最小化搭建,然后在使用的过程中再根据需要开启一些所需组件。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-9.png + - title: + contentList: + - content: KubeSphere 平台在插件安装这块的体验比较好,只需要对配置文件相应做调整就能很容易实现。比如日志平台默认由 Elasticsearch 做存储,但我们已经自建有 Elasticsearch 集群,只需要调整 ks-installer 配置。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-10.png + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-11.png + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-12.png + - title: + contentList: + - specialContent: + text: DevOps 实践 + level: 3 + - content: CI/CD 发布流程是这次改造的重点。 + - content: DevOps 项目是 KubeSphere 中的一个可插拔组件,提供了基于 Jenkins 的 CI/CD 流水线,支持自动化工作流,包括 Binary-to-Image (B2I) 和 Source-to-Image (S2I) 等。 + - content: KubeSphere DevOps 提供了开箱即用的 CI/CD 流水线,并通过图形化方式降低了学习门槛,我们就直接对官网的示例进行改造,采用配置文件基于流水线 Pipleline 构建和发布。 + image: + - title: + contentList: + - content: 1. 环境区分:我们的环境对应的是 KubeSphere 中的项目,通过在流水线中指定对应配置文件区分。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-13.png + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-14.png + - title: + contentList: + - content: + - content: 2. 前端 Node 环境指定:由于 KubeSphere 平台默认提供的 Node.js 版本和我们所需版本有差异,所以结合自己经验对平台 Node.js 环境通过 Jenkins 插件方式进行了修改,后续流水线中指定对应版本即可。这种方式稍显麻烦,可能通过在流水线中指定镜像应该也能满足,但还未实践。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-15.png + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-16.png + - title: + contentList: + - content: + - content: 日志采集这块,KubeSphere 平台提供了 FluentBit Operator,在集群所有节点以 DaemonSet 运行,并统一部署配置了 Fluent Bit,同时查询方式能满足现有业务。只有 Elasticsearch 我们对接了自己的环境。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-17.png + + - type: 1 + contentList: + - content: 降低了企业容器化改造门槛以及运维成本 + - content: 提高了产品发布效率 + - content: 增强了团队对整个产品系统的认识度 + + - title: 实践效果 + contentList: + - content: 历时差不多一个月时间完成基本业务系统容器化。 + - content: 容器化后开发流程比之前有显著改善: + - content: 我们直接通过 KubeSphere 不同企业空间下的项目(Namespace)来进行开发、测试与生产环境的隔离以及通过不同角色赋予不同企业空间的权限做到细粒度的权限管理; + - content: 版本上线基于 Kubernetes 的副本以及探针来控制,基本上能在不影响业务情况下做到随时发布; + - content: 公司基本架构走向自动流程化。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-18.png + + - type: 2 + content: 'KubeSphere 帮助我们轻松实现业务系统容器化,在业务系统的运维上更加从容。' + author: '图菱科技' + + - title: 未来展望 + contentList: + - content: 目前在服务网格这块还在探索阶段,服务治理(比如:监控指标,微服务流控)还是处于试用体验阶段。 + - content: 后续随着业务复杂度提升后,这块还是希望能快速落地。尽量在 KubeSphere 平台中实现服务治理,做到业务与技术分离。 + image: https://pek3b.qingstor.com/kubesphere-community/images/tuling-21.png + + rightPart: + icon: /images/case/logo-turing.png + list: + - title: 行业 + content: 互联网设计 + - title: 地点 + content: 中国 + - title: 云类型 + content: 公有云 + - title: 挑战 + content: 统一的产品发布运维管理 + - title: 采用功能 + content: DevOps、日志、监控 +--- diff --git a/static/images/case/logo-turing.png b/static/images/case/logo-turing.png new file mode 100644 index 0000000000000000000000000000000000000000..924e7de1864422c03194036e2ed5870d2a1dff9c GIT binary patch literal 8639 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 JOVwV5{ugd&i#`AV literal 0 HcmV?d00001