KubeSphere 在 vsleem 的落地实践
作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献。
公司介绍
公司简介
苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商,结合极致高效的数字孪生技术,实现房建公建、地产物业、城市更新、应急管理、石油化工、家装、零售等多元行业数字化赋能。
公司平台介绍

公司技术现状
- 框架:SpringCloud
- 部署模式:手动 Docker Compose
- 监控:无
- 告警:无
- 日志查看:手动 Docker logs
- 服务运维:纯手动
背景介绍
业务规模增长和痛点

随着公司业务增长,云端服务器和边端服务器数量增长迅速,而且伴随着海外业务的落地海外服务器也迅速增长,如果使用现在的技术去做运维,肯定是不可取的。
云原生的优势
云原生具有以下优势(篇幅所限,不展开介绍):
- 弹性扩展
- 高可用
- 高效运维
- 快速迭代
- 降低成本
- 灵活部署
- 简化架构设计
- 提高可移植性
选型说明
我们最终选择了 KubeSphere,是因为其具有以下功能特性,较符合我们的需求:
- 简单多样化的安装方式(All in one、K8s、AWS)
- 集群可视化、监控可视化
- 多集群管理、多租户管理
- 一体化的 DevOps(Jenkins+GitOps)
- 丰富的开源组件(Fluent Bit、tower、jaeger)
- 开箱即用的微服务治理
- 支持 KubeEdge 边端运维
实践过程
架构演变

技术架构

生产集群规模
目前我们国内的业务部署在华为云、日本的业务部署在 AWS 上。

KubeSphere 安装
- 安装方式有 All-in-one、多节点和离线等多种安装方式,我们使用的是多节点安装
- 需要预先安装 socat、conntrack、ebtables、ipset
- 创建配置文件
// 版本号可以按照自己的需求配置
./kk create config --with-kubernetes v1.22.12 --with-kubesphere v3.3.0
// 使用修改后的配置文件安装集群
./kk create cluster -f config-sample.yaml
- 安装完成后控制台可以显示所有节点信息

多集群配置
- 多集群的连接方式有直接连接和代理连接,目前我的环境两套集群网络不互通所以采用了代理连接的方式
// 主集群配置
kubectl edit cc ks-installer -n kubesphere-system
// 配置文件修改
multicluster:
clusterRole: host
hostClusterName: <主集群名称>
// 获取主集群的jwtSecret
kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret
// 配置成员集群
kubectl edit cc ks-installer -n kubesphere-system
// 成员集群配置文件修改
authentication:
jwtSecret: gfIwilcc0WjNGKJ5DLeksf2JKfcLgTZU
multicluster:
clusterRole: member
- 在主集群上登录 KubeSphere 控制台添加集群即可

服务部署

- 制作服务的 dockerfile,以 gateway 服务为例
// 以springcloud的gateway服务为例
FROM swr.cn-east.myhuaweicloud.com/vsais/openjdk:11.0.02
MAINTAINER xxx
WORKDIR /home
COPY vs-gateway/target/vs-gateway.jar /home/vs-gateway.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","vs-gateway.jar"]
- 制作 gateway 的 service 文件
kind: Service
apiVersion: v1
metadata:
name: gateway
namespace: test
labels:
app: gateway
version: v1
annotations:
kubesphere.io/creator: admin
kubesphere.io/serviceType: statelessservice
spec:
ports:
- name: http-0
protocol: TCP
port: 8080
targetPort: 8080
selector:
app: gateway
type: ClusterIP
- 部署 service 服务

- 制作 gateway 的 deployment 文件并部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway # Deployment 对象的名称,与应用名称保持一致
namespace: test
labels:
app: gateway # 应用名称
spec:
selector:
matchLabels:
app: gateway #app 标签名称
replicas: 1
minReadySeconds: 30
strategy: #部署策略更多策略 1.https://www.qikqiak.com/post/k8s-deployment-strategies/
type: RollingUpdate #其他类型如下 1.重建(Recreate) 开发环境使用 2.RollingUpdate(滚动更新)
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
app: gateway
spec:
volumes:
- name: timezone-volume
configMap:
name: timezone-config
items:
- key: localtime
path: localtime
restartPolicy: Always
containers:
- name: gateway # 容器名称,与应用名称保持一致
image: swr.cn-east.myhuaweicloud.com/vsais/gateway-test:v2.19
env:
- name: TZ
value: "Asia/Shanghai"
volumeMounts:
- name: timezone-volume
readOnly: true
mountPath: /etc/localtime
subPath: localtime
imagePullPolicy: Always #镜像拉取策略 1.IfNotPresent如果本地存在镜像就优先使用本地镜像。2.Never直接不再去拉取镜像了,使用本地的.如果本地不存在就报异常了。
ports:
- containerPort: 8080 #应用监听的端口
protocol: TCP #协议 tcp和 udp
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 10
imagePullSecrets:
- name: huawei

- gateway 服务依赖了 configmap 和 secret 配置
// configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: timezone-config
data:
localtime: /usr/share/zoneinfo/Asia/Shanghai
// secret
kind: Secret
apiVersion: v1
metadata:
name: dockerhub
namespace: test
annotations:
kubesphere.io/creator: admin
secret.kubesphere.io/force-insecure: 'true'
data:
.dockerconfigjson: >-
eyJhdXRocyI6eyY2tlci5pbyIXxVlcCIsInBhc3N3b3JkIjoiVlNBSVNfdnNkZWVwMjAyMCIsImVtYWlsIjoiIiwiYXV0aCI3T2VFFVbFRYM1p6Wkd9In19fQ==
type: kubernetes.io/dockerconfigjson

- 其他服务依赖了 pvc 配置
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: report
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi

