From 5d58c6af6cd01df40447205fbcc6ef5219614f26 Mon Sep 17 00:00:00 2001 From: faweizhao26 Date: Thu, 11 Nov 2021 13:48:20 +0800 Subject: [PATCH 1/2] add new case of msxf Signed-off-by: faweizhao26 --- content/zh/case/_index.md | 6 +- content/zh/case/msxf.md | 128 ++++++++++++++++++++++++++++++ content/zh/case/qunar.md | 2 +- static/images/case/logo-msxf.png | Bin 0 -> 19842 bytes static/images/case/logo-qunar.png | Bin 0 -> 21478 bytes static/images/case/qunar-logo.png | Bin 8268 -> 0 bytes 6 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 content/zh/case/msxf.md create mode 100644 static/images/case/logo-msxf.png create mode 100644 static/images/case/logo-qunar.png delete mode 100644 static/images/case/qunar-logo.png diff --git a/content/zh/case/_index.md b/content/zh/case/_index.md index 7b696315a..772d52e65 100644 --- a/content/zh/case/_index.md +++ b/content/zh/case/_index.md @@ -52,13 +52,17 @@ section2: content: "驭势科技 UISEE 是中国领先的自动驾驶公司,致力于为全行业、全场景提供 AI 驾驶服务,交付赋能出行和物流新生态的 AI 驾驶员。" link: "uisee/" - - icon: "images/case/qunar-logo.png" + - icon: "images/case/logo-qunar.png" content: "去哪儿网(Qunar.com)是中国领先的在线旅游平台,创立于 2005 年 5 月,总部位于北京。" link: "qunar/" - icon: "images/case/segmentfault-logo.png" content: "SegmentFault 思否是国内领先的新一代开发者社区和技术媒体,是中国最大的 Hackathon 组织者,目前已覆盖和服务上千万中国软件开发者和 IT 信息从业者。" link: "segmentfault/" + + - icon: "images/case/logo-msxf.png" + content: "马上消费金融股份有限公司(简称“马上消费”)是一家经中国银保监会批准,持有消费金融牌照的科技驱动型金融机构。" + link: "msxf/" section3: title: 'KubeSphere 助力各行各业' diff --git a/content/zh/case/msxf.md b/content/zh/case/msxf.md new file mode 100644 index 000000000..946b51dc0 --- /dev/null +++ b/content/zh/case/msxf.md @@ -0,0 +1,128 @@ +--- +title: MSXF +description: + +css: scss/case-detail.scss + +section1: + title: 马上消费金融 + content: 马上消费金融股份有限公司(简称“马上消费”)是一家经中国银保监会批准,持有消费金融牌照的科技驱动型金融机构。 + +section2: + listLeft: + - title: 公司简介 + contentList: + - content: 马上消费金融股份有限公司(简称“马上消费”)是一家经中国银保监会批准,持有消费金融牌照的科技驱动型金融机构。截止 2020 年底,注册资本金达 40 亿元,注册用户已突破 1.2 亿,累计发放贷款超过 5400 亿元,累计纳税近 33 亿元,公司技术团队人数超过 1000 人。 + image: + + - title: 什么是 AI 中台? + contentList: + - content: 我们的技术类部门架构大致如下: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-1.png + - title: + contentList: + - content: 可以看到 AI 中台团队隶属于“人工智能研究院”大部门下,与负责“云平台”的技术部中间有一个很高的部门墙。也因此,AI 中台所需要的底层云计算相关技术并不能很好的依赖于技术部,两边有不同的考核机制、目标、痛点,所以 AI 中台团队需要自己搭建底层云平台,这也是我们引入 KubeSphere 的一个重要原因。 + - content: 我们这边主要开发的产品如下,AI 中台是作为三大中台之一,在公司内部运行在金融云之上。但是由于 AI 中台需要考虑对外输出,而金融云暂时没有这个规划,所以 AI 中台也需要独立的云方面的解决方案,换言之 AI 中台本身必须是一个完整的容器云 + AI 架构。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-2.png + - title: + contentList: + - content: 目前产品主页大致长这样: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-3.png + - title: + contentList: + - content: 首页主要展示的是监控相关信息,这些都来自 Promethues。另外从左边可以看到我们的九大功能模块:数据中心、在线标注、项目开发、算法管理、训练任务、模型发布、模型 AB、应用管理等。监控信息相对来说还是比较粗糙,上面三个圈部分是集群纬度的整体信息,包括 CPU、内存、GPU 整体信息,下面是机器纬度、应用纬度、使用人纬度分别的汇总信息。另外我们也保留了原生的监控页面: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-4.png + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-5.png + - title: + contentList: + - content: 目前 grafana 社区并没有一个合适的 GPU 纬度展示模板,NVIDIA 也只给了一个主机纬度的相对粗糙的 Dashboard。目前我们用的 GPU Dashboard 是自己开发的。还有一个调用链纬度的监控: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-6.png + - title: + contentList: + - content: 另外日志我们也是用的原生 kibana 来展示,对应的工具链是 Fluent Bit + Elasticsearch + Kibana。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-7.png + - title: + contentList: + - content: 日志这里可以看到一个额外的信息,我们可以根据 app 纬度来聚合,也就是一个应用下的不同 Pod 产生的日志可以汇总展示。这里其实是简单地根据 pod 的 label 来实现的,将每个 Pod 打上应用相关的 label 信息,然后采集日志时将这个属性暴露出来,就能在展示时针对性汇总。在中台发布的应用有一个日志跳转按钮,转到 kibana 页面后会带上相关参数,实现该应用下全部日志聚合展示的功能。 + - content: 到这里可以看到整个中台虽然看起来功能还算齐全,但是面板很多,日志监控和主页分别有各自的入口,虽然可以在主页跳转到日志和监控页面,但是这里的鉴权问题、风格统一问题等已经很不和谐。但是我们团队主打的是 AI 能力,人手也有限,没有太多的精力投入到统一 Dashboard 开发上,日志监控等虽然必不可少,但也不是核心能力。这也是引入 KubeSphere 的一个重要原因。后面还会详细谈到为什么引入 KubeSphere。 + - content: 整个中台的底层架构如下图。整个中台构建在 Kubernetes 之上,在引入 KubeSphere 之前大致长这样,三主多从。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-8.png + - title: + contentList: + - content: 另外在网络上我们做了三网隔离支持,也就是业务、管理、存储可以分别使用不同的网卡,假如用户现场有多张网卡。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-9.png + + - title: 为什么需要 KubeSphere? + contentList: + - specialContent: + text: 使用 Kubernetes 面临的问题与挑战 + level: 3 + - content: 学习成本高:Kubernetes 引入了诸多新概念,要掌握 Kubernetes 达到生产落地的能力需要不少的学习时间,这里还会涉及到网络、存储、系统等方方面面知识,不是随便一个初级开发人员花时间就能掌握的。 + - content: 安装部署复杂:目前虽然已经有了 kubeadm 等一系列半自动化工具,可以接近一键部署环境,但是要搭建高可用生产集群,还是需要花不少精力深入掌握工具的各种配置细节,才能很好落地应用。 + - content: 功能组件选型复杂:要落地一套容器云并不是部署 Kubernetes 就够了,这里还有日志、监控、服务网格、存储等一系列相关组件需要落地实施,每一个方向都是涉及一系列可选方案,需要专门投入人力去学习、选型。 + - content: 隐形成本高:就算部署了 Kubernetes,后期的日常运维也需要专业的团队,对于一般中小公司来说一个 Kubernetes 运维团队的人力成本也是不小的开支,很多时候花钱还招不到合适的人,往往会陷入部署了 Kubernetes,但是出问题无人能解决的尴尬境地,通过重装来恢复环境。 + - content: 多租户模式实现复杂,安全性低:在 Kubernetes 里只有简单的 Namespace 隔离,配合 Quota 等一定程度上实现资源隔离,但是要 to C 应用还远远不够,很多时候我们需要开发一套权限管理系统来适配企业内专有的账号权限管理系统来对接,成本很高。 + - content: 缺少本土化支持:Kubernetes 一定程度上可以称为云操作系统,类比于 Linux,其实 Kubernets 更像是 kernel,我们要完整使用容器云能力,要在 Kubernets 之上附加很多的开源组件,就像 kernel 上要加很多的开源软件才能用起来 Linux 一样。很多企业,尤其是国企,会选择购买 Redhat 等来享受企业级支持,专注于系统提供的能力本身,而不想投入太多的人力去掌握和运维系统本身。Kubernetes 本身也有这样的问题,很多企业并不希望额外投入太大的成本去使用这套解决方案,而是希望有一个类似 Redhat 系统的 Kubernetes 版本来简单化落地,而且希望免费。 + image: + - title: + contentList: + - specialContent: + text: AI 中台所面临的技术与挑战 + level: 3 + - content: 我们涉及的技术栈很广,AI 方向的,云计算方向的,还有工程开发的,也就是 Java + 前端等。但是我们的人力很稀缺,在云方向只有 2 个人,除了我之外另外一个同事擅长 IaaS 方向,在网络、存储等领域可以很好 cover 住。所以剩下的容器方向、监控日志等方向,在大公司可能每个方向一个团队,加一起大几十号人做的事情,这边只有我一个人了。所以我再有想法,有限的时间内也做不完一个平台。所以我也在寻找一个现成的解决方案,可以把自己解放出来,能够把精力投入到 AI 相关能力的建设上,比如模型训练等的 Operator 开发上,而不是整体研究日志监控组件和 Kubernetes 最佳部署实践等。 + - content: KubeSphere 提供的统一门户、多租户、多场景整体化解决方案正好能解决我的很多痛点。KubeSphere 的架构大致如下。不同于 OpenShift 的解决方案,KubeSphere 对 Kubernetes 没有侵入,而是基于 Operator 模式来拓展。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-13.png + + - type: 1 + contentList: + - content: 提供了统一门户 + - content: 多租户管理 + - content: 简化了安装部署流程 + + - title: KubeSphere 的引入 + contentList: + - content: KubeSphere 页面如下: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-16.png + - title: + contentList: + - content: 在 KubeSphere 里可以看到一个叫做 kubesphere-system/ks-installer 的资源,简写 cc,全称是 ClusterConfiguration,里面维护了集群的配置信息。我们在 ks-installer 里可以看到一个 ks-hook 配置,里面定义了 kind ClusterConfiguration,event add update,objectName ks-install,namespace kubesphere-system 等信息,这里也就是告诉 shell-operator 当 cc 发生变更的时候要触发相关代码执行。ks-installer 的核心原理是利用 shell-operator 来监听 cc 资源的变更,然后运行集群部署流程。 + - content: 每次 cc 发生 Add / Update 后,就会触发 installerRunner.py 运行,核心逻辑是: + - content: 1. 更新 cc (patch 掉环境升级场景下存量 cc 和新版 cc 结构上的差异) + - content: 2. 生成配置(将 cc 的 spec 和 status 存到本地,从而 installer 可以从 spec 中知道当前期望做什么,从 status 中可以知道集群当前状态,不需要做什么) + - content: 3. 执行前置部署流程(K8s 版本检查、ks-core 等不可或缺组件部署等) + - content: 4. 可选模块部署(并发执行剩余各个模块的部署流程) + image: + - title: + contentList: + - content: 然后再看下为什么配置里的变量可以被 ansible 识别,如下所示,在 env 里指定里 ks-config.json 和 ks-status.json 两个文件,ks-installer 运行的时候会将 cc 的 spec 和 status 分别存到这两个文件里,这样 ansible 执行的时候就可以获取到集群的期望状态和实际状态了。 + - content:每个 playbook 的入口逻辑都在 main.yaml 里,所以接着大家可以在每个模块里通过 main.yaml 来具体研究每个模块的部署流程,串在一起也就知道了整个 KubeSphere 是怎么部署起来的了。 + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-19.png + - title: + contentList: + - content: 然后 KubeSphere 和中台本身的一堆组件怎么一起部署呢?我们也参考 KubeSphere 的部署模式,加了一个 mail-installer 的 cc,然后按照下面流程来完成整个中台的部署: + image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-20.png + + - type: 2 + content: 'KubeSphere 提供了统一门户的整体化解决方案,降低了平台整体维护成本。' + author: '马上消费金融' + + - title: 总结 + contentList: + - content: KubeSphere 提供了统一的门户、多租户支持、多场景整体化解决方案且易于集成,很好解决了落地Kubernetes所面临的各种痛点问题,能够有效降低人力资源成本,提升实施效率,实现业务价值最大化。 + image: + + rightPart: + icon: /images/case/logo-msxf.png + list: + - title: 行业 + content: 消费金融 + - title: 地点 + content: 中国 + - title: 云类型 + content: 私有云 + - title: 挑战 + content: 安装部署复杂、学习成本和隐形成本高、功能组件选型复杂、缺乏本土化支持 + - title: 采用功能 + content: 日志、监控 + +--- \ No newline at end of file diff --git a/content/zh/case/qunar.md b/content/zh/case/qunar.md index dbee0f256..1aa388f2c 100644 --- a/content/zh/case/qunar.md +++ b/content/zh/case/qunar.md @@ -174,7 +174,7 @@ section2: image: rightPart: - icon: /images/case/qunar-logo.png + icon: /images/case/logo-qunar.png list: - title: 行业 content: 旅游业 diff --git a/static/images/case/logo-msxf.png b/static/images/case/logo-msxf.png new file mode 100644 index 0000000000000000000000000000000000000000..c983ad09201138cca8a889787ab686be6748a1b4 GIT binary patch literal 19842 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 Vp+iyISN{t}I}f`Ez3Y$q`5#&aIxYYJ literal 0 HcmV?d00001 diff --git a/static/images/case/logo-qunar.png b/static/images/case/logo-qunar.png new file mode 100644 index 0000000000000000000000000000000000000000..ace49dfab5b04592e214c6725f38cc4420c62ce9 GIT binary patch literal 21478 zcmeFZWmr{j_brSFf|MvA2uLUhsB}pSN()GLw{$nCl$1z!3rI_McZ+m)H;ACrnfv!V z|L6SAxz308dfyN4m*ZvZy;*zhweL0WImaAhOatCZi(+FCV;~_RVT+5smP10iaR!eM z&~L%tJ6Mic@Xrl9IZ+{`!U57vcyilXOw|qv38xM5=SI{s91&5#dR7khd^9u|6#qW8puN4VsosCiZfVD$`_C&5h_^7n zmuA#8uw!IqU_x9L1qJWFj^`FMutPlk*N4a(+Whn6U(d`<|M?_qU0XXt1s7{WJ{mbg zJ1YlUeZzmwfOyltPx8vvP}knjfS-klg_)ii@tc?NfBO;QGydlrgq`ih4fyrgIrW&B z^$qBmboKP;+1OYO=()I9xaf8DbUBO+m^j#3IXVAxqJO>Re?5(Ym4m(s;?nq8{&U>_ zeC?lOc^MI_Wp4VfFZs`te}BvWyyIU>@UH{^+cN(@UwQ-m|17(;gRS{Lx70wN(a_w` z!qCzlvFObIUUUO}ZhKREbHo3+;D$Xa2WSL5ol$rU}a^_|4P@= zQJ0tTe}DP^cq#w7I@qAFRT=-Yq2bAYQi7o+YNaC*r6`T`yl3WrM zM&nK!Pv_KXYh1NAvIrefh*9pMB)*pvvu^$tpszPVRO$XCpquJ}@soWj2G$gVxjLip z?z4fsCwL)4vEP^%7%J^z4B92Ha|PlGQG|(6-3y>9cq`+C1`l383j0b%ckr(VlyVEyh)3eDzBWlBei-g2 z_95n<RkCw_#g^#~q?v%SWsgLjKjnSR1|Mx00NC+`0}(f?f|2&n(x<7n63 zX~Dc5mjd?_bK)yOL3z0`>VG2ruH1smO+VZnOi?bTJFK+))b*E<}sbnd!`)6;| zhar0fs!kIud|1O#)8ocS{iU{NbJHE=9)0R7bR6FdAKxZw{I7Ta**|!62iaeK#|}(i zk*Vo3j)PehTB-w0QYpwj=NjrYGElxYr3g(qcxRbleL((H^__KT z)CnI2IZDDm>1pM5uyuce4az%m&W}hwFQs2ng|lK&hKrIt=#21$%l9P`()o4e_T1}D zZh9(m6b_GS{FID>3~InDZ*5MKacpjfB?$Y}G*%YAq0ndLq{$bq;@d|}Ef za+5Cx^(5ZpW7oX2CNFbl{X}J@t5vpyQt2>6A2H9JqWz&I(vx{1B-%&u97Uvsyj)(k ztJ1X3aZ)vQ(MZ=Xf)0o0ma+0(KNB_yb#;46xx~{lR z`>~@x3l#G7}Fh+b1}A zDPdwh(b4zww578nE-u{7D@Jf!gwWO0)X;Bv*GpP_3=h9YiqrZ1^POAX@EK{Q#7OP! z?XCQd&(GZXfA37{2Ykoo(RK zeGTYCW@)F6yC!TMq8}&*9skB{eYexJyszEYO(ny_Lp8^Q^_h&X=lb01I<%&Sn@y_K zsPu4^(JOAyW6y4EA^E8fE>XvVyomfKHmT*^%K0^?#`D?lsPMM6!IVMHhC^&yJG(!_ zDOYX1jE%v%L^K3vl8p6{jhEAn?aPOWW!L@v{TF}78;!;bHBI9EvP|>U$^-L?8sdY4 zg9WEq=sO6toIe<+c-)s7X2SArX%V_QB)<+TDJh9mi_p~6y!e$ZkXc-OS5YybT~EVx zGjqnK^WnFxAM^V!DVi=%=Lf?ci+-OpZ_{Jmt2>rvsQ>jd^2CZFeTepS&W&-p(h6;9 z9!+zc>-yr@W#I$b-;?S6(~ND`#$$BKw~A3?V@ljSJhJ${@E|@u{##K|c6D_eJb5CW z*mc@)%7=l0(Q#5kbqQM#J+CrC%;#}R(< zW1^$>1I4vMWG@$k=v3{tFRs0llifnojjgRMBx~*@QZ8E`6SlzItcuTqFG!!@V_>^V zD=HRG@0!GSG<%~>mYa=#8kip)ZO@F+>S^)CR4p~aPH{i#{{H#cnODQMo4RUtPd8xx z!%ego&Ic4o90?&@c5ApHB6o$bTpE3FcV=s2TK(^+w~S0qird+-8X6k5*7Ypj4H4mj z!?Cfk$LuUDEM}}*v7PJZC_^vLmP1{R`#B?$G5uTVcD1$bHP_*T^@g*gUY1Dm@$gL7 z6s`H}wi9Zv1kfZC+1{HP9@ckZa&>h@_Z1Q^>eOSdsjbayO1T9Qt;eDmwJ8n1c~TCm z4oE&SwCZTnw)D>4n7iZi;(kCft|Mh1DK};*vQ|PN9vg~Q=DfO`^a!pw2Ff3CeV+4{ zyZB4VXqxDfsc7-Rv4ia>-|82A?@~Hv@H91B`&?_PHOYnY6wIDvNzUQhDk{n<5@Zj@ z$>|abS;OLv6{vS6^SS+CE13UVi2Jdx@6COBwKl^TO~2N~?=xjLPYhGp73`WmzkUQM zKyzGY`*6(+^1+08g|4RE(k1hL+^i+}?@QZi4Wx-($Gp&GL1}3mh-1n@zSG22`i-qE zz5TiR=W1mpKbHH%#q`K6I7py}TK*~XDd-$N+-0Y@Gk?ABTvbi2hrV(~@6ytf{GFNE zpOpxiw~7v8MQ#!|n!v%i*)lFV#-Y4+u( z?@Z4totJ*(oT?3UK9ZeEXU1TUI>b`P#B4s+^t{Tb_SPR#*)K(wpYkU$qW*iqiywI8 zU31@4C9#u0mCQUP{3R)6+k1xIv^lF^x5%IH+iQxBpLlMMuWfraretM3nVOpVmY0`N zTpZTRP#gS!)d*`s+QWnI4&N`_{f2XfViohI)0gf@b9FAP)z#I`ykxy6f?hn{{q=eH^@Fc^%viDH`BbCr}SfNDpD-X@rb>MSxe)qi$D3Q zr5%5RZ_GI_V-N7`*WH*NV+%21>wy~;KA@_i@@ag#T#rP$!`gS)ys@GpT9nMir=vq; z+eJ~)rgnD5wwGQ(K>=$@TCZtF$AZeUFyM4{*HImhp*u$ym}B=&Y=C`6{(}0%!wUAYnLfr1?*j8i%s0vJ@N{_C_DZ4Z0gO zaXiHFXMgbU%|ib=1T{wjw$$+V>D`s}byl;n=Y>^E7!M4b;=dq!`K8fe3@18X6;dQj zz4duKM9bZ+RF_V>A@qZI*rk(v$%=)wi_Bk-lbQ02>fUNt1p|(7`e6m07I}zNB-K&< z^$Yxfqj~zINUj})q-L|DHKemX)bqocy6rgZaX9h@d+W*M28zEIkF>$&aL-dHyLF@j?5a<=F%^OPG& zK3jTqdj5)IP~e)k)@lFA{UA!8rbX+w8X6ZlZ(>;X7e&cE5S5L0Vcj&a?9bfZo~0I4 zp|8iZfgf8JQ&Ursgk=x@xQiD#IXWJVsas)haf$PW{&AI+y?eaYFX_sEs3I&oQR~Dg zaCI2UWxFC4UiIpNwPDeZbY%NPCOJ6E)O@xkYHx4PvlCL^S2N~mjzQLYrxh;r1qB6T z25n4Oq&R54zP_#egK@9tyJM=2=1x7SuXrb2K9h3k&89S@oObV3#@&E&a{kavkLXrX zQj+<^_YY{~?msYU*yi(SF;G!aXY7Zi`r=rP-`+@OGrc!|^}EvFB|Ch`fp7K3*YGe( z)GMslxPNHHL+$7n-a9aOB1`lnNJ05X3q?Q9UtkGPBLNLY@D|$zkNu$-PhMAn{;fi zk1-QYEg8#YmvzE<2#7fH4*waFqT&!+2!yxodXf_k*B^O&Us!v)i!+;Tr}u!xtl{PG zhzM45K?0#K2?;!@Zv6NdC%wFYg)teb-t+8Lc~{%5KXJjP+U$;Fww3sshO3R1vTpmG zrMDGtclP$yQ`|tk0$t3eB1|%i?MJ~2wWwSx(<19+(*zjDjMxR{ySFob-#U)F6fdtz zpbD&;oLdx&yneU2f~|dLo}q8?h?Ta5pOZ6YW@bjWah?fFO^^jgg>g6@~H~torvP z0hOzc5Z#uRv}h@cXvgR(34;>-Mrfsj9WDN1f-hH}BiBLhR=~ZIF9rb#>BQ_P{WSv# z4M?G7j)&q@eve+e@77n=AKr6{Xlvprt^b6pfY$21tb!M@op~?nk&k!OEvHm^V?S z;!mI9qO0t)j`u>@v#ca(oF7bk<)7ceA%rd=DH+G(wD(1enAQ0w6IPyF+Vn2j_njgx z8|xRO&h=VQ-aBF%FAVQ9Y6Z_)(%cU^ygJ`Mo^#t*?IiLObaCO*zT8qS8006#39Y(n z(t*MTLeZ^l8jSILwEqM~sZ|2H=^YhNGUp&kx!f_1ZU|0#rh4muP>fD>D9_+b6`MH_@$HC}s+`5zVnhOv)w>58e)ktwPir#Y|D6Gb};> zLOb4j%PMTq3ZneY)ov2)v#)6b5=IjbxL*6}cr!LZm(PP~duCh6Ss*#{nKLl`$K+)9 z@t}a!XqP`8ng4QUC=H(gDO?G3tx61yn@O=Oh7uCzo>`PWsSORu>nUCh^JclZ>D%0p zhu#15Y8wF-Q&3hO{_*2I?njI1iedm+HwN>zxdE8zFo`)iaejE&RI=8($izA4tS@k* zVtQA@{jgoben|K-+8EKaXN2+x4z5f7bq8=)IqR5E-d19_F0JLfh(`sGk_tz?IEL0())5@9F@Hpojpx#pQGF+Xo3{) zwN>}zhupp-92@d)7Q+_gURu@^q^p3OX))ZXjW@9Qq&Wi^1{(GT+7z;fnK$Cb4Ce#g z1ICQ?xK)2pEMM1bHlpvUY#wEjEwv`4;DC|94s;D4)+{qQ?N;BxZJ888R1;DrIO?e zAE7|KlK=Qh_RQAueuA4&-ONL=vkb}Dv^&;`LK++WNwd!h>oPZJ@_!A}ZM+IoAj+<6 z+^rc97%i8}pR8(gb3Iic4{Q@#ZD_U)a5=~hYO7hl84&Pi%KGNzg{J@l+3W|VTkln` zXU$IKsk(pLUpJjA`oJ%Le6>~c8FC$EY}+#4{J64D|9&`KY-|TvHzK=X>ByxXk@(S#FOR)E}OV>>% z*3Seh3GeP6)AyG_f>$0L)G>FwUo(0S)$(8WM&lS&Ka31!G1F1m#So;xT{t^j&L{ys zY!M!a-%R|6wJLTy-P2utbh;awn+r)*_U&7yt=k`Ui6He1aIKSSFc3;fNdecCC*lHa zDzx}z6%{`xCSK$>bK#=@n3+kWl7qx;N?1NSI%-(m+i%tj**`xY3z`TktL(x;%O7sh zFLERjH?WO1xs#+J)_|J|4#qMXOzyX+oaHbOd{DYOFd&`mek7jk@q6;?(yREau!MwO zhjC3&8=K-)aTYVSzC^AF6E;^l!uoVtQXa?PiVBYHYBx{v>5yKr)0o@n3gY!0qgg(0VzI< z88*~j%{Bw%xy_A@g@pNwClI->l4*tllUa>%0PL`vjZy7lYOAVtZ;j@44-90Ll|=%< z2T4=9X5L*!<_kS775-z`3SEkmaXT2o&iMsS2QPTa_&(qf zlCq(Y)VNi>VD+YxKCeQVjoXf)r>Ael;U<2Ajz>S8oJ{)80JO5gJji1w+v9eZC*z?tDaMaH^zm6( zSh~8q)1VIu?F25oSsYbsn2ne0PM&g+(aF~6ggJ+n+b+9M+L!VxK99fl4Zq8a;N$%G z!gw5ah#2dC-P;~7TJH*bEPlgbO-@Kj>AqwP1NF0KdGn{EtG0`_)qbnVoRx`Eb&QU+ zvr|`&Rfi4bh`dZyLuoHH)!pYZZqNuiSC$+^wLjCRYcn4E>pzEZ*8F}ZH znlw*oT{oO#8ocUm>M znT6+e9hdF7>1F&~c0asKO{u!$AOl+*(Id+6|Dh5MB`a^^yE}Zuuj<>@c5>ZJw)W?* z$j&MK7!}uv*oSNUbR=p=lKE%BRy`0xPmNQ$5~40@?7jQ>C@=iPBu*s>vUu#O?zZ1V zl|Bg(A;(->h>MHkS~@vj{1Q9OH**y~ejmr5j+XZOqY^3Tq*~7R8wGYg?O4Asug*CS z?2dcCnJ!b8+%U9zlYoghxNSRuNmuBn%VUtp2Ha_QtX`02rKL4*rI;Gh+$Y;2!Q~{Q z@;s%^M%zrk#%Jv}UFQ+5zDVhC#1Toqe0|kd>LwS8`|%SlY2fSIw*^H4vtMM@+CT)- z1`06|kse(RnM69xd&KNcSE_sGsJeNM<|-!I4RDPm@9J+x+<1u^GTLD_hYH8?d=cF2bvZZ^n{xBL*HlmhD_K@>F13~AyK^_-sF9Z zl989!I~CgG{(|&#r2Bm!+L~@3T9}xmrlozzkN#Agn9qWO1 zM>KWbr|P+zU|A!m~S{K0Htf_G{a)wYwJ!IDSi~ z^YzoGPv7H3e%1455u}RC+9cBx4+Fo}e?Jwb#kkShR7CRTO*0Y?vAre@ zDb8^VCgXRfeJunV*4^K~TGGpqk(#=#xN!IB@h-0x5MdkrQNfcM z&ZmwjX0cgnqat*LaoFZY{oU;0?xpr1pyUuKKR5R&wAN?+ zR-TZlo&%McP3r4R(asVYloEaapeSV5eFP8rZ&7zP6l{&J>A_YN3p(irmZV1jj}QND z7pb4SCycE@U#U`KPZyt+#EgteBQeU4fC;0c)T`P+DLd{=Gy_NYJndmXQ-Y~1P~2iv zAAy*2a8Rx7!*(EtjSKZpT&bjUnUaUc&73e%=nWwsmHI)>#8@RphD_BJ7gKKoA0AA!!4 zYJc(D#A&dQD7zFCc>^VWv0>?Dsh`7=e9g#cRlCW~`Jj3!@R{Gt;|qJ;`v?`|61jt7 zFAA1>%*XI6vMey0!<%J3-7}^Zv^Jc>Xwy?u;ZrBhyfppi{EFz52j`bQt&3kLyrIdA ze6xUoi3t@&8l#VmhC3i^Gobp&gBf!P=o!{`a&%nfVwn8>v1{2lr4#?<1t>c{{wd@+ zH#4x^Kvr|&L%P|vF*!Wac-WFgOWTvv$S|CQVD(Eq&VN(gRaT68R#XQ)Y&6!^(tRNW zvIp#Mb-8C-{bD`QuEXPwL#a$a%j~!Wsrh4a`}L?&_`fz~Q?BBWoW|f=7fyGUCV9SVl@;>4OZXDiC+vIZ#pdqT z#9ic@T|){x^`pDe)VaBG^75@gj14BEw?myIne;ob3hRGQQH~d3w=TfVSOHO@&9YM6 zt%OmlE*4Qnfsc+1Qqv=Uh=T^)2OArkiUo~`Zvunka6f;z-6=uzV%F`7^75gvF(Vg2 z1w}*PL;zhSIWm62{rHyFz``HstD3@P+v@y{)8cefVpgNR?@xk_cqS(&At@H?wPP?; zuiOK1O#Wvwl?T`5ux@wNmyDd5_>_LHXoAC}7Sb&4T@#6mWhDYue~rWmr9F8`jgeY= z?+H3fRdhi~NldT5!zm`_=5Ji*mJbg?tlYf=@Mv&c>T+|Rt5*aAX_XgF+T>5}*~L1@ z%epr6r-973VbIXn*baDT762*R?35^(nVIg}>hnvmoeWodq8@Mga|xQ5nikJY2%)n{ zm5%wKwJ>4n6%(P|AuB_^dJ`(5s`@}W+pesV(h!{zvRhVhF>_9`yR7WcdxAv~?<~{4 z1kO7zY#6aybwIkD0qCV+*Uv6DL)|Kb;U3T0YPvpfVSbgD|4IF*?oHVwlk2m2)4-2e zPwUHPJ1eA%sCX5q$!4wO@y*|B-l$F2QN}l~7m#s3Y>Um`bJj_c$hQ3P7|T5SM@vw< zUfs!zLLPz8L`C91nP>NN-W_J&~p-p$cl zB`pNPY5Dp2DJNPA3T;0#C9BVtf^zcnNgWf`4nsmh>fp|!csGBQu=?}ok9ckH2{jRx zoVt1fep+%=lp$(zk|kCv1)yTM>6&?QbWqyD!ujJ9>Zurp0Lr-Yr)bE>1fxU!wZm`9 zeA?&06{{`RG`}XIGQDYB-{|j=hK~LrtIe+a#7E!n8I44XOo5Yi5LylOj>3E`0|mZa ztMW0CuY%9jZ4}XT*|`(6xM*XVCv9|h|3dqC+(BZsaC#mQSOP+Z^=|q2l5MrLD-LVP z)$eI5V`z{;*Q1FxoF5zOfVOk+*XFQHyxJI{UA^1xR5^4_(11@?T4^`h#WJk_{_QCF z0_Z&`D~XAuI%n$bLhkp9p*i$CpPoNzMkA+^k_L*mZ>2i|O*4a|=+8p4x47ajD1vdo zU4Ad};04y|C56tei`85y(7|^lKB!q7~1BKJvD0axozBLAZojY$n8z| z+7DxwZLOtk7_|F)^~_|x+(D*<&U+}0q^$i{L{cufQFMIPdr`%%5d{pkkbAWuInq32 ziqy*TU2oY@K1P3&ZbDEtbtD^<@gE703D8MCD%V`N)6ql(%j+xxjiBYSN`OfGR5ni4 z8u?oFQ%{vxNc-vzw+m}O1Ec%}idE*E#e72&FslBL#%w2q%xc>7i;2j+E|_Z_cT1+2 zwK=^iC(Z309hXke3j$EvdNYj-4Y7G%_VS(rnR9k^+Gu5n7rPFbcE##y&5D+u{vlhH zv@Cvw)%*a^gW*f}2L!G!SUdQvh;D(9qa=}5{p+oQf`Q8uIbB`1dM!jV)9wJI4(Rvf z9>4BF%yK{86Me*jy5IL2<3iO(q=@1fMg%Fx)7`lIBUh7Qhq>Qqe{5bo`^$7KP4In0 zQ+{Eo538{2w>3~YpR>Yqa-9_k)U6EM(yNGs4x$CbEM5qCuyL5&y`+-)NaQZ5k#Sl_ z{>#Uu;aL-Q^_)#nZ=>6(C1Rb@hrUsZtliIhrd&uGePWrO`xKHc!84_|nwtH8PqqtA zHa>sG87tK61x+s&+LbTJ`}W-DtGWqv?mrqoR}XK#Mi-Ql3R#ul6rP_Ucc&^J>F+TG z+Csecn`wMUOv5i~r2;kf6|A>PRzXEY0=y@0fDoCR(sN!PNP;rXY}gYSSr+kB&ZCGrN04DH(Jmaqm^z1rK#jbKtSMrT06fA+nDOvGqWyzfxjD%-@SVm-sS>$`tgxp zY^<=~JsM7pfItkuF;m#O;3yiap298`Q(4f9#wV6T~D`&7-$NH~!?|DH6C zknnsL?^n2uV7>?4*H|+Kyp`~MQ8DjZL#jRK6u1Jb!J?q%B7paQI4Y3HfN=omA7Q&BDIpQdtl#meZI-kTwqtJ$qw#!$2fXL| zyV0jvZ{lo!VpxGbda>u!_?Q$&T?>s8Mf+ljP*h`n7VDmZ;^>q{W@%{zVpl`jBlmA* zPCt$t&o(6ndjj}rsAm&E!0=3H*r<^H(0m1?xy~e!tvY@sne(%WZA-eb&v|)&!TvnwlDwO3R0eii%@KueFK@Yi9?1 z3AMW7+0F8$+AX;{DB_)%oNsF<1CDRx=G2>W%=J87wdc5Dv`)WqN|Fqr_pd!Lj6E*}U3xbh+ z*tLXCqcw>Xg6VKXUWS^$0Te)RDPdGj^X2mQ#j^*23V#gE2#sow*;xJ}tO4l0O;b4x z%tTE0gKWSMV+Yk*uXOV7tam8?-%o%JXNv%zfk8?JDnaAl(V}lTInDd0%g2Ah_xyWT zOP)Lf#tjSss@1=8b4x(rx2)aefRxhR)demkvQ$w10V3N0?Q`sPy?@V2mCM1WAy&E1-2SMB%T!=~6@3d=(DwOdx+*?7l3E+K#T7N6Sm zJ=?U~-_2}rCXfv~#HK50YYzgw7GC&RKp^GM@p=lI&bw6m+7HPB4;HOsq03bbJI1ZF zCj{$Foy&0tewjn(LnkJ;-#cF~JmsN>PJouX^0%6mx%teo#@Or2)xd+W6Dn%}Kjb9wCIxy0Y91-zSwS=^!xZqZ!)_b1qPJdDr| z1H4na3Yj~1Uxcw1(LNurK4hf+JWEWB9io#ohef6ZPy* zk8*<^YA`iUY`_hR43A&*j`}!9K&^01Aoj4Sr6t)hJ7@(VK-;NC=cdypdR_g2RQe0g zx%Be2a>FF2ugXHgc8uR&MOg>Qh2 zyMr!_#N;|Em&y5~$7p#SFNn6pbO)z>coGGo)54%Lg=Y+*v@Zx>Zc0`O3J~3JqAo5-)2gU)X{KA zUyeKEU6Y0SgG+>z!jyhS!;i@egA&Yp;2zK`j%DX!4kckQLh%9~Sx&(j01&`J;tF)^ zc8K~a=to>OGh-&IY%-$$F#T|WZgf4_jRCO4&4zz?QS~<9+yQN&w)xua%~azP5|#pg zwC#>b$gr}OV1-zE@$I3gsHlr!flItlzTZSZYkeOuyLCU_BBA#df`4iIKyiuhVeAP!%jfh?)jiOrPr7h2BV-QK zP~wnOba`ic8*?V(S&hvL(p5XO?E@MtVh&--cj%s)T5Vg2eV&~}^*62FqFeILG#PoJ zF;y$fAHc0To%c!sCbz9* z2Owx~BA1~X%u~*6T0iFWzvOD;az|3l|X$-Lk4#H1;eOF$_9;Q}S#^8?_ zdp%s|1Wv*?$-HqTB`mzjhrJqM!8jlkKltcOH)+gsd6A!!^f~tPz-`&SQH84p+E9|? zx)-0Un*Zv>q_~kxnFMy+yCqCJ!se;X^`SZg|BOR(y~RWH@IlKF4()q&MHd$dI#!LF zqCp8ZULiw7^DpN5Dw1&n=Jk$Kl#N`@Oigc~R*axgCIzOGWfTWe-+UbOJy_s~EXAcO zZ29?$HB}G!bggO7W^6?%(oAj(J6D`WL_~nRY`*5YQFWsD_Q9I1$LFjiVksZZeXb*R zdP-!0y$ep1=f_pF4_S)%uk1d~b_n3F$>~;}7P+FC@82HE3?0;(2ncJ{hfPp!55f)Z>?yT(VTl-=W6IZ_FB z6csh}@hM7mu#LW!Vt|XhL+-P(QR^3O7-C?R)GZ5o3Gnz@qM3G;$>H-yvWHr zPEPD(=o&7&TYaIK+fqIm_q@-#gXZ?_qIRDJ@0UzDNeZkgQ$u3IVRA#E!-9IX*?;5x zd!0{AzYSg~*l_PV%~#-+iVd{wH&1?oQu7If`fHVWp)RH$%=y^*KDhaPeG8>?!E-Nb z4e(QYR+}<^ucbWe4*QiM{0pN*h}Tv7#()iX>}c(8{zSWHFXLJVlxa?38s;7W1Jn&Bl)I0M)9YHe zq`sh>5rA7a@k_y%;tBknZ8bhdWc{LBKtOK$&>v za59$x{G%-3g^NGOXdyjhm;o*uplTv;zi`lf-O|Zhq#B*AAzP>C04|Ky`r`2K-$zK@ zP}~SLtOXmBHsnSd=J!FYEYz-1(tEGG)aam@osr=U)CF+&@?)U@{h<}Z6+);Ic~U8Z z#FJSW?6^Yc;7kfA+f9!B8~xp_t5_O#rI z4kn$B$7jnw&5$1Cw!En{tqpKZYkR5&ThN0_B<}Hv_Q_k?HefOl z4uI2HrxeB5%<}T6`HMBqvdT)ZS>{JpCJ;p$6Wu~c&bUR5{BI3Q+di`8P!!i~S$UnS zBjim`;1D<*REpUx~7Q5_DR1l4hMpjL}KPo9A&o@_&K2A4PJb!E3UkR%DC6lUXv z<-Zxl@|AVePOpDkU328y*DU@V8EM=1x^`ozI}qyW>A@8`2-3cIWLla^ez_s~SRyVG zF&1WgJ3gIhcJ<})Noqo&FzYI|b46=sB_>+s(rlnanAEZfo1cVx6Me;G7m*=8-%FKG zbMZ%q_H{xD9r<&lJ7I~6lv>}`Tiy_2&Prcx?F;UfFSYvVXulAOYmJs8nOi?rby#=W zooWZX-v<{Sq)UVdx;p|FU%<%x-Q(O5`2)iKDb-Cu7$O2{vD3!J#>-(gFaf~afH4FB zf?K?t`r(iS7!#tXdZ(mUjyUQX*fU&o6j}xbBLq_7bH%Tm?uWKmhv3JDDkMhjhPwIB zW{;bBl>t<6&e}&Pj!KO?AZRx^6_u`&aqYp{{f1r;ED*)D8$gsS{*yPcUs!BHMKa81 zs=^RH(Xz5KT<{Y^W1(7Na2o`PBpxSNQJ>z`^zw27&2gJ*4W-pqh1;6?`j3Ix(gS7} zQ0vdRxdC9g%?aZE9JJoyvfscR*K~RaoE=?)d92wvhHnC5VC2wwI@e@l%{A+|g2M@R_V+}sn@b~FwS4!~7_{~k2&|I*=hc6OM{&D1sk zIxK*9iyEA(M1IXFSHEb$PJ!^Ka)E}1fFST4ysp;0Dz@eb@87qD1(#J+j4Ih*0E>%J zR41@W&j1PlTN(fHBl0%u{@$KZdmsUTxNP%R#HITHR+_g@5Ru0^$eU_~S!6RJcome<^ES;_T zyGf*hZ9zvwFYVYI*f*tsTLSWzgLB6ECeS#SJ);($ z{(SEAY?=JJ3s|jcAZ`)M55U{x=kH2=Q)OBFIj?IE&!dPGpe!6~lMuIvhsX5YyGO(! zV4FhV+Rr!6wv-#Wv$i=0!8e6~>GOZbDr0$FSis+KQFMLMxUsWi0HBVP+x`>q6L*Tn zVc)}k0)9%jrnWYsQ1>}dj)%a}AtWM%H4jD&Zhk2vf3I2qOmF&-iG))k!kbXkc*TwI zlp)mAiDG?(dDnC}OIAw@rzux4&l%eEiF!9q$Qoo6!<*7*aD!NSb~rq_ioX=_>0V_Q z1oiU?a-TTA_V|H&kv1zTCF3)FR9e-QAlPtU+gSO-BdMG1`J7IVkUh&tKfh)Uu41Kp zB^$dLEV`AK@gh%%m%gwoi@AOC6DF@s@0A!8v34ohEA4Y2av`Pnr3iTaxR(@oZ+^)E zQaYVo2#l-=3!@@B7Kj^|Ad**75~0A|sJyN+?ar*(*@jUe7oaHKSBWlyg)Rexb+^50 zfANSX@O=iZF3)qmeba%P{4KW!oY)sev$HS;049}J2%8Vz=}c=|0N$VGJDyEY znYsWcS6%*|29Lr5c;2OQ?F5t*6scKRBVhiB8EhV~vtTF-YA65M!cD{?!=#o~yT1Fy zVJGiF(@i?O2{Eb`;OK=UB_#za-DvS25n=sy^MV23$%+y%+QB?nG~9hQDIf%oVgLE+ zFm*k2nh|6p7FJZe&!8b@W5X=NcY+U{4M{1QFbg=UQhX=yeKW}jtP-1L5d^h6my!Dva>JWA z7GLt~vrd2|SqAS<&oAr1Ob$&n%BMSLu#yOkOzDZ>(&aZ`CXRX;5!hbea{9HRB493d zc6Jox8!#iXySt01yokt!5j4;ofHxm|pO6uZ%33v)$QC-YM&v4et5C&bwv}SVS5|08&a zW=*5TV2HuY9u7#Sh4x=Tv3=2c!Le38{1IY62>3kEB4P9$+!7OTp@LU>~t2uP46QMeLXJKs~d^qdSgV?K~0}V^N_g!3F*!=#QzI0vq8-f;-0|0W!G|> z)1xp;PgxQF)qBcM0nTlnA{YgmJv|a*MgNd?e*^rh2XbjK(%yc8o;9m4JhWYp_k5>x zXSy;Jc#cHiKLX<8iOoXDr9b@u&&c^M7N-*MsWIA~T%e}cL2>}S6y(GL3mJqf^4VA_ zU|58g4Ll|zIr5z|73s8P<>j*K>b=0HewyE>!N-tQRu+9hY6Nu~peSCz>*sd@XDvJT z5pMazNc3R3GWAMJm<0`k85}?l0E?i30Cxx2Wf9~}Ci0!b?GzXx0eWRA&N#W)@st(I z8?GKm?@AT70RgDk`RbLQw~HE+!^6WP(d%$Of|1D|G1>$M5O8V@XUnW3?lXJ=Bysij z+}s|RcePZ#2$v7VcLuEb<%UM`s%~!UKqF`Qv12NlFm2oGIyH|b+@0IPO9V@<*YBrK zh??)#koT7#EH9$(7CSf8+=}GhS$Q`V%X|IAQqeHIRYac+gI4LO*3&-&P7SR)lcfc_ zdKp8s(%Ark*bm~pr+^fS1wWU>t!jYTplddbDr@(H0md2l?VP;4(u%`3i5jmnWFal{ zt#RN%=1wgs`T6t+Sw+y&D7ie&AJS3CtYzh+tIm&`s5wA#W(!>Al-K9etue#|0k?$n zskXoWauCe_Yvc3oTczH`chcXUW9+cFjNX0TR}w(Rq~ zT2>?6o$U&N2NHF+u0DuirQDVAm;c}{MJ@j@=yJ}@6-)%mvf@}b-Z(7wfrg2T;rppw z53*RpanimuOk$>*63<^>ogV&iulu`|_guBa2h^;u`I`Q%%>oy#0*LxgOiT>#LBO*F z%bMFSWbg1ke(Viv1hlo|*L({K(|x;RW5~JyCxNU~*~b%FIB`96tw(s2pSiQj^@;bQ z5^6NPy2EEsz$$QY&|0Oz048;<9Y-D*vO#?M&P1^{0R9A+0D%E0DBg5;A4m-&>Hxwx z3Oyx2&#S%tD+ciqqk+Wkxq3Iy@aL-{&3B)T1SAmnw(5eGt7w;+lS7xe3l@Cfx)u96 z>au}pf>lLy4)!o~J?120yA|f7rKgKS0&c_EAWQ-q2(J*K>+ViTYpkOsUh(Qk^ zac#X?b}; zh%s@g_}3yLegqHQVRN#&92tO(&aZQM5o!)%02pT7nr*4GiS5Lj){ntx3RbSOOHa6i z)Sk<}bS5V!CouoOs@<6WtBP!+@z^s=bo?RacT(`=29^rXjpCh`V z9#KcW5ZN-RKcYRh$O~3NTvDukm23l86ZC{JU@hd9h1AHl2m8jL`f~Pa%6CKUgW%G{tg3K%=T7qf( z#2Ng#8FaXK3qqTkUgYO5zx}cd<8(B>Uf7wb#;cu`hWmn;57*I#t`^W8ct{bmsRe57 z0QXcNT43J6vnQWx_#?}BO$>u(PeJ8ey!|x{jQ_cwpS!FR86vkPz3wyMOqew zE~buw)oFj=~D2q)%TvR4{KCg&Xtt!eLU4A)T!K|AzxG2}tL+*HL82`paX zd-|mb+O^$%mHz#G5i7E#OJ7^YPcczix1?wCkLTk444k?hXThLerGp{k{3$yZR}M_b z`kxxcNMtf`!<>tfhey3_b>gjCw;oLz9n4IcD*>DTV`L-}UVQT834TyJ8xIepF|C}; zOyNy??r;msInO4CS?r>sf$(9 zE4nA_&eic%c2)W^!QLwm@!pQ{V?FWf6JAuBi*5ZvPm&=DQhh3!pYAWxdBd|c-S%u1 z{QdnE<>fQ#-A=baW+Q&^V8|DfFtXdAtfq$8ud<;*3wZJo_@4sompib_D=Koqd;jxc z%684-%Cqoazc%G(tL;QH<;3rh^DBUYUNPfE8Y~wBnj1fK#-`5BDiF%U-e`BqV5euw z(Xn%KZUarX*v2TUqNeuq?5qlw82S*t)nk|P%F4XPMs47iAc>7-O2+(;cCP=M$vuwi za_H((-4fj}H(43i)Zr4^4iRcu?zTo*Xho`%agB}P-~Pc60{m>`QcxWfh0KG zb?Zj*!w?J(hii|Y&H+_84>Und-nxiq!9Z6#eYut)gL2K0#X~c;mAR-=-XN9a>f$mB z7(?x}MK&njT;1L478m0H7!m}|3Y-f8kT9!R0|r~P7z}0>Oi9Q;eHsOV5KntaP{|Cv zFs-iZj;*pTAl-vUrrL`bXyV|~gjPNh?wp-hSgc|&k!A#C`tIW51S{9)?86^^Mj*XC zMN@vLCa0z=kkiGMQ1G!?keloYodXhYiqQhS!uVzehz_+huSS(Z=6|S&F2cY$9UUDe zw$twxg|%F6YjZOj^khv;O%W`KFUnjEUUzYJzAq36D23%<_8g?$$3Z~xpf6Q}`18KK zF&~Dup6g6WOgs&Go5^dR8-nh+R{=mYMz^7j1ca4j0PfU=IdQ=?Ha5mLWhgaZ(h|>N zvC1kcOlRCJEGH6Y;xgfOt6bciPrK}`boXbi&wZ(mqA z4TciqbYjbv@)<=0v*@6v@AYnNs=x-a@0|dSzZ#=mO*&b>57tp#x$E{Sw=#N#9b#O` zaVsB|B`Qvl9W$gId4G-OaAEtoEBu%T4#iCjQP ztY|GQFDL9Rd__SgD7)eHimDLDOxF57mW1+Iu==<;0^S+n+J-&3f4wH}U|D75R^(9w z{U3f)`PjTl1keqzm{~!u?RZ*5WTdyaRM~%$qDytY_3+ez8;We7s{3NGI6#)t{SoNG zJQ51)Fz}Yhs9v?2ZukASQT#QrdxpQCm#v6&_EC>TL&Man6 zPo8+r$YgLFQKkD%bJn7a8i=YktMnM@eq%P zzx)gWqD1$4oL;3V*MMErLlIgd;iUdK8yZt+sGHwT!(WhE96>e)h+ib#qfC`TJ!TDM z4a74^1k@3Q4^*ZwJOv`@a;$1-lC0>)ri!f4tXQ>%6CY;d?N@sQd!mDnfJ(?1 z`gq9h>C|wAXvp8ieN6I`)5nGN^X|%lV6};`4PG`v>-LtirrEog;i$gJ;Vez~1})CPuV{UqKEH;jba@fBY_gr)=;2W5ev&3uk@#+v&O!j{JdJ<`gSlW|#h#!EH1>J;&!Zp5X2~xk;~S+jS$oE*}GHJ-sd4zb^g% d@IPgc6?9+S3amm^y!=&sGte){x6vme<6pDQe7OJs literal 0 HcmV?d00001 diff --git a/static/images/case/qunar-logo.png b/static/images/case/qunar-logo.png deleted file mode 100644 index d63911afaaa0ded1f1709d087ccaccb5773ce9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8268 zcmd5>g;x~J*Iv3o>Xnwp1q4J|Qjl0mx=Xqx7Ni>#rMtTX7Fjx$?(UEkq*)eNIwbt| z_g{Q-&eWYVac0ik``qV#{h*;lLP$pl002l-lohlA08C6mp1v%Z%xyQdPwBfDSJs$f8H$kllk5t-{I#^{m*!s^5m09ev9j+~4c1A{9 z^p5}klK19f>eQA?)A~5{h;C)y69Tz~gZva_S}nzZVk#cex^JP+SctBkTW8Ql4*?7_v-^CBv(iSKLbJ|$psb~ z80LGY^pTIe<5N)H0G@e~sie$Rr&_G&VczjBWKwEHe}p=`1P4&+!i^zcGvrDIJ4Fvi zMC4?*F$PeW9@KUGuNyP18H0DhLy(|tZ z7MeycI?o;ve*E7gr|H3@+U-;E*0U!Ul68-~UZxc`Csu9wqVe&w%QVBl;h+5bLEZ%@ z?i73)?-EWJqD6{Jc4#ckK|%i;9PCYci4x1IT{19AHunWx7kO4q_>|yueWf(rUq|wo-#w|1yhmRd@-qsbvVtBNP^P;!ZEsL;+(k0G`YDcef%LW} z|AGjJO$4e+puXwzo$eMUHT0ci_oB%sB}?}q>&+hTcJi}+n4Ki|QKF#jRxmXFD_1U| zp_0hJUzTbnEfwiTEPXSh3i5AsW9^bCH@yY}K6nlE>rwGXS#FjVH#B<0@!^L@$-Ygx zd`S@aH@dB$cIk!Wg{j`h#Q=PYdWL2zMS6TXMdk1)&YSTl?L(+~mux~Nx7S5pPD=JX zUx>t0@Jy(jqBN)?jCWbxQ{;3m6(oHig=KVwS^_8W{1`1aUzT zn+9bI&&w7zKvn-#JWalQ`|oDlthgd-QIb?p?~ngfRJ;H!+Je?=%I~#$1Jf8ofL#nnfW1jsos#OPc z=P$!TU{us545lYo%fH-%)LNY^$1jph&(jD--4qQvAKqMM@Mno9*>v<`!wVn*N_Yhu z-0}Af!asKC%!2At{nxf0k)=Jq+O(1@4byg7T{GdUOWKOQOywfb`UWt~W#V6#Ch3gA zqWJ0}EL@dO4F3KK3C)525|T7qShPAhxcmc|B5G?XrqTQ6DHDttxWs<>ArrwQw4&_> z7m_m5!5ocgkMSy3>vT?DABmxv(rL#C6Q%X#g*;xH)OPDsV@L%Y-(IOH4J4_3s80R+ zOiap$@z-b7TI_3l!k=E^#2nf1m-18l9P%VqkmF2(K zK!%PVld1AtmzCjaMUj&K_H=kMQ)BbUXxP`f-N^2g%W;a6shL!27oK60^c(pIyua>r znG1}2X=w>!jh8DBPp&v)^Csk&zNpenA+_7b!abY$WAA3;&rDbyYyHD}<`lTO?aW

