怡合达业务大规模容器化最佳实践

news2024/11/25 6:28:34

作者:肖念康,东莞怡合达智能制造供应链资深 Java 开发工程师,主要负责公司内部 DevOps、代码托管平台、任务需求管理平台的研发及其他项目的管理,云原生的研究与开发工作。

公司简介

怡合达致力于自动化零部件研发、生产和销售,提供 FA 工厂自动化零部件一站式供应,怡合达深耕自动化设备行业,基于应用场景对自动化设备零部件进行标准化设计和分类选型,通过标准设定、产品开发、供应链管理、平台化运营,以信息和数字化为驱动,为自动化设备行业提供高品质、低成本、短交期的自动化零部件产品。

技术现状

  • 在使用 Kubernetes 之前,公司一直是采用超融合传统虚拟机的方式来部署上线项目,这就导致公司资源浪费非常严重,每年单单在服务器的开销就大大增加。
  • 项目在上线的过程中出错的几率非常大,并且难以排查,没有一套规范的流程,需要开发人员手动部署,导致人员消耗非常严重。

团队规模

目前公司拥有 3000+ 的员工,其中研发团队(运维,开发,测试,产品等)超过 300 人,在苏州,湖北都有研发团队。

背景介绍

目前行业正在向自动化、云原生靠近,传统的互联网模式已经无法满足大公司的业务需求了,为了让开发人员将更多的精力放在业务上,自动化部署、项目的全方位监控就变得越来越重要。

目前公司云原生是刚刚起步,很多东西需要去探索发现,所以技术上有很多欠缺,需要非常细致的理解各个组件的运行原理和模式。

拥抱云原生就意味着公司的 IT 层面将上升一个等级,原有的项目治理将完全摒弃,将会以一套全新的方式来全方位地治理项目,使用 Kubernetes 和容器化技术将减少服务的运维成本和项目的容错成本,为客户带来的使用体验也将提升一个层次。

选型说明

工具选型的过程

在使用 KubeSphere 之前,我们也使用了很多其他的项目,如 KubeOperator,DaoCloud,Choerodon等。但是在使用过程中发现,其他工具的功能并不是很完善,遇到问题很难排查,社区也不是很活跃,这就导致我们的使用成本和维护成本大大增加。

选择 KubeSphere 的原因

我通过博客和论坛发现了 KubeSphere,Issue 的提出与解决非常的完善和及时。KubeSphere 官网有很多案例与讲解,社区活跃度非常高。这不正是我想要的吗?

经过实践使用 KubeSphere 搭建的集群更加稳定,资源管控更加便捷,与同类云原生产品相比,KubeSphere 几乎实现了我们在生产环境会用到的所有功能。

于是我们就开始在测试环境搭建并使用,随后慢慢地向生产环境迁移。目前我们公司有三分一的项目已经迁移到 KubeSphere 平台上,并且回收了之前的旧服务器,大大提高了资源使用率。

实践过程

基础设施与部署架构

Kubernetes 与 KubeSphere 的搭建也非常简单,根据官方文档先下载 KubeKey, 使用 KubeKey 搭建就可以了。

目前我们使用私有环境来搭建 Kubernetes 与 KubeSphere,因为是在我们内部使用,所以不考虑在云上进行搭建。

基础服务器采用的是 Linux Centos 7,内核版本是 5.6。

在搭建 Kubernetes 集群时,我选择使用 Keepalived 和 HAproxy 创建高可用 Kubernetes 集群,其中包括两个负载均衡入口。

然后是 3 个 Master 节点,3 个 Worker 节点,一个 Etcd 集群,因为是多集群,我会为公司每个项目创建一个集群,所有我们单个集群分配的资源不是很多,当资源不够使用时需要进行申请。

平台的存储与网络

平台的持久化存储我们使用的是第三方杉岩,这就需要对方来提供存储卷和创建存储系统空间,所以在这里就不做过多介绍。大家也可以使用开源的存储插件来做,KubeSphere 文档中提到了很多开源存储插件,使用起来也非常的方便。

在集群内部我们采用的是 Calico CNI 插件负责集群的内部通讯,当我们的服务部署至 Kubernetes 集群时会产生一个内部访问地址,这个地址在我们集群内是可以 ping 通和访问的,但外部无法访问。

所以在外部网络通讯方面我做了两套方案:

  1. 考虑到我们之前的项目使用 APISIX 作为网关路由,所以我们就在集群内搭建了 APISIX:

搭建方式也非常简单,创建一个 APISIX 模板,再创建一个应用就可以了:

