文鼎创智能物联云原生容器化平台实践

news2024/11/19 15:20:04

作者:sekfung,深圳市文鼎创数据科技有限公司研发工程师,负责公司物联网终端平台的开发,稳定性建设,容器化上云工作,擅长使用 GO、Java 开发分布式系统,持续关注分布式,云原生等前沿技术,KubeSphere Contributor,KubeSphere 社区用户委员会深圳站委员。

公司简介

深圳市文鼎创数据科技有限公司创立于 2006 年,是全球领先的线上身份认证解决方案提供商,专注网络身份认证,数据安全领域,坚持稳健经营,持续创新、开放合作,在金融电子化、政府、企业办公等应用中提供解决方案,成为众多国有商业银行、全国性股份制银行、城市商业银行、农村商业银行、各省市税务、政府、各大 CA 机构以及跨国企业的合作伙伴,累积服务近亿用户,不断满足客户差异化需求。

公司多年来持续创新,申请了大量的发明专利、实用新型专利和产品外观专利;登记了多项计算机软件着作权,同时是国家级高新技术企业;拥有商用密码产品型号证书、密码检测证书、银联认证证书、ISO9001:2015 国际质量管理体系认证及 ISO14001 环境管理体系认证;产品通过了 CE/FCC 认证、RoHS 认证。

公司作为国际线上快速身份验证联盟(FIDO)的核心成员之一,致力于实现全球统一的在线验证标准,我们将运用该技术为不同地区的人们提供享有平等的安全网络世界的权利。

背景介绍

“文鼎创智能物联”是深圳市文鼎创数据科技有限公司针对物联网应用,推出的物联网解决方案,方案包含统一的物联网服务平台、”云打印机“、”收款云音箱“、”收款云扫码盒子“等旗下产品,为用户的数据安全保驾护航。

作为一家 TO B 解决方案的硬件提供商,“硬件为主,软件为辅”是公司长期以来的开发模式,因此前期在对服务端的开发、部署、架构设计重视不够。传统的项目停留在单机(虚拟机)部署,人工打包上传,不仅费时费力,还容易出错,造成服务的不可用。

在拥抱 K8s 之前,我们也尝试过 docker-compose 的方案,相对于人工打包部署,docker-compose 也确实给我们带来了一些便利:

  1. ALL-IN-ONE,提供一键式的软件部署方案,无需执行繁琐的部署流程;
  2. 隔离了宿主机系统的差异性;
  3. 减少了运维人员进行版本迭代的操作,降低操作失误的可能性。

在面向物联网行业推出新产品,新解决方案之后,对服务的稳定性,以及可靠性带来了新的挑战,现有的开发模式逐步跟不上业务的迭代需求,为此我们迫切需要打破现有的框架,探索新的一套软件迭代流程。

选型说明

在决定拥抱云原生之时,我们对市面上的容器管理平台进行了调研,发现国外 Rancher 用户较多,国内 KubeSphere 位居前列。我们对容器管理平台的选型有几个标准:

  1. 生态:一个开源项目的生态是否完善很重要,周边配套的工具能带来极佳的使用体验和可维护性。
  2. 社区活跃度:官方仓库 Issue 或问答社区是否回应及时,代码提交是否活跃?
  3. 商业公司或基金会支持:是否有商业公司或开源基金会支持,如果为个人项目,后续停止维护,则可能会给用户带来的一定的风险。
  4. 技术栈:使用的技术栈与团队是否吻合,是否有能力解决和维护?
  5. 用户体验:是否有 UI 操作界面,界面是否美观,使用流畅?
  6. 本土化:是否做了一些本土化的优化,符合国人的使用习惯?

在调研选型时,我们发现 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 体系。

  1. 持续集成(CI):开发在每次提交代码之前都进行 CI,以确保代码的质量和一致性。这包括运行单元测试,代码静态分析,编译和构建过程等。当 CI 失败时,开发立即修复代码并重新提交。
  2. 持续交付(CD):一旦代码通过了 CI 流程,就将其交付给测试团队进行测试。测试团队进行测试以确保产品的质量。在测试环境,使用了 Coding 的自定义节点作为 CI 的自动化构建,CI 通过后通过脚本自动更新 KubeSphere 的镜像版本。在生产环境,由于涉及发布评审流程,配置变更,各个业务团队的协调,目前暂时还是交由运维人员手动变更应用版本进行发布。
  3. 监控和警报:一旦代码被部署到生产环境,对其进行监控。监控可以帮助团队快速发现和解决问题,确保产品的可用性和性能。

