基于 KubeSphere 的运管系统落地实践

news2024/11/23 18:37:37

作者:任建伟,某知名互联网公司云原生工程师,容器技术信徒,云原生领域的实践者。

背景介绍

在接触容器化之前,我们团队内部的应用一直都是基于虚拟机运管,由开发人员自行维护。

由于面向多开发部门服务,而开发人员运维能力参差不齐,所以每次部署新的环境时往往都要耗费大量时间。

针对部署难的问题,我们将部分组件、服务容器化,采用 Docker 发布管理解决了部分问题,但仍未降低对开发人员的运维技能要求。

下面是我们基于虚拟机管理开发环境的流程:

从上图中我们也能发现当前架构存在的问题:

  • 下发虚机由各部开发人员管理,虚机安全问题难以维护、保障;
  • 基于 shell 运维,专业性过强;
  • 基于手动打包、发布,耗时耗力且不可靠。

选型说明

针对上述提到的痛点,我们决定对运维架构进行改造。新建运管平台,技术选型整体基于云原生,优先选取 CNCF 项目。

Kubernetes 成为了我们平台底座的不二选择, 但 Kubernetes 原生的 Dashboard 不太满足实际使用需求。

而从头开发一套 workbench 又耗时耗力,由此我们目光转向了开源社区。

此时,一个集颜值 + 强大功能于一身的开源项目进入我们视野。是的,它便是 KubeSphere。

KubeSphere 愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。

对于 KubeSphere 能否作为部署平台,最终结论如下:

KubeSphere 虽功能强大,但更适合作为管理端使用,不太适合面向普通用户。

我们需要本地化一套 workbench ,简化部分功能,屏蔽专业性术语(如工作负载、容器组、安全上下文等)。

本地化部分内容如下:

  • 基于企业空间、命名空间,本地化租户、工作空间的概念,一个租户(企业空间)可管理一个到多个工作空间(命名空间),并接入独立用户体系。
  • 本地化应用发布流程: 由拆分的应用发布流程(构建镜像+创建负载),本地化为:创建应用 -> 上传 jar -> 指定配置 -> 启动运行的串行流程。
  • 本地化链路监控:构建镜像预先埋点,创建应用时选择是否开启链路追踪。
  • 本地化配置、应用路由等,添加版本管理功能。

事实上,我们本地化的重点是应用管理,但是 KubeSphere 功能过于强大、特性过于灵活,导致配置起来项过于繁琐。

针对部分配置项我们采用设置默认值的方式,而非交由用户去配置。(比如:容器安全上下文、同步主机时间、镜像拉取策略、更新策略、调度策略等)

改造后的运维架构如下:

实践过程

基于 KubeSphere 的运管平台整体架构如下:

环境信息表:

名称版本说明
kukekeyv1.0.1KubeSphere 安装工具
kubespherev3.0.0基于 K8s 的面向云原生应用的分布式操作系统
kuberentesv1.18.6容器编排系统
dockerv19.03.15容器引擎
CentOS7操作系统
kernel5.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 基础镜像内。

  1. 路由集群外服务

由于部分应用部署于 K8s 外部,针对这部分应用我们选择 Endpoint + ExternalName + Ingress 的方式进行路由。

未来规划或展望

1️⃣ 有状态应用的 Operator 开发

当前有状态应用依赖 helm hook 管理, 且功能单一。 未来我们计划,针对常用有状态应用,开发对应 operator,提供创建、扩容、备份等常用功能。

2️⃣ CNI 迁移至 Cilium

选取 Cilium 替换 Calico 主要出于以下考虑 :

  • CiliumCNCF 毕业项目,活跃度高;
  • Cilium 基于 eBPF 实现,在粒度和效率上实现了对系统和应用程序的可观测性和控制;
  • Cilium 安全防护功能更强,提供了过滤单个应用协议请求的能力,例如 :
    • 允许所有使用 GET 方法和 /public/.* 路径的 HTTP 请求,拒绝所有其他请求;
    • 允许 service1Kafka 主题 topic1 上生产,允许 service2topic1 上消费,拒绝所有其他 Kafka 消息;
    • 要求 HTTP 报头 X-Token:[0-9]+ 出现在所有 REST 调用中。

3️⃣ cri 由 Docker 替换为 Containerd

4️⃣ 容器文件浏览器功能开发

当前阶段,开发人员下载容器内文件的需求,只能由运维人员使用 kubectl cp 的方式协助获取,后续我们规划开发容器文件浏览器相应功能。

5️⃣ 容器宿主机系统替换为 rocky,以应对 CentOS 停止维护。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway ODBC数据上传(四)

目录 1、前言 2、Thingsboard Gateway 1.tb-gateway的概念 2.tb-gateway的配置 3.odbc连接器配置 3、ODBC的配置 1.安装window的ODBC驱动程序 2.配置ODBC的驱动程序信息 4、效果展示 1、前言 项目中会出现这样的情况,有个平台搭建在本地,而数据也存…

Jenkins构建并部署一个go语言项目

Jenkins安装 1、下载 安装java [rootlocalhost ~]# yum install java-1.8.0-openjdk* -y 方式一: #下载安装包 [rootlocalhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.249.1-1.1.noarch.rpm #安装Jenkins [rootlocalhost…

【excel导入、导出】pom、实体类、工具类、例子

目录 一、环境搭建: pom: 实体类(ExcelClassField ): 工具类: 二、【示例】导入 controller: service 实体类: 注意: 三、【示例】导出 controller: …