创建完成之后集群内的项目就可以使用 APISIX 了,将 APISIX 开启对外访问,作为集群的唯一入口,接下来在服务中创建路由,就会在 APISIX 中自动生成一条路由规则与上游服务:

  1. 第二种方案则是使用负载均衡器 OpenELB,OpenELB 官方提供了三种模式,我们选用的是 Layer2 模式,因为 BGP 和 VIP 需要机器的支持,就暂时没有搭建,后续会考虑改用另外两种模式对外访问。

官方文档:https://openelb.io/docs/getting-started/usage/use-openelb-in-vip-mode/

安装和使用也很方便,可以直接在 KubeSphere 应用商店中选择安装,也可以在集群中通过 yaml 进行安装:

但是需要注意的是,通过应用商店进行安装一定要注意集群的内存空间是否充足,否则会导致集群监控组件异常。

安装完成之后,我们只需要开启 strictARP: true,并设置 EIP 池就可以了,然后我们在部署服务时加上注解:

annotations:
  lb.kubesphere.io/v1alpha1: openelb
  protocol.openelb.kubesphere.io/v1alpha1: layer2
  eip.openelb.kubesphere.io/v1alpha2: eip-layer2-pool

将 type 改为:LoadBalance,就会在我们的 IP 池中获取一个对外访问的 IP 分配给服务进行对外访问了。

日志与监控

我们搭建了一套 EFK 的日志系统,通过 Filebeat 收集服务端的数据,再通过 Kafka 发送到 es 中,然后通过 Kibana 查询日志数据,另外我们增加了一套 SkyWalking,它会给我们生成一个链路 ID,这样我们就可以根据这个链路 ID 直接查找当前请求下的所有日志。

在监控方面除了 KubeSphere 自带的监控之外,我们还用了一套外部的监控系统:

  • 主机层面:Prometheus + General
  • 服务层面:SkyWalking
  • 包括服状态的监控以及所有的告警

CI/CD

我们开启了 KubeSphere 的 DevOps 模块,里面集成了 Jenkins,流水线的构建,实现了项目从拉取代码,质量检查到项目部署一键化的流程。

在 DevOps 模块中用的是自定义 GitLab 仓库,如果是自己实践的话可以去 KubeSphere 应用商店中下载使用,在这里我就介绍一下自定义实现。

首先需要打开 KubeSphere 自带的 Jenkins,进入页面创建一个 GitLab 的凭证,然后在系统配置自定义 GitLab 的地址。

这里的凭据就是我们刚刚创建的 GitLab 凭据,地址就直接填自己仓库的地址,然后就可以在 KubeSphere 中看到刚刚填写的地址了。

我是根据官方文档创建的流水线,其中有些地方需要自己指定。

在 Jenkins 中是提供一个 Maven,在这里我需要改成自定义的 Maven,不然项目构建的时候会失败,我们只需要在 configMap 中修改 setting.xml 文件就可以了。

镜像仓库用的是自定义 Harbor 仓库,要在 Harbor 中先创建存放镜像的地址,然后创建权限,在 KubeSphere 中添加凭证就可以使用了。

在使用流水线之前一定要把 GitLab、Kubernetes、镜像仓库的凭证建好,后面直接使用就可以了。

一些前置的条件配置好之后就可以直接去创建流水线了。

运行后可以看到运行记录。

流水线跑完之后就可以在项目中看到之前部署的项目了。

包括服务和容器组,在里面就可以对项目进行管理了,包括负载均衡,网关,路由,扩容等一些操作。

使用效果

  • 在使用 KubeSphere 之后,我们所有的项目都集中在一起了,管理起来方便很多,服务器的资源也很大程度的减少,在资金方面节省了很多。
  • 项目上线现在只需要创建执行流水线就可以了,再根据定时任务定时执行,并且项目可以自动增加副本,项目启动失败会自动回滚到之前的版本。
  • 在业务方面,接口的请求时间降低了,用户的使用体验也增加了不少,出现 bug 能够快速的定位并解决问题。

未来规划

未来我们将把公司内部系统与 KubeSphere 完全打通,成立云原生小组来负责云原生的研发工作。

公司的服务器资源将完全回收,将会以集群分配的方式管理项目,之后会自研一些插件和组件使用并进行开源。

对于 KubeSphere,我们也有一些建议:

  • 希望文档能够在详细一点,有一些插件的文档说明只是大概的介绍了一下。
  • 监控面板不是很细致,需要使用自定义的监控面板进行使用。
  • 目前发现告警通知方面只能在通知聚到中配置钉钉一个地址,希望的是在每一个项目中都能够配置通知地址,这样每一个钉钉告警通知群就能够做到互不干扰。