目前的 DevOps 实践,主要解决了团队以下的痛点:

  1. 统一编译环境:规定项目内应编写 Dockerfile,使用 Docker 容器内的编译环境进行编译,同时使用 Gitlab Runner 通过代码提交事件触发代替开发机本地编译,从而隔离各个开发机环境的差异。
  2. 发布版本可追溯:早期项目版本管理十分随意,全凭开发人员心情命名。导致出现问题时无法快速定位。为此,我们约定在 CI 构建时,镜像版本需要满足特定的命名格式,如:${VERSION}-${ENV}-\${CI_NUMBER},这种命名格式可以帮助我们快速定位到某个环境出现问题某次 CI 构建的版本。
  3. 平滑迭代:早期项目使用单机单体部署,在进行迭代时,常常有短时间的服务不可用,导致流量损失。在进行容器化改造后,利用 Kubernetes 的探针,可以进行服务的平滑更新,并且在服务状态不健康时,能自动重启,无需人工介入,大大提升了服务的可用性。
  4. 运维效率:充分发挥 Kubernetes 的运维体系和云原生的可观测性实践,降低了多业务多环境运维的压力。在服务故障发生时,能够及时感知。

使用效果

流水线配置

流水线使用了 Coding 的方案,有以下几方面的考虑:

  1. 能够深度融合企业微信,在 CI 过程,有任何问题能够及时通过 IM 工具通知到开发;
  2. 配套工具完善,官方的 Jenkins 有点跟不上云原生的发展,需要安装一系列的插件才能满足需求,配置过程也很繁琐。

应用部署

“文鼎创智能物联”项目已全部使用 Helm 应用发布,在使用过程,发现 KubeSphere 一个比较不友好的体验,如果升级应用因 yaml 文件配置错误导致应用升级失败,会无法再次升级。在生产环境中,应用无法升级是一个很糟糕的问题,发现该 Bug 后,已提交了修复代码给社区并合并 fix: can not re-upgrade helm application in a failed state。

集群资源监控

KubeSphere 内置的监控系统,满足运维人员日常对集群健康状态的巡检,同时 KubeSphere 提供了多个层面的监控,针对 namespace 和服务本身,团队使用频次较高的是服务监控,以便开发人员对自身发布的服务的资源使用情况有所了解。

未来规划

  1. “文鼎创智能物联”作为公司探索的新项目已全面完成容器化工作,运行在 KubeSphere 集群,未来打算将历史遗留的 TO B 项目进行容器化改造和迁移到 KubeSphere 集群,提升项目的可维护性和可用性。
  2. 探索 Service Mesh 方案,进一步提升服务的平稳发布和可观测性。

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

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

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

相关文章

《安富莱嵌入式周报》第311期:300V可调节全隔离USB PD电源,开源交流负载分析仪,CANFD Trace,6位半多斜率精密ADC设计,开源数学库

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Hh4y1H7dR 《安富莱嵌入式周报》第311期:300V可调…

【机器学习】决策树算法解读

【机器学习】决策树算法解读 文章目录 【机器学习】决策树算法解读1. 介绍1.1 优缺点1.2 结构1.3 学习过程1.4 决策树与条件概率分布 2. 决策树学习过程2.1 训练策略2.2 特征选择2.2.1 信息增益和条件熵 2.3 决策树的生成2.3.1 ID32.3.2 C4.52.3.3 CART2.3.4 小结 2.4 决策树的…

Nacos配置中心、配置热更新、及配置共享的记录

Nacos除了提供了注册中心的功能,同样也提供了配置中心的功能,用于管理一些叫常改动的配置 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中…

计算时间复杂度详解

1,前置知识 我们在计算时间复杂度之前的前置知识是等差数列的通项公式和求和公式以及等比数 列的通项公式和求和公式 等差数列: 通项公式:ana1(n-1)d(d是公差) 求和公式:Snn(a1an)/2 等比数列&#xf…

【Python入门知识】NumPy数组拆分,超详细讲解

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天我们来学习python中NumPy数组的拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。…

