文鼎创智能物联云原生容器化平台实践
作者:sekfung,深圳市文鼎创数据科技有限公司研发工程师,负责公司物联网终端平台的开发,稳定性建设,容器化上云工作,擅长使用 GO、Java 开发分布式系统,持续关注分布式,云原生等前沿技术,KubeSphere Contributor,KubeSphere 社区用户委员会深圳站委员。
公司简介
深圳市文鼎创数据科技有限公司创立于 2006 年,是全球领先的线上身份认证解决方案提供商,专注网络身份认证,数据安全领域,坚持稳健经营,持续创新、开放合作,在金融电子化、政府、企业办公等应用中提供解决方案,成为众多国有商业银行、全国性股份制银行、城市商业银行、农村商业银行、各省市税务、政府、各大 CA 机构以及跨国企业的合作伙伴,累积服务近亿用户,不断满足客户差异化需求。
公司多年来持续创新,申请了大量的发明专利、实用新型专利和产品外观专利;登记了多项计算机软件着作权,同时是国家级高新技术企业;拥有商用密码产品型号证书、密码检测证书、银联认证证书、ISO9001:2015 国际质量管理体系认证及 ISO14001 环境管理体系认证;产品通过了 CE/FCC 认证、RoHS 认证。
公司作为国际线上快速身份验证联盟(FIDO)的核心成员之一,致力于实现全球统一的在线验证标准,我们将运用该技术为不同地区的人们提供享有平等的安全网络世界的权利。
背景介绍
“文鼎创智能物联”是深圳市文鼎创数据科技有限公司针对物联网应用,推出的物联网解决方案,方案包含统一的物联网服务平台、”云打印机“、”收款云音箱“、”收款云扫码盒子“等旗下产品,为用户的数据安全保驾护航。
作为一家 TO B 解决方案的硬件提供商,“硬件为主,软件为辅”是公司长期以来的开发模式,因此前期在对服务端的开发、部署、架构设计重视不够。传统的项目停留在单机(虚拟机)部署,人工打包上传,不仅费时费力,还容易出错,造成服务的不可用。
在拥抱 K8s 之前,我们也尝试过 docker-compose 的方案,相对于人工打包部署,docker-compose 也确实给我们带来了一些便利:
- ALL-IN-ONE,提供一键式的软件部署方案,无需执行繁琐的部署流程;
- 隔离了宿主机系统的差异性;
- 减少了运维人员进行版本迭代的操作,降低操作失误的可能性。
在面向物联网行业推出新产品,新解决方案之后,对服务的稳定性,以及可靠性带来了新的挑战,现有的开发模式逐步跟不上业务的迭代需求,为此我们迫切需要打破现有的框架,探索新的一套软件迭代流程。
选型说明
在决定拥抱云原生之时,我们对市面上的容器管理平台进行了调研,发现国外 Rancher 用户较多,国内 KubeSphere 位居前列。我们对容器管理平台的选型有几个标准:
- 生态:一个开源项目的生态是否完善很重要,周边配套的工具能带来极佳的使用体验和可维护性。
- 社区活跃度:官方仓库 Issue 或问答社区是否回应及时,代码提交是否活跃?
- 商业公司或基金会支持:是否有商业公司或开源基金会支持,如果为个人项目,后续停止维护,则可能会给用户带来的一定的风险。
- 技术栈:使用的技术栈与团队是否吻合,是否有能力解决和维护?
- 用户体验:是否有 UI 操作界面,界面是否美观,使用流畅?
- 本土化:是否做了一些本土化的优化,符合国人的使用习惯?
在调研选型时,我们发现 KubeSphere 能充分满足的我们的要求。KubeSphere 团队开源的 KubeKey 工具,能帮助我们快速搭建一个 KubeSphere 集群,省去了繁琐且复杂的部署流程,OpenELB 项目则为我们提供了本地集群负载均衡的解决方案。
在使用过程中发现的问题,在中文问答社区基本都能找到对应的解决方案。KubeSphere 的控制台简化了 Kubernetes 服务的部署,使得团队一些没有 K8s 使用经验的成员也能快速上手,用过的同事都说好。
目前架构
目前采用微服务设计,开发语言以 Golang、Java 为主,服务之间通信使用 gRPC。
生产环境使用两个腾讯云 CLB 分别接入来自业务和物联网终端的流量。整个业务服务部署在腾讯云 TKE 集群,并使用 KubeSphere 来管理应用的日常发布。而集群的基础设施,本着“能买就买,实在不能买就自建”的原则(并不是不差钱,而是小公司运维压力大)。之所以没有使用 TKE 的控制台来管理应用的发布,主要是 TKE 的控制台体验并不是很友好,另外一个很重要的原因,应用商店对第三方 Helm 仓库支持很差,无法充分利用 Helm 的生态。
实践过程
硬件资源
测试环境:10 台 ESXI 虚拟机,自建 Kubernetes 集群。
生产环境:7 台 腾讯云 CVM 节点,Kubernetes 使用腾讯云托管 TKE 集群。
存储方案
测试环境:使用 3 台 ESXI 虚拟机作为分布式存储 Ceph 的 OSD 节点。
生产环境:出于成本和稳定性的考虑,使用腾讯云 CBS 作为 K8s 存储方案。
最小化安装
由于生产环境和测试环境已经有一些外部服务,比如 Prometheus 和 Logging,为了最大化利用现有资源,在部署 KubepShere 采取了最小化安装。
值得一提的是,Monitor 并不是可插拔组件,即使最小化安装,KubeSphere 依然会默认安装,在生产环境中,安装 TKE 监控的 prometheus-operator 会与其冲突,需要关闭 KubeSphere 的 Prometheus 或者手动卸载。
DevOps
在早期开发阶段,版本迭代是一件非常痛苦的事情,开发人员在本地编译打包后人工上传到服务器进行部署。在经历了多次各种环境差异,人工操作失误教训后,团队下定决心改变现有的流程,决定搭建适合团队自身的 DevOps 体系。
- 持续集成(CI):开发在每次提交代码之前都进行 CI,以确保代码的质量和一致性。这包括运行单元测试,代码静态分析,编译和构建过程等。当 CI 失败时,开发立即修复代码并重新提交。
- 持续交付(CD):一旦代码通过了 CI 流程,就将其交付给测试团队进行测试。测试团队进行测试以确保产品的质量。在测试环境,使用了 Coding 的自定义节点作为 CI 的自动化构建,CI 通过后通过脚本自动更新 KubeSphere 的镜像版本。在生产环境,由于涉及发布评审流程,配置变更,各个业务团队的协调,目前暂时还是交由运维人员手动变更应用版本进行发布。
- 监控和警报:一旦代码被部署到生产环境,对其进行监控。监控可以帮助团队快速发现和解决问题,确保产品的可用性和性能。
目前的 DevOps 实践,主要解决了团队以下的痛点:
- 统一编译环境:规定项目内应编写 Dockerfile,使用 Docker 容器内的编译环境进行编译,同时使用 Gitlab Runner 通过代码提交事件触发代替开发机本地编译,从而隔离各个开发机环境的差异。
- 发布版本可追溯:早期项目版本管理十分随意,全凭开发人员心情命名。导致出现问题时无法快速定位。为此,我们约定在 CI 构建时,镜像版本需要满足特定的命名格式,如:
${VERSION}-${ENV}-\${CI_NUMBER}
,这种命名格式可以帮助我们快速定位到某个环境出现问题某次 CI 构建的版本。 - 平滑迭代:早期项目使用单机单体部署,在进行迭代时,常常有短时间的服务不可用,导致流量损失。在进行容器化改造后,利用 Kubernetes 的探针,可以进行服务的平滑更新,并且在服务状态不健康时,能自动重启,无需人工介入,大大提升了服务的可用性。
- 运维效率:充分发挥 Kubernetes 的运维体系和云原生的可观测性实践,降低了多业务多环境运维的压力。在服务故障发生时,能够及时感知。
使用效果
流水线配置
流水线使用了 Coding 的方案,有以下几方面的考虑:
- 能够深度融合企业微信,在 CI 过程,有任何问题能够及时通过 IM 工具通知到开发;
- 配套工具完善,官方的 Jenkins 有点跟不上云原生的发展,需要安装一系列的插件才能满足需求,配置过程也很繁琐。
应用部署
“文鼎创智能物联”项目已全部使用 Helm 应用发布,在使用过程,发现 KubeSphere 一个比较不友好的体验,如果升级应用因 yaml 文件配置错误导致应用升级失败,会无法再次升级。在生产环境中,应用无法升级是一个很糟糕的问题,发现该 Bug 后,已提交了修复代码给社区并合并 fix: can not re-upgrade helm application in a failed state。
集群资源监控
KubeSphere 内置的监控系统,满足运维人员日常对集群健康状态的巡检,同时 KubeSphere 提供了多个层面的监控,针对 namespace 和服务本身,团队使用频次较高的是服务监控,以便开发人员对自身发布的服务的资源使用情况有所了解。
未来规划
- “文鼎创智能物联”作为公司探索的新项目已全面完成容器化工作,运行在 KubeSphere 集群,未来打算将历史遗留的 TO B 项目进行容器化改造和迁移到 KubeSphere 集群,提升项目的可维护性和可用性。
- 探索 Service Mesh 方案,进一步提升服务的平稳发布和可观测性。
本文由博客一文多发平台 OpenWrite 发布!
相关文章:
文鼎创智能物联云原生容器化平台实践
作者:sekfung,深圳市文鼎创数据科技有限公司研发工程师,负责公司物联网终端平台的开发,稳定性建设,容器化上云工作,擅长使用 GO、Java 开发分布式系统,持续关注分布式,云原生等前沿技…...
深入了解SpringMVC框架,探究其优缺点、作用以及使用方法
一、什么是Spring MVC SpringMVC是一种基于Java的Web框架,与Spring框架紧密结合,用于开发具备WebApp特性的Java应用程序。Spring MVC是Spring Framework的一部分,因此它具有与Spring框架相同的特性和理念。 二、SpringMVC的优缺点 1. 优点…...
Git教程(一)
1、Git概述 1.1 、Git历史 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)…...
数据结构篇三:双向循环链表
文章目录 前言双向链表的结构功能的解析及实现1. 双向链表的创建2. 创建头节点(初始化)3. 创建新结点4. 尾插5. 尾删6. 头插7. 头删8. 查找9. 在pos位置前插入10. 删除pos位置的结点11. 销毁 代码实现1.ListNode.h2. ListNode.c3. test.c 总结 前言 前面…...
day10 TCP是如何实现可靠传输的
TCP最主要的特点 1、TCP是面向连接的运输层协议。( 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)) 2、TCP提供可靠交付的服务。 3、TCP提供全双工通信。 4…...
Python | 人脸识别系统 — 背景模糊
本博客为人脸识别系统的背景模糊代码解释 人脸识别系统博客汇总:人脸识别系统-博客索引 项目GitHub地址:Su-Face-Recognition: A face recognition for user logining 注意:阅读本博客前请先参考以下博客 工具安装、环境配置:人脸…...
YOLOv5+单目测量物体尺寸(python)
YOLOv5单目测量尺寸(python) 1. 相关配置2. 测距原理3. 相机标定3.1:标定方法1(针对图片)3.2:标定方法2(针对视频) 4. 相机测距4.1 测距添加4.2 细节修改(可忽略…...
C++异常
C异常 提到异常,大家一定不陌生,在学习new关键字的时候就提到了开空间失败会导致抛异常。其实异常在我们生活中的使用是很多的,有些时候程序发生错误以后我们并不希望程序就直接退出,针对不同的情况,我们更希望有不同的…...
Java中的字符串是如何处理的?
Java中的字符串是通过字符串对象来处理的。字符串是一个类,可以创建一个字符串对象,并在该对象上调用一系列方法来操作该字符串。 Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,就无法修改它的值。任何对字符串对…...
【热门框架】怎样使用Mybatis-Plus制作标准的分页功能
使用 Mybatis-Plus 实现标准的分页功能需要使用 Page 类来进行分页操作。具体步骤如下: 引入 Mybatis-Plus 依赖 在 Maven 项目中,在 pom.xml 文件中引入 Mybatis-Plus 的依赖: <dependency><groupId>com.baomidou</groupId&g…...
Java方法引用:提高代码可读性和可维护性
前言 在Java 8中,可以使用方法引用(Method Reference)来简化Lambda表达式。方法引用是一种更简洁易懂的语法形式,可以通过指定方法的名称代替Lambda表达式。 本文将介绍方法引用的用法和实现原理,并结合代码案例详细…...
如何使用CSS和JS实现一个响应式的滚动时间轴
随着互联网的发展,网站的界面设计越来越重要。吸引用户的关注、提高用户体验已经成为了许多网站的目标。而在实现各种复杂的界面效果中,CSS与JS的组合无疑是开发者的得力工具。本文将介绍如何使用CSS和JS实现一个响应式的滚动时间轴。 1.需求分析 在开…...
Feign组件的使用及开发中使用方式
在微服务的服务集群中服务与服务之间需要调用暴露的服务.那么就需要在服务内部发送http请求, 我们可以使用较为老的HttpClient实现,也可以使用SpringCloud提供的RestTemplate类调用对应的方法来发送对应的请求。 说明: 现在有两个微服务一个是…...
html css 面试题
1. 如何理解HTML语义化 1,可读性,易读性 2,seo搜索引擎更容易读懂 2,哪些是块元素,哪些是内联元素 1:div,h1,table,ul,p 2:span, img…...
LeetCode_双指针_中等_24.两两交换链表中的节点
目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…...
【openGauss实战11】性能报告WDR深度解读
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...
Vue3实现打字机效果
typeit 介绍 typeit是一款轻量级打字机特效插件。该打印机特效可以设置打字速度,是否显示光标,是否换行和延迟时间等属性,它可以打印单行文本和多行文本,并具有可缩放、响应式等特点。官方文档 安装 # npm npm install typeit # …...
maven无法依赖spring-cloud-stater-zipkin如何解决?
当 Maven 无法依赖 spring-cloud-starter-zipkin 时,您可以尝试以下方法解决: 确保拼写正确:请检查项目中的 pom.xml 文件,确保依赖的拼写正确。正确的依赖名称应为:spring-cloud-starter-zipkin。添加 Spring Cloud …...
实战踩坑---MFC---CreateEvent
使用事件CreateEvent注意事项 HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性 BOOLbManualReset,// 复位方式 BOOLbInitialState,// 初始状态 LPCTSTRlpName // 对象名称 );[1] 参数 lpEventAttributes[输入] 一个指向SECURITY_ATTRIBUTES结构…...
JavaWeb学习------jQuery
JavaWeb学习------jQuery jQuery函数库下载 jQuery函数库下载官网:Download jQuery | jQuery配套资料,免费下载 链接:https://pan.baidu.com/s/1aXBfItEYG4uM53u6PUEMTg 提取码:6c9i 然后下载? 来到官网…...
米哈游测开岗 【一面总结】
目录 1.黑盒测试与白盒测试的区别 2.测试一个下单功能 3.get与post的区别 4.一次get请求产生几个数据包 5.常用的linux命令 6.进程与线程的区别 7.数据库查询如何去重 8.MySql怎么连接两张表,有什么区别 9.说说索引 10.cookie 和 session 的区别 (会话管…...
微服务 Spring Boot 整合Redis 实现优惠卷秒杀 一人一单
文章目录 一、什么是全局唯一ID ⛅全局唯一ID ⚡Redis实现全局唯一ID 二、环境准备 三、实现秒杀下单 四、库存超卖问题 ⏳问题分析 ⌚ 乐观锁解决库存超卖 ✅Jmeter 测试 五、优惠卷秒杀 实现一人一单 ⛵小结 一、什么是全局唯一ID ⛅全局唯一ID 在分布式系统中,经常需要使用…...
构建OVS网络
构建OVS网络 1. 配置虚拟机环境 (1)配置虚拟机交换机 1 创建一个名为br-xd的虚拟交换机。 # ovs-vsctl add-br br-xd 2 查询虚拟交换机。 # ovs-vsctl show 5a1cd870-fc31-4820-a7f4-b75c19450582 Bridge br-xd Port br-xd …...
【Python】万能之王 Lambda 函数详解
Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务,而在 Python 中,有个万能之王函数:lambda 函数,它可以以不同的方式在任何地方使用。今天云朵君将和大家一起研究下这个万能之王! Lambda 函数简介…...
手把手教你怎么搭建自己的AI数字人直播间?帮你24小时不间断直播卖货
在搭建AI数字人直播间之前,您需要了解数字人技术。 一、什么是AI数字人、数字人直播间? 数字人是一种由人工智能技术构建的虚拟人物,其外貌、行为、语言等特征与真实人物相似,可以与人进行互动。数字人可以通过语音合成、人脸识…...
MySQL性能监控全掌握,快来get关键指标及采集方法!
数据库中间件监控实战,MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题,提升数据库可用性。 1 整体思路 监控哪类指标? 如何采集数据? 第10讲监控方法论如何落地? 这些就可以在MySQL中应用起来。…...
sed进阶之保留空间和排除命令
shell脚本编程系列 保留空间 模式空间(pattern space)是一块活跃的缓冲区,在sed编辑器执行命令时保存着待检查的文本,但它并不是sed编辑器保存文本的唯一空间。sed编辑器还有另一块称作保留空间(hold space࿰…...
21安徽练习
题目分为4部分 APK 集群 流量 exe 我尽量都做一下,逆向不是很会,就当提升自己。 [填空题]请获取app安装包的SHA256校验值(格式:不区分大小写)(10分) e15095d49efdccb0ca9b2ee125e4d8136cac5…...
【VAR | 时间序列】应用VAR模型时的15个注意点
一、前言 向量自回归(VAR,Vector Auto regression)常用于预测相互联系的时间序列系统以及分析随机扰动对变量系统的动态影响。 VAR方法通过把系统中每一个内生变量,作为系统中所有内生变量的滞后值的函数来构造模型,从而回避了结构化模型的…...
校招在线测评题目汇总
图形找规律题 https://blog.csdn.net/mxj1428295019/article/details/129627461https://blog.csdn.net/Yujian2563/article/details/124266574?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-124266574-blo…...
永安网站建设/百度移动点击排名软件
python 文件太多打不开文件夹,取样少量的文件, 建立同样的文件目录结构 python 文件太多打不开文件夹,取样少量的文件 - 无左无右 - 博客园 import os import shutil import randomroot_file "/media/algo/data_1/everyday/20230203-有…...
公司网站建设深圳/全国疫情又严重了
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris 和 V.R.Pratt 同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与…...
改善网站建设/最新seo课程
介绍(2021-05-12)用*好的iOS鼾声分析软件来记录、测量和减少您的鼾声。医生强烈推荐!鼾声分析器利用声波分析来测量和记录鼾声,帮助您找出减少鼾声的有效方法。“这个应用是个意外的惊喜。我第一次感觉能够控制打鼾了。谢谢鼾声分析器!”“鼾…...
WordPress书籍插件/上首页seo
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上。任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式。例如:常见的文件系统有FAT,NTFS,EXT&#…...
wordpress 自动上传插件/郑州搜狗关键词优化顾问
我有一个PHP REST API,可以托管Amazon S3中的所有图像.我正在寻找一个插件或技巧,使用GET参数来调整图像大小.例如:http://my-bucket.s3.amazon.com/image.jpg?width300&height300我找到了this plugin,但我的团队成员说它是基于ASP.NET的,不适合我的PHP API项目…...
外网专门做钙片的网站/百度一级代理商
html5获取手机GPS信息的示例代码function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition, showError); } else { alert("浏览器不支持地理定位。"); } } function showError(error) { switch (error.code) {…...