希望 KubeSphere 未来会发展的越来越好!

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

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

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

相关文章

[C++] -- 模板初阶

文章目录函数模板函数模板的隐式实例化显式实例化模板参数的匹配原则类模板模板函数声明和定义分离会链接错误函数模板 对于一些参数不同但功能类似的函数,C有函数重载,但是函数重载有一些缺陷: 重载的函数只是参数不同,代码复用…

【五六七人口普查】我国省市两级家庭户住房状况

人口数据是我们在各项研究中最常使用的数据!之前我们分享过第七次人口普查(简称七普)的数据!很多小伙伴拿到数据后都反馈数据非常好用,同时很多小伙伴咨询有没有前面几次人口普查的数据,这样方便做人口变化…

7.1 微服务-SpringCloud(二)

目录 前言 7.1.5 Hystrix 7.1.5.1 什么是Hystrix 7.1.5.2 雪崩问题 7.1.5.3 线程隔离,服务降级 7.1.5.4 搭建 7.1.5.4.1 引入依赖 7.1.5.4.2 开启熔断 7.1.5.4.3 编写降级逻辑 1.局部降级逻辑 2.全局降级逻辑 7.1.5.4.4 设置超时 7.1.5.5 服务熔断 7.…

2023-02-09 - 1 Elasticsearch简介

1 Elasticsearch的基本概念 1.1 索引 在使用传统的关系型数据库时,如果对数据有存取和更新操作,需要建立一个数据库。相应地,在ES中则需要建立索引。用户的数据新增、搜索和更新等操作的对象全部对应索引。 1.2 文档 在使用传统的关系型数…

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日低开高走,午后集体涨超1%,创业板指盘中涨超1.7%。芯片板块集体大涨,…

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…

内网资源探测

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是…

计算机软件技术基础复习

数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构:指相互…

SQLSERVER 的 truncate 和 delete 有区别吗?

一:背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 ,这是一个很有意思的话题,本篇我就试着来回答一下,如果下次大家遇到这类问题,我的答案应该可以帮你成功度过吧。 二&#xff1…

Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)

预期效果:(借助iview-ui的在线体验页面示意一下) 项目中只有一部分页面需要缓存,且存在多级路由的页面。每打开一个菜单,就会新增一个 Tab标签,只要 Tab标签不关闭,对应的页面就会被缓存&#x…

Java Jackson TypeReference获取泛型类型信息【泛型】

Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TyperReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。 Jackson ObjectMapper的readVa…

三表相连 mapjoin

三表相连 mapjoin要求输出的样式三张表score.csvstudent.csvsubject.csv创建三个类StudentScgetset方法实现类MapJoinDriver用mapjoin不需要reduceMapJoinMapper运行结果要求 输出的样式 三张表 score.csv student.csv subject.csv 创建三个类 StudentSc getset方法 插入gets…

Mysql起步之环境搭建8.0

MySQL的下载、安装、配置 MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于 大多数普通用户。 MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试…

单元测试junit+mock

单元测试 是什么? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通…

Java中类是什么

类(class)是构造对象的模板或蓝图。 我们可以将类想象成制作小甜饼的模具,将对象想象为小甜饼。由类构造(construct)对象的过程称为创建类的实例(instance)。 正如前面所看到的,用Java 编写的所有代码都位于某个类里面。 标准 Java 库提供了几千个类&a…

【Axure教程】转盘抽奖原型模板

转盘抽奖是营销活动中很常用的一种方式,在线上我们也可以经常看到转盘抽奖的活动,所以今天作者就教大家在Axure中怎么制作一个转盘抽奖的原型模板。一、效果展示1、可以随机转动轮盘,轮盘停止时,指针对着的奖品高亮显示2、可以重复…

Qt + Clion + cmake 环境配置

本文不涉及QML,因为我没用过 用C写窗体,同时还有可视化UI界面,这不比控制台程序香吗?QAQ我大一写c大作业的时候要是知道这个东西,我绝对满分啊!!!! To: 新版…

Mysql—触发器

触发器 简介 触发器用于直接在某种操作后(数据的增删改查等),通过事件执行设置触发器时的 sql 语句,具有原子性。 可通过 sql 语句直接编写,关键词:CREATE TRIGGER 触发器名称。 例如:在表 st…

String面试题

String面试题 总结的很好:https://blog.csdn.net/qq_45950109/article/details/116992408 String特点 1.被final关键字修饰,不能被继承。实现Serializable,表示支持序列化。实现Comparable,表示可以排序。 2.底层是char数组和…

2023上半年软考报名到弘博创新错不了

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…