- 服务代码配置
// 直接使用nacos的服务名来通信
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<nacos.server>nacos.prod:8848</nacos.server>
<nacos.discovery.group>PROD_GROUP</nacos.discovery.group>
<nacos.config.group>PROD_GROUP</nacos.config.group>
<logstash.address>127.0.0.1:4560</logstash.address>
</properties>
</profile>
监控

CI/CD
CI 这块我们使用了其他开源项目,CD 则使用了 Argo CD 同步服务。


未来规划
- 鉴于 KubeSphere 在华为云和 AWS-日本的成功落地、年底继续着手在 AWS-新加坡的部署
- 使用 EdgeMesh,彻底打通云边、边边的网络通信
- 使用灰度发布代替滚动更新部署
- 使用 CPU 技术虚拟化 CPU,KubeSphere 是否有此功能待探究
本文由博客一文多发平台 OpenWrite 发布!
KubeSphere 在 vsleem 的落地实践的更多相关文章
- Dubbo Mesh 在闲鱼生产环境中的落地实践
本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...
- [转载]DevOps在传统企业的落地实践及案例分享
内容来源:2017年6月10日,优维科技高级解决方案架构师黄星玲在“DevOps&SRE 超越传统运维之道”进行<DevOps在传统企业的落地实践及案例分享>演讲分享.IT 大咖说 ...
- DEVOPS落地实践分享
DEVOPS落地实践分享 转载本文需注明出处:微信公众号EAWorld,违者必究. 引言: DevOps的理念已经说了很多年,其带来的价值逐渐被接受,很多企业也逐渐引入了DevOps.目前普元DevO ...
- MOT大连站 | 卓越研发之路:前沿技术落地实践
还在讨论究竟哪种编程语言更容易深度学习?哪种编程语言更具有价值?如果你是资深技术人员又或者是团队负责人,在机器学习.微服务.Spring 5反应式编程等方面遇到了问题,不妨参加一场由msup和微软联合 ...
- SpringCloud落地实践
这几年微服务架构越来越火.伴随着微服务概念的提示,越来越多的组织为了方便开发,结合实际提供很多微服务机构, 之前工作中一直使用dubbo作为微服务框架, dubbo只是专注于服务之间的通讯,所以更灵活 ...
- python coding style guide 的高速落地实践
python coding style guide 的高速落地实践 机器和人各有所长,如coding style检查这样的可自己主动化的工作理应交给机器去完毕,故发此文帮助你在几分钟内实现coding ...
- python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准
python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...
- 鸿蒙HarmonyOS应用开发落地实践,Harmony Go 技术沙龙落地北京
12月26日,华为消费者BG软件部开源中心与51CTO Harmony OS技术社区携手,共同主办了主题为"Harmony OS 应用开发落地实践"的 Harmony Go 技术沙 ...
- DevOps落地实践点滴和踩坑记录-(1)
记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...
- 互联网研发效能之去哪儿网(Qunar)核心领域DevOps落地实践
本文从业务目标角度出发,确定了开源+自建模式搭建 Qunar 研发工具链整体生态:通过 APPCODE 打通工具链,流程规范化自动化:多种手段+发布门禁助力质量提升:建立应用画像确定运维最小单元,可发 ...
随机推荐
- MyBatis-Plus文件上传方法
网站的文件上传方法 本地存储上传 // 本地存储方式 MultipartFile接受文件 @PostMapping("/save") public Result save(Stri ...
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器 (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
1. 安装xvfb sudo apt-get install xvfb Xvfb是流行的虚拟现实库,可以使很多需要图形界面的程序虚拟运行. 2. 安装pyvirtualdisplay pyvirtu ...
- 为python编译C++模块时一定要注意的事情—————不要在anaconda环境下使用cmake来编译C++扩展模块!!!
平时搞python的人很多都会有安装C++扩展模块的需求,而往往这些C++模块都是使用CMAKE做编译配置的,但是如果你这时候shell环境是使用anaconda的话,那么cmake默认调用的GCC和 ...
- Apache SeaTunnel社区首位学生Committer诞生!
采访对象 | 陈炳烨 采访人&编辑 | Debra Chen Apache SeaTunnel社区第一位学生Committer就此诞生!这位来自西安交通大学软件工程专业的同学从较为简单的文档修 ...
- 这是DDD建模最难的部分(其实很简单)
本文书接上回<为了落地DDD,我是这样"PUA"大家的> ,欢迎关注我的同名公众号. https://mp.weixin.qq.com/s/DjC0FSWY1bgJ ...
- MySql 字段类型长度问题理解
mysql中字段长度理解 字符长度 设计表中设置的是字符长度,任意字符都占一个字符长度,使用char_length 函数获取 char_length(`name`) 字节长度 字节长度和数据表的字符集 ...
- java_类方法&对象方法
int new; 类方法 不能写入和访问其中的对象属性 可以直接通过类调用 通过类调用类方法,没有具体的对象, 所以 不可以访问对象属性, 但是可以访问类属性 public static void d ...
- STM32开发踩大坑(技术总监出马救场)
代码中线进行spi初始化,再进行st7789的初始化.在st7789的初始化中,把spi初始化的配置信息pb15和pb13覆盖了,故数据传输不过去.当时st7789是直接拿样例代码过来用的,模拟spi ...
- 最详细STL(三)list
list就是链表啦,他的一个结点由两个指针域,一个数据域组成.list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1).然而list也有一个致命的缺点,因为链表的空间申请是 ...
- 以Top-Down思维去解决问题——递归
目录 递归的基础 递归的底层实现(不是重点) 递归的应用场景 编程中 两种解决问题的思维 自下而上(Bottom-Up) 自上而下(Top-Down) 自上而下的思考过程--求和案例 台阶问题 案例 ...