搜索与图论 - bellman-ford 算法

文章目录一、为什么 Dijkstra 算法不适用于含负权的图1. 理论推导2. 实例演示2.1 详细步骤2.2 结果二、bellman-ford 算法1. 简介2. 基本思路3. 简单举例4. bellman-ford 算法具体实现过程详见例题有边数限制的最短路。三、bellman-ford 算法例题——有边数限制的最短路具体实现…

仓库24代 “ CK_Label_v24

产品型号 CK_Label_v24 尺寸 124x90x12mm(不含安装支架) 屏幕尺寸 4.2 inch 显示技术 电子墨水屏显示 显示区域面积 (mm) 84.8(H) x 63.6(V) 分辨率 400*300 像素密度 120dpi 显示颜色 黑/白 外观颜色 白色&灰外圏 按键 3 指示灯…

【C++】STL标准模板库

目录 一、概念 STL的四种基本组件 容器vector 迭代器iterator 函数对象function object 算法algorithm 二、使用 容器vector的使用 泛型程序设计: 所谓泛型程序设计就是编写不依赖于具体数据类型的程序。C中,模板就是泛型程序设计的主要…

一次疑似 JVM native 内存泄漏的排查实录

最近开发同学反馈,某定时任务服务疑似有内存泄漏,整个进程的内存占用比 Xmx 内存大不少,而且看起来是缓慢上升的,做了下面这次分析,包括下面的内容: 分析 JVM native 内存的一些常见思路内存增长了&#x…

关于Arduino连接L298N供电问题

关于Arduino连接L298N供电问题 查看原文 该L298N板声称有一个5V稳压器为Arduino供电,在这种情况下,您可以使用单个电源,并让电机板为Arduino供电。 关于为Arduino和电机提供动力有两种思想流派: 使用两个独立的电源&#xff0…

NumPy 的使用

NumPy(Numerical Python)是Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,同时也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早由 Jim Hugunin 与其他协作者共同开发,2005 年&#xff0…

百万千万爆款视频的脚本是怎么写出来的?两套模板教你做同款

那些百万千万爆款视频的脚本是怎么写出来的?两套模板教你做同款。 每天都能刷到百万赞的短视频,看看自己的视频点赞量,失落是一种感觉,其实你也可以做出优秀的爆款文案。 今天给大家介绍两种短视频脚本模板,大家可以…

idea手动创建干净的maven项目,很简单

大家好,今天我们分享使用idea开发工具创建干净的maven项目 这是Maven的官网: 点一下就可以 首先,我们来了解一下什么是Maven,就是说关于Maven这个东西你要知道的是 1.Maven是一个跨平台(在很多平台上都可以使用&…

B4:Unity制作Moba类游戏——小兵AI系统

若想取得战争的胜利,必先控好兵线。 ———— 麦克阿瑟 是时候让敌人经历一下我们兵线的洗礼。 ———— 拿破仑 在LOL对局中,职业选手对兵线的控制可以说是达到了“运筹帷幄之中,决胜千里之外”。其实普通玩家只要控好兵线,在对线中一样可以…

Java Servlet详解(补充,极其重要)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

SwiftUI 中列表行(List Row)展开和收起无动画或动画诡异的解决

文章目录 问题现象问题分析1. 为什么 List 行展开与收起没有动画效果?2. 第一种解决方法3. 另一种巧妙的解决总结结束语问题现象 SwiftUI 中展开(expand)和收起(collapse)列表行(List Row)是一个常见的操作,不过默认来说这样的操作不会有动画效果: 如上图所示,我们为…

粒子滤波算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

CpG ODN——艾美捷ODN 1826 (TLRGRADE)说明书

艾美捷CpG ODN系列——ODN 1826 (TLRGRADE):具有硫代磷酸酯骨架的CpG寡脱氧核苷酸(B型)。小鼠TLR9(Toll样受体9)的特异性配体。 艾美捷CpG ODN 丨ODN 1826 (TLRGRADE)化学性质: 备选名称:CpG-B…

Suspense组件

先上官网&#xff1a;https://cn.vuejs.org/guide/built-ins/suspense.html 注意一下 <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 在使用了之后在浏览器控制台会有如下打印&#xff0c;至少目前是…

【大数据】有关zookeeper的问题

如图&#xff0c;启动zookeeper失败&#xff0c;输入 zkServer.sh start-foreground 查看失败原因 Invalid config&#xff0c;我得知是配置文件出了问题&#xff0c;但是检查配置文件没有发现错误 最终在配置文件末尾配置参数结尾发现了未删除的空格 将三个节点配置文件中的…

C/C++ 和 Java的编译运行机制比较 个人理解

计算机程序语言按程序的执行方式可分为编译型语言和解释性语言。 编译型语言是指使用专用的编译器&#xff0c;针对某操作系统将高级语言源代码一次性地翻译成可被该系统硬件执行的机器码(包括机器指令和操作数&#xff09;&#xff0c;并包装成该系统所能识别的可执行程序的格…

同事开源我的微服务深度实践笔记到 GitHub,短短 3 天竟吸粉 1W+

说Spring成就了Java&#xff0c;Spring是Java程序员必修课之一&#xff0c;应该没人反对吧&#xff1f;前几年面试最常问的且可以顺利拿到高薪的技能是Spring&#xff0c;随着Spring体系的壮大&#xff0c;除非你在简历上添加Spring Boot和Spring Cloud的技能&#xff0c;才可以…