Mysql 学习(七)独立表结构存储 二

段的结构 上一节说过表空间分为各个段,每个段里面又是以区为单位,每个区则有64个页。区根据剩余存储空间分为:Free,FREE_FRAG,FULL_FRAG 三种类型,为了方便管理区,给每个区创建XDES Entry结构&…

【校招VIP】用户反驳:你说大厂校招不会问框架实战,现在就有问的了,打脸了吧?一看是专业技能给自己挖的坑

最近有个用户过来质疑,不是说大厂不考框架的使用吗? 但网上的这两份面经里,却问到关于SpringBoot的问题。 接着发来了相对应的简历,一看,直接真相大白: 他在专业技能这栏写了:我熟练掌握Sprin…

flink内存参数配置学习

直接上官网 配置 JobManager 内存 | Apache Flink配置 JobManager 内存 # JobManager 是 Flink 集群的控制单元。 它由三种不同的组件组成:ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。 本篇文档将介绍 JobManager 内存在整体上以及细粒度…

自动驾驶中地图匹配定位技术总结

引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术,在自动驾驶系统中担负着相当重要的职责。汽车定位涉及多种传感器类型和相关技术,主要可分为卫星定位、惯性导航定位、地图匹配定位以及多传感器融合定位几大类。其中地图匹配定位技术利用道路物理…

CSS绝对定位、相对定位

目录 静态定位 - static 相对定位 - relative 绝对定位 - absolute 固定定位 - fixed z-index属性: 在CSS中定位有以下4种: 静态定位 - static相对定位 - relative绝对定位 - absolute 固定定位 - fixed 静态定位 - static 静态定位是css中的默认定…

网络机顶盒哪个牌子好?资深数码粉分享网络电视机顶盒排名

智能电视配置跟不上经常死机卡顿,但显示正常的情况下不想花钱换电视机怎么办?一台网络机顶盒就可以解决你的烦恼,安装上网络机顶盒以后就可以让旧电视新生,那么你知道网络机顶盒哪个牌子好吗?如果不懂这行,…

【自然语言处理 | Transformer】Transformer:Attention is All You Need论文讲解

Transformer由论文《Attention is All You Need》提出: 论文地址为: https://arxiv.org/pdf/1706.03762.pdf文章目录 一、Transformer 整体结构二、Transformer 的输入2.1 单词 Embedding2.2 位置 Embedding 三、Self-Attention(自注意力机制…

.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

目标 在一个网站内,用一套proto即提供gPRC 调用,又提供 Web API 调用。 实现方法 根据微软官方James Newton King(Newtonsoft.json 作者)的文章,.net7 里面提供了 JsonTranscoding 特性,只需要三步&#x…

听我一句劝,别去外包,干了6年,废了....

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…

NANK OE骨传导开放式蓝牙耳机发布,极致体验拉满!

近日,中国专业音频品牌NANK南卡发布了全新一代——骨传导开放式蓝牙耳机NANK OE,耳机采用了传统真无线和骨传导的结合方式,带来更加舒适的佩戴体验和音质升级,同时还支持单双耳自由切换,全新的设计收获了市场的喜爱和认…

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…

数据发送流程

在发送模式下,UART 的串行数据发送电路主要包括一个发送移位寄存器(TSR),TSR 功能是将数据 逐个移位送出。待发数据必须先写到发送缓冲区中。 TXIFx 是发送中断标志位,可配置为发送缓冲区空或TSR 空。 数据的发送支持7bit 、8bit 或9bit 数据…

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制,比较官方的定义: 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可…

为什么用Selenium做自动化测试,你真的知道吗?

目录 手工测试的问题 为什么用自动化 选择合适的测试方式 什么时候引入自动化测试 以Jmeter为代表的测试工具 编程能力既重要又不重要 为什么是Selenium 没有最好的技术,只有合适的技术 web自动化测试效率不高 手工测试的问题 手工操作点点点借助的是人脑的…

知识变现海哥|这3种课程定价最容易爆单

这3种课程定价最容易爆单 一门课怎么才能卖到100万,定价很关键。我卖了160万的课,总结了3种课程定价,组合起来最容易爆单!引流课定价0、1、9.9、19.9一般讲3天结束,用低价吸引大量潜在学员 信任课定价99、699、999等…