花生好车基于 KubeSphere 的微服务架构实践

公司简介

花生好车成立于 2015 年 6 月,致力于打造下沉市场汽车出行解决方案第一品牌。通过自建直营渠道,瞄准下沉市场,现形成以直租、批售、回租、新能源汽车零售,四大业务为核心驱动力的汽车新零售平台,目前拥有门店 600 余家,覆盖 400 余座城市,共设有 25 个中心仓库。目前已为超 40 万以上用户提供优质的用车服务,凭借全渠道优势和产品丰富度成功领跑行业第一梯队。

背景介绍

公司在自建 IDC 机房的物理服务器使用 kvm 作为底层虚拟机管理,随着业务增加,导致系统存在一些问题,故有了此次底层基础架构改造实践。

如:

  • 利用率不饱和:各类服务器的 CPU 利用率普遍不饱和,闲时利用率低下,且忙闲不均;
  • 耗能大:服务器需求量大,机柜、网络、服务器等利用率低;
  • 基础资源庞杂:底层标准化不一,无法传承;
  • 资源共享不足:烟筒式建设模式,资源相互隔离且固定投资成本高,为满足业务峰值,需采购大量数据扩容服务器产品等;
  • 存储容量不断上升,逻辑存储设备增加,管理复杂和强度增大;
  • 业务网缺乏总体发展规划,部分系统或平台的功能定位不清晰,跨部门、跨区域、跨系统的流程界面模糊;
  • 系统开发和上线周期长,后期维护和问题定位开销大,平台的独立建设多为烟筒式建设和孤岛化解决方案;
  • 业务流程,平台结构和接口缺乏统一规范和要求。

平台选型

作为 DevOps 运维团队,我们需要提供自助化的综合运维平台。在开源平台选型时,公司最终选择了 KubeSphere:

  1. 完全开源,无收费,可进行二次开发;
  2. 功能丰富,安装简单,支持一键升级和扩容,完善的 DevOps 工具链;
  3. 支持多集群管理,用户可以使用直接连接或间接连接导入 Kubernetes 集群;
  4. 集成可观测性,可按需添加想要监控的指标以及告警,以及日志查询;
  5. 自定义角色和审计功能,便于后续数据分析。

相比其他平台,KubeSphere 更好地规避了 Kubernetes 本身的复杂性,也减少了集成各类开源工具的工作量。这使得我们可以更专注于运维自动化与自助化平台建设,而不需要单独管理底层基础架构与服务。提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。因此 KubeSphere 成为我们满足公司需求的最佳选择。

实践过程

基础设施建设与规划

Kubernetes 集群

因业务需要,我们将测试、生产两套环境独立开,避免相互影响。生产如上图所示是三个 Matsre 节点,目前为十三个 Node 节点,这里 Master 节点标注污点使其 Pod 不可调度,避免主节点负载过高等情况发生。

生产环境使用了官方推荐的 Keepalived 和 HAproxy 创建高可用 Kubernetes 集群 高可用 Kubernetes 集群能够确保应用程序在运行时不会出现服务中断,这也是生产的需求之一。

上图为官方文档,详细介绍可参考。

发版工作流示意图:

底层存储环境

底层存储环境,我们并未采用容器化的方式进行部署,而是以传统的方式部署。这样做也是为了高效,而且在互联网业务中,存储服务都有一定的性能要求来应对高并发场景。因此将其部署在裸机服务器上是最佳的选择。

MySQL、Redis、NFS 均做了高可用,避免了单点问题,Ceph 是作为 KubeSphere StorageClass 存储类通过 cephfs 挂载,目前大部分为无状态应用,后续部署有状态应用会对存储进一步优化。

监控平台

为日常高效使用 KubeSphere,我们将集成的监控告警进行配置,目前大部分可满足使用,至于 node 节点,通过单独的 PMM 监控来查看日常问题。

告警示例:

监控示例:

使用效果