voD_HcKN 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 From 07fa6ffef1805be008f98b7a2c9c4e7f45db0641 Mon Sep 17 00:00:00 2001 From: fawei zhao Date: Mon, 15 Nov 2021 13:50:41 +0800 Subject: [PATCH 2/2] Update msxf.md --- content/zh/case/msxf.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/zh/case/msxf.md b/content/zh/case/msxf.md index 946b51dc0..416643457 100644 --- a/content/zh/case/msxf.md +++ b/content/zh/case/msxf.md @@ -35,7 +35,7 @@ section2: image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-5.png - title: contentList: - - content: 目前 grafana 社区并没有一个合适的 GPU 纬度展示模板,NVIDIA 也只给了一个主机纬度的相对粗糙的 Dashboard。目前我们用的 GPU Dashboard 是自己开发的。还有一个调用链纬度的监控: + - content: 目前 grafana 社区并没有一个合适的 GPU 纬度展示模板,NVIDIA 也只给了一个主机纬度的相对粗糙的 Dashboard。目前我们用的 GPU Dashboard 是自己开发的。还有一个调用链维度的监控: image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-6.png - title: contentList: @@ -43,7 +43,7 @@ section2: image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-7.png - title: contentList: - - content: 日志这里可以看到一个额外的信息,我们可以根据 app 纬度来聚合,也就是一个应用下的不同 Pod 产生的日志可以汇总展示。这里其实是简单地根据 pod 的 label 来实现的,将每个 Pod 打上应用相关的 label 信息,然后采集日志时将这个属性暴露出来,就能在展示时针对性汇总。在中台发布的应用有一个日志跳转按钮,转到 kibana 页面后会带上相关参数,实现该应用下全部日志聚合展示的功能。 + - content: 日志这里可以看到一个额外的信息,我们可以根据 APP 纬度来聚合,也就是一个应用下的不同 Pod 产生的日志可以汇总展示。这里其实是简单地根据 Pod 的 label 来实现的,将每个 Pod 打上应用相关的 Label 信息,然后采集日志时将这个属性暴露出来,就能在展示时针对性汇总。在中台发布的应用有一个日志跳转按钮,转到 Kibana 页面后会带上相关参数,实现该应用下全部日志聚合展示的功能。 - content: 到这里可以看到整个中台虽然看起来功能还算齐全,但是面板很多,日志监控和主页分别有各自的入口,虽然可以在主页跳转到日志和监控页面,但是这里的鉴权问题、风格统一问题等已经很不和谐。但是我们团队主打的是 AI 能力,人手也有限,没有太多的精力投入到统一 Dashboard 开发上,日志监控等虽然必不可少,但也不是核心能力。这也是引入 KubeSphere 的一个重要原因。后面还会详细谈到为什么引入 KubeSphere。 - content: 整个中台的底层架构如下图。整个中台构建在 Kubernetes 之上,在引入 KubeSphere 之前大致长这样,三主多从。 image: https://pek3b.qingstor.com/kubesphere-community/images/cic-msxf-8.png @@ -62,7 +62,7 @@ section2: - content: 功能组件选型复杂:要落地一套容器云并不是部署 Kubernetes 就够了,这里还有日志、监控、服务网格、存储等一系列相关组件需要落地实施,每一个方向都是涉及一系列可选方案,需要专门投入人力去学习、选型。 - content: 隐形成本高:就算部署了 Kubernetes,后期的日常运维也需要专业的团队,对于一般中小公司来说一个 Kubernetes 运维团队的人力成本也是不小的开支,很多时候花钱还招不到合适的人,往往会陷入部署了 Kubernetes,但是出问题无人能解决的尴尬境地,通过重装来恢复环境。 - content: 多租户模式实现复杂,安全性低:在 Kubernetes 里只有简单的 Namespace 隔离,配合 Quota 等一定程度上实现资源隔离,但是要 to C 应用还远远不够,很多时候我们需要开发一套权限管理系统来适配企业内专有的账号权限管理系统来对接,成本很高。 - - content: 缺少本土化支持:Kubernetes 一定程度上可以称为云操作系统,类比于 Linux,其实 Kubernets 更像是 kernel,我们要完整使用容器云能力,要在 Kubernets 之上附加很多的开源组件,就像 kernel 上要加很多的开源软件才能用起来 Linux 一样。很多企业,尤其是国企,会选择购买 Redhat 等来享受企业级支持,专注于系统提供的能力本身,而不想投入太多的人力去掌握和运维系统本身。Kubernetes 本身也有这样的问题,很多企业并不希望额外投入太大的成本去使用这套解决方案,而是希望有一个类似 Redhat 系统的 Kubernetes 版本来简单化落地,而且希望免费。 + - content: 缺少本土化支持:Kubernetes 一定程度上可以称为云操作系统,类比于 Linux,其实 Kubernets 更像是 kernel,我们要完整使用容器云能力,要在 Kubernets 之上附加很多的开源组件,就像 kernel 上要加很多的开源软件才能用起来 Linux 一样。很多企业,尤其是国企,会选择购买 Red Hat 等来享受企业级支持,专注于系统提供的能力本身,而不想投入太多的人力去掌握和运维系统本身。Kubernetes 本身也有这样的问题,很多企业并不希望额外投入太大的成本去使用这套解决方案,而是希望有一个类似 Redhat 系统的 Kubernetes 版本来简单化落地,而且希望免费。 image: - title: contentList: @@ -108,7 +108,7 @@ section2: - title: 总结 contentList: - - content: KubeSphere 提供了统一的门户、多租户支持、多场景整体化解决方案且易于集成,很好解决了落地Kubernetes所面临的各种痛点问题,能够有效降低人力资源成本,提升实施效率,实现业务价值最大化。 + - content: KubeSphere 提供了统一的门户、多租户支持、多场景整体化解决方案且易于集成,很好解决了落地 Kubernetes 所面临的各种痛点问题,能够有效降低人力资源成本,提升实施效率,实现业务价值最大化。 image: rightPart: @@ -125,4 +125,4 @@ section2: - title: 采用功能 content: 日志、监控 ---- \ No newline at end of file +---