基于 KubeSphere 的运管系统落地实践
作者:任建伟,某知名互联网公司云原生工程师,容器技术信徒,云原生领域的实践者。
背景介绍
在接触容器化之前,我们团队内部的应用一直都是基于虚拟机运管,由开发人员自行维护。
由于面向多开发部门服务,而开发人员运维能力参差不齐,所以每次部署新的环境时往往都要耗费大量时间。
针对部署难的问题,我们将部分组件、服务容器化,采用 Docker 发布管理解决了部分问题,但仍未降低对开发人员的运维技能要求。
下面是我们基于虚拟机管理开发环境的流程:
从上图中我们也能发现当前架构存在的问题:
- 下发虚机由各部开发人员管理,虚机安全问题难以维护、保障;
- 基于
shell
运维,专业性过强; - 基于手动打包、发布,耗时耗力且不可靠。
选型说明
针对上述提到的痛点,我们决定对运维架构进行改造。新建运管平台,技术选型整体基于云原生,优先选取 CNCF 项目。
Kubernetes 成为了我们平台底座的不二选择, 但 Kubernetes 原生的 Dashboard 不太满足实际使用需求。
而从头开发一套 workbench
又耗时耗力,由此我们目光转向了开源社区。
此时,一个集颜值 + 强大功能于一身的开源项目进入我们视野。是的,它便是 KubeSphere。
而 KubeSphere
愿景是打造一个以 Kubernetes
为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。
对于 KubeSphere
能否作为部署平台,最终结论如下:
KubeSphere
虽功能强大,但更适合作为管理端使用,不太适合面向普通用户。
我们需要本地化一套 workbench
,简化部分功能,屏蔽专业性术语(如工作负载、容器组、安全上下文等)。
本地化部分内容如下:
- 基于企业空间、命名空间,本地化租户、工作空间的概念,一个租户(企业空间)可管理一个到多个工作空间(命名空间),并接入独立用户体系。
- 本地化应用发布流程: 由拆分的应用发布流程(构建镜像+创建负载),本地化为:创建应用 -> 上传 jar -> 指定配置 -> 启动运行的串行流程。
- 本地化链路监控:构建镜像预先埋点,创建应用时选择是否开启链路追踪。
- 本地化配置、应用路由等,添加版本管理功能。
事实上,我们本地化的重点是应用管理,但是 KubeSphere
功能过于强大、特性过于灵活,导致配置起来项过于繁琐。
针对部分配置项我们采用设置默认值的方式,而非交由用户去配置。(比如:容器安全上下文、同步主机时间、镜像拉取策略、更新策略、调度策略等)
改造后的运维架构如下:
实践过程
基于 KubeSphere 的运管平台整体架构如下:
环境信息表:
名称 | 版本 | 说明 |
---|---|---|
kukekey | v1.0.1 | KubeSphere 安装工具 |
kubesphere | v3.0.0 | 基于 K8s 的面向云原生应用的分布式操作系统 |
kuberentes | v1.18.6 | 容器编排系统 |
docker | v19.03.15 | 容器引擎 |
CentOS | 7 | 操作系统 |
kernel | 5.4 | 操作系统内核 |
本地化部署流程如下:
镜像本地化
1️⃣ 基于 harbor 搭建私有镜像库。
2️⃣ 离线下载并上传 kubesphere 依赖镜像至私有 harbor 内,project 名称保持不变。
3️⃣ 本地化 B2I 基础镜像,本地化如下内容:
- 内置 Arthas,便于调试;
- 内置 SkyWalking Agent 用于集成链路追踪;
- 内置 Prometheus Agent 用于指标监控;
- 添加
windows
字体。
4️⃣ 本地化应用商店初始化镜像(openpitrix/release-app
)。
由于预置的 chart
有很多我们实际并未使用,所以我们删除预置了 chart
,并导入实际所需 chart
(包括本地化的中间件 chart
、中台 chart
)
5️⃣ 镜像 GC。
针对频繁构建的 repo
,配置合理的 GC
策略:
搭建 K8s
基于 KubeKey 1.0.1 部署了三主多从节点 K8s v1.18.6 集群:
搭建 Rook 集群
使用 KubeKey 1.0.1 新增三个存储节点并打上污点标签,搭建 Rook 集群
对于存储的替换主要出于以下方面考虑:
- 有 Ceph 裸机部署使用经验;
- 对比默认存储 OpenEBS Local PV,Rook 支持多存储类型;
- Rook 为 CNCF 毕业项目。
搭建 KubeSphere 平台
基于 KubeKey 1.0.1 部署了 KubeSphere,未作本地化修改。
CI/CD 实践
CI/CD
部分我们并没有使用 KubeSphere 提供的流水线功能,而是选择 gitlab-runner + ArgoCD
方案。
CI 实现
CI
部分利用 gitlab-ci
切换构建时特性,我们抽象出了 provider
概念。provider
本质为工具 / 程序的容器化封装,提供某一方面能力了。如:
- maven-provider:
java
程序构建时环境,内置私有nexus
配置; - npm-provider:
nodejs
程序构建时环境,内置私有npm
源配置; - email-provider:
smtp
交互程序,用于邮件通知; - chrome-headless-provider: 浏览器截屏。
使用时,只需引用并传递相应参数即可:
variables:
AAA: xxx
BBB: yyy
stages:
- build
- scan
- email
build:
stage: build
image: harbor.devops.io/devops/maven-provider
tags:
- k8s-runner
script:
- mvn clean package
only:
refs:
- develop
changes:
- src/**/*
scan:
stage: scan
image: harbor.devops.io/devops/sonar-provider
tags:
- k8s-runner
script: xxx
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
email:
stage: email
image: harbor.devops.io/devops/sendmail
tags:
- k8s-runner
script:
- /work/send-mail sonar --email-to=$EMAIL_TO_LIST --email-cc=$EMAIL_CC_LIST --sonar-project-id=$PROJECT_NAME --sonar-internal-url=$SONAR_INTERNAL_ADDR --sonar-external-url=$SONAR_EXTERNAL_ADDR
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
CD 实现
CD
部分,我们利用 chart
对应用进行定义,并将 chart
剥离于开发库,独立于配置库进行管理,用于 ArgroCD
同步。
对于配置库与开发库分离,主要出于以下考虑:
- 清晰分离了应用程序代码与应用程序配置。
- 更清洁的审计日志:出于审计目的,只保存配置库历史更改记录,而不是掺有日常开发提交的日志记录。
- 访问的分离:开发应用程序的开发人员不一定是能够 / 应该推送到生产环境的同一个人,无论是有意的还是无意的。
通过使用单独的库,可以将提交访问权限授予源代码库,而不是应用程序配置库。 - 自动化
CI Pipeline
场景下,将清单更改推送到同一个Git
存储库可能会触发构建作业和Git
提交触发器的无限循环。
使用一个单独的repo
来推送配置更改,可以防止这种情况发生。
角色划分
角色方面,我们定义了三种类型角色,职责如下:
使用效果
通过引入 KubeSphere 平台以及 CI/CD
,效率提升明显:
- 计算资源池化,不再下发虚机,计算资源统一运管;
- 基于容器化的流水线构建、发布应用,保障了构建的可靠性,同时解放双手;
- 基于本地化
workbench
运维,由于屏蔽了专业性词汇术语,降低使用者学习成本。日志查看、应用更新等操作更为便捷; - 针对角色的划分,使得运维边界清晰,责任明确。
问题 & 解决
在一年多的容器平台使用过程中,我们遇到了蛮多的小问题,这里我举几个有代表性的例子:
B2I 没有清理策略
存在问题:
在使用 kubesphere v3.0 的过程中我们发现:不断通过 B2I 构建应用,会产生大量的 B2I 任务记录,并且 minio 内上传的程序包文件越来越多,且并没有相应的清理策略。
解决方案:
开发定时 job
, 定期进行清理。
内核版本过低,导致容器相关漏洞的发生
存在问题:
初期,我们使用 CentOS7
默认的 3.10 版本内核。
解决方案:
升级内核版本至 5.x。
链路追踪
存在问题:
KubeSphere 预装的 jaeger
不支持 dubbo
协议,无法对 dubbo
应用进行监控。
解决方案:
利用 SkyWalking 用于链路追踪,并在基础镜像内埋点。
报表相关服务缺少字体
解决方案:
将缺少 windows
字体安装至 B2I
基础镜像内。
- 路由集群外服务
由于部分应用部署于 K8s 外部,针对这部分应用我们选择 Endpoint + ExternalName + Ingress
的方式进行路由。
未来规划或展望
1️⃣ 有状态应用的 Operator
开发
当前有状态应用依赖 helm hook
管理, 且功能单一。
未来我们计划,针对常用有状态应用,开发对应 operator
,提供创建、扩容、备份等常用功能。
2️⃣ CNI 迁移至 Cilium
选取 Cilium
替换 Calico
主要出于以下考虑 :
Cilium
为CNCF
毕业项目,活跃度高;Cilium
基于eBPF
实现,在粒度和效率上实现了对系统和应用程序的可观测性和控制;Cilium
安全防护功能更强,提供了过滤单个应用协议请求的能力,例如 :- 允许所有使用
GET
方法和/public/.*
路径的HTTP
请求,拒绝所有其他请求; - 允许
service1
在Kafka
主题topic1
上生产,允许service2
在topic1
上消费,拒绝所有其他 Kafka 消息; - 要求
HTTP
报头X-Token:[0-9]+
出现在所有REST
调用中。
- 允许所有使用
3️⃣ cri 由 Docker 替换为 Containerd
4️⃣ 容器文件浏览器功能开发
当前阶段,开发人员下载容器内文件的需求,只能由运维人员使用 kubectl cp
的方式协助获取,后续我们规划开发容器文件浏览器相应功能。
5️⃣ 容器宿主机系统替换为 rocky
,以应对 CentOS
停止维护。
本文由博客一文多发平台 OpenWrite 发布!
基于 KubeSphere 的运管系统落地实践的更多相关文章
- 京东基于Spark的风控系统架构实践和技术细节
京东基于Spark的风控系统架构实践和技术细节 时间 2016-06-02 09:36:32 炼数成金 原文 http://www.dataguru.cn/article-9419-1.html ...
- 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践
本文由马蜂窝技术团队电商交易基础平台研发工程师"Anti Walker"原创分享. 一.引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个 ...
- 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台
背景 从传统运维到容器化的 Docker Swarm 编排,从 Docker Swarm 转向 Kubernetes,然后在 Kubernetes 运行 SpringCloud 微服务全家桶,到最终拥 ...
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
- 基于微服务的DevOps落地指南 交付效率提升40%
基于微服务的DevOps落地指南 交付效率提升40% 2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ... 珍爱网是以“网络征选+人工红娘”模 ...
- [转载]DevOps在传统企业的落地实践及案例分享
内容来源:2017年6月10日,优维科技高级解决方案架构师黄星玲在“DevOps&SRE 超越传统运维之道”进行<DevOps在传统企业的落地实践及案例分享>演讲分享.IT 大咖说 ...
- 鸿蒙HarmonyOS应用开发落地实践,Harmony Go 技术沙龙落地北京
12月26日,华为消费者BG软件部开源中心与51CTO Harmony OS技术社区携手,共同主办了主题为"Harmony OS 应用开发落地实践"的 Harmony Go 技术沙 ...
- TKE用户故事 | 作业帮检索服务基于Fluid的计算存储分离实践
作者 吕亚霖,2019年加入作业帮,作业帮基础架构-架构研发团队负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 张浩然,2019年加入 ...
- DevOps落地实践点滴和踩坑记录-(1)
记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...
- 互联网研发效能之去哪儿网(Qunar)核心领域DevOps落地实践
本文从业务目标角度出发,确定了开源+自建模式搭建 Qunar 研发工具链整体生态:通过 APPCODE 打通工具链,流程规范化自动化:多种手段+发布门禁助力质量提升:建立应用画像确定运维最小单元,可发 ...
随机推荐
- 学历史有什么用——视频分享:學歷史的大用:呂世浩(Shih-Hao Lu) at TEDxTaipei 2014
网上看到的不错的视频: https://www.youtube.com/watch?v=Ap0w3PgSK7g ============================================ ...
- 如何在AWS上构建Apache DolphinScheduler
引言 随着云计算技术的发展,Amazon Web Services (AWS) 作为一个开放的平台,一直在帮助开发者更好的在云上构建和使用开源软件,同时也与开源社区紧密合作,推动开源项目的发展. 本文 ...
- Linux驱动 | 从0写一个设备树节点实例
一.前言 设备树是每一个Linux驱动工程师都必须掌握的一个知识点,有很多之前做单片机的朋友刚接触Linux驱动时,会一脸懵! 其实设备树的使用并没有大家想像的那么复杂,对于大部分工程师来说,只要会修 ...
- 最短路之Dijkstra
Dijkstra算法: Dijkstra是一种求解 非负权图 上单源最短路径的算法. 思路:将所有结点分为两个集合:已经确定最短路径的点(S)和未确定最短路长度的点集(T),开始时所有点都属于T 初始 ...
- zabbix 自定义用户key与参数userparameters监控监本输出
zabbix在模板中预定义了一些key,但通常情况,并不能满足我们的需求.幸运的是zabbix提供了自定义key的方法,因此我们可以灵活的监控各种我们想要监控的数据. 定义key有两种修改方式: vi ...
- 电商API接口应该如何使用?
从定义上看,API接口是指预先定义的一组规则和协议,允许不同的软件应用之间相互通信和交换数据. 目前,市场中电商行业用到API接口的场景较多,电商API接口则是专门针对电子商务应用场景所提供的API, ...
- FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一个国产的移动端视频播放器,它采用了IJKPlayer.Media3(EXOPlayer).MediaPlayer.AliPlayer等四种播放器内核,支持弹幕.滤镜. ...
- Dell存储备份告警:
创建时间 修改日期 对象名称 消息 类型 告警状态 已确认 告警定义 类型 23-3-12 11:59:26 23-3-12 11:59:37 copyMirrorswap 2 CMs Operati ...
- c程序设计语言 by K&R(四)输入与输出
一.标准输入.输出 1. 简单的输入\输出机制 从标准输入中一次读取一个字符:int getchar(void) 将字符c送到标准输出中: int putchar(int) 2. 输入重定向 如果程序 ...
- Mybatis骚操作-通用查询工具类
老项目大多都有对JDBC进行了封装,可以直接执行SQL的工具类,在做项目升级改造的时候(这里仅指整合mybatis),要么全部调整成dao-xml的形式(会有改动代码多的问题,而且看代码时需要xml和 ...