引入 KubeSphere 很大程度的减轻了公司研发持续集成、持续部署的负担,极大提升了整个研发团队生产里项目交付效率。研发团队只需自行在本地实现 function 修复 Bug,之后 Commit 提交代码至 git,然后基于 Jenkins 发布测试环境/生产环境的工程,此时整套 CI/CD 持续集成交付的工作流程就彻底完成了,剩余的联调工作就交给研发。

基于 KubeSphere 实现 DevOps,给我们带来了最大的效率亮点如下:

  • 平台一体化管理:在服务功能迭代方面,只需要登录 KubeSphere 平台,点击各自所负责的项目即可,极大的减轻了部署工作量,可以通过 Jenkins 结合 KubeSphere,同样能实现项目交付工作,但整套流程相对繁琐,既要关注 Jenkins 平台的构建情况,同时也要关注 KubeSphere 交付结果;造成了诸多不便,也背离了我们交付的初衷,后续我们可能通过 KubeSphere 自带的自定义流水线来统一管理。

  • 资源利用率显著提高:KubeSphere 和 Kubernetes 相结合,进一步优化了系统资源利用率,降低了使用成本,最大限度增加了 DevOps 资源利用率。

未来规划(改进)

目前通过这次生产项目中引入 KubeSphere 云原生平台实践,发现确实给我们解决了微服务部署和管理的问题,基于 KubeSphere 平台的能力进行云原生架构的迁移,极大的提高我们的便捷性。负载均衡、应用路由、自动扩缩容、DevOps 等

在平台助力下,我们的研发和运维效率显著提升。我们相信运用 KubeSphere 的云原生平台,服务网格治理、金丝雀、灰度发布、链路追踪必将为公司下一步业务增长提供坚实基础。

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

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

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

相关文章

【Mybatis源码】XPathParser解析器

XPathParser是Mybatis中定义的进行解析XML文件的类,此类用于读取XML文件中的节点文本与属性;本篇我们主要介绍XPathParser解析XML的原理。 一、XPathParser构造方法 这里我们介绍主要的构造方法 public XPathParser(InputStream inputStream, boolean validation, Propert…

GateWay 常用配置文件

--- #端口 server:#运行端口port: 11112ssl: 配置sslkey-store: classpath:xxx.work.jkskey-store-password: a2bh5642ot3key-store-type: JKSenabled: true#spring: # cloud: # gateway: # --- #服务器信息 spring:application:#服务注册名称name: service-getwaycloud:ga…

nuxt使用i18n进行中英文切换

中文效果图: 英文效果图: 版本: 安装: npm install --save nuxtjs/i18n 新建en.js与zh.js两个文件进行切换显示 en.js内容 import globals from ./../js/global_valexport default {/******* 公共内容开始* *****/seeMore: &quo…

基于食肉植物优化的BP神经网络(分类应用) - 附代码

基于食肉植物优化的BP神经网络(分类应用) - 附代码 文章目录 基于食肉植物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.食肉植物优化BP神经网络3.1 BP神经网络参数设置3.2 食肉植物算法应用 4.测试结果…

Kotlin 协程再探之为什么使用协程反而更慢了?

前言 在几个月前,我曾经写了一篇文章,Kotlin 协程中的并发问题:我明明用 mutex 上锁了,为什么没有用?,讲述在某次 debug 某个问题时,发现同事写的 Koltin 协程某个不恰当的地方,并最…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)

构建pytorch训练模型读取的数据,是有模版可以参考的,是有套路的,这点相信使用过的人都知道。我也会给出一个套路的模版,方便学习和查询。 同时,也可以先去参考学习之前的一篇较为简单的3D分类任务的数据构建方法,链接在这里:【3D图像分类】基于Pytorch的3D立体图像分类…

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构前言典型的微服务架构是什么样的微服务的优势 微服务最佳实践在开发微服务时,我们需要遵循以下最佳实践: 微服务通常使用什么技术堆栈…

笔记:绘图进阶

主要功能: 双坐标轴多子图共用一个横坐标横坐标时间刻度设置(简便方法)自定义时间坐标轴起止时间 # -*- coding: utf-8 -*-import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdatesif …

小程序跨页面传递参数的几种方式

当我们在开发小程序时,经常会遇到需要在不同页面之间传递数据的情况。为了实现页面间的数据传递,小程序提供了多种方法。下面将介绍几种常用的传递数据的方法。 URL参数传递:这是一种简单直接的传递数据的方式。在跳转页面时,可以…

为什么每个跳表结点的层高都是1至32之间的随机数?

跳表节点的层高通常是一个随机数或者根据概率分布得到的值,这是为了提高跳表的性能和均衡性。以下是关于为什么这么设计的一些解释: 均衡性: 使用随机层高可以使跳表中的节点分布更加均匀,减少了极端情况下跳表的高度。如果每个节…

网站技术查看

当打开一个网页感觉很好奇,他使用了什么框架和什么技术? 常用的网页技术分析网站。 1. w3techs Check web technologies used by a website - Site InfoW3Techs identifies which web technologies such as CMS, programming language, web server an…

​CUDA学习笔记(四)device管理

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置。 本博文将主要介绍下面两方面内容&…

Linux的shell(极其粗糙版)

Shell脚本: 脚本主要是为了业务,辅助人工,实现自动化运维 Shell:介于用户和内核之间,充当翻译官的作用,当用户执行相关的命令,shell会把指令二进制传给内核,内核处理完毕以后通过shell把内核的…

算法学习之 背包01问题 , 备战leecode

来看题目 我们分析一下题目&#xff0c;首先我们要排序&#xff0c;这有助于我们得到最大的值&#xff0c;我们要得到一个递推公式 代码如下: class Solution { public:int maxSatisfaction(vector<int>& satisfaction) {int n satisfaction.size();vector<v…

2023-10-19 node.js-将异步处理修改为同步-使用Promise和async-记录

摘要: 2023-10-19 node.js-将异步处理修改为同步-使用Promise和async-记录 使用promise和async将异步修改为同步: const fs require(fs);f1 function() {return new Promise(resolve > {fs.readFile(f1.txt, utf8, (err, data) > {if (err) reject(err);else resolve(…

flutter开发实战-安卓apk安装、卸载、启动实现

flutter开发实战-安卓apk安装、卸载、启动实现 在之前的文章中&#xff0c;实现了应用更新apk下载等操作&#xff0c;具体文档看下 这里记录一下使用shell来操作apk的安装、卸载、启动的操作。用到了库shell&#xff0c;Shell用于在Dart中或在代表其他用户执行系统管理任务的…

计算几何相关笔记

距离 欧拉距离 就是我们最熟悉的两点之间距离公式&#xff1a; d ( x 1 − x 2 ) 2 ( y 1 − y 2 ) 2 d\sqrt{(x_1-x_2)^2(y_1-y_2)^2} d(x1​−x2​)2(y1​−y2​)2 ​ 曼哈顿距离 相对于欧拉距离&#xff0c;曼哈顿距离的计算更加简单&#xff0c;并且没有开方过程&…

微软官方推出的四款工具,太实用了,值得收藏

目录 一、Officeplus——丰富的办公资源库 二、微软数学求解器 三、微软内置edge浏览器 四、Microsoft To-Do 办公待办神器 所以今天小编给大家分享4个微软官方推出的实用工具&#xff0c;每一个都非常好用&#xff0c;对于大家日常办公&#xff0c;非常有必要&#xff0c;感兴…

maven-plugin-shade 详解

一、介绍 [1] This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. maven-plugin-shade 插件提供了两个能力&#xff1a; 把整个项目&#xf…

C语言--冒泡排序和简答选择排序

冒泡排序 一种典型的交换排序 类似水冒泡&#xff0c;大元素经不断的交换由水底慢慢的浮出 从头到尾&#xff0c;循环比较两相邻的元素 大的元素移到后面&#xff0c;小的放前面-每次循环&#xff0c;大的元素会排到最后 代码如下&#xff1a; #include<stdio.h> …