OpenIM 的集群化设计 | Kubernetes 部署 | 方案讨论 | 会议总结

会议和参考链接 会议参考文档:https://nsddd.notion.site/2899028707604b8090b36677c031cdf8?pvs=4 视频回放:Bilibili: https://www.bilibili.com/video/BV1s8411q7Um/?spm_id_from=333.999.0.0 评论: 那个中间件我觉得可以换成 https://kubeblocks.io 可以帮你管理多个数据库中间件 im 读取配置信息,读取的是 config/ 目录,代码中硬编码补充的 config.yaml,是否可以自动化来对 不同 服务的 rpc 划分,然后统一目录,默认读取的是二进制运行路径的上两层 openim version: https://github.com/openimsdk/open-im-server/blob/main/docs/conversions/version.md 存储可以考虑使用 : https://github.com/openebs/openebs https://github.com/rook/rook 核心目标: 开源项目和非开源项目的最大的区别,就是一套完整的解决方案。 非开源项目的 集群化部署方案的设计,比较在乎稳定,以及高效,快速,最好一键部署。 开源项目的 集群化部署方案的设计,比较在乎通用性,上手的难度,后期的维护难度,基础架构的稳定性。后面的开发者或者是贡献者,使用者,可以基于此创建自己的集群化部署方案,以及解决方案,并且成为 OpenIM 的集群化部署方案的使用案例。 OpenIM 集群化部署讨论会记录 先总结,后详细解读 ~ 关于开源部署环境的演变与变化 新部署方法:一种集二进制和部署于一体的一键操作。 Kubernetes 部署:在 Kubernetes 环境中实现一键部署的新型方案。 现存问题:涉及日志收集、服务重启追踪等,将在后续对这些问题进行改进并寻求解决方案。 CICD的开发与维护策略 CICD 概念:通过CICD实现Code Streaming。 开发阶段:需要编写出镜像文件。GitHub的CSD功能:已实现但尚待深入研究。 版本标记策略:推荐使用local branch而非直接标签。 关于软件开发与测试的实践经验分享 本地开发:推荐使用“auto-compile”工具快速生成稳定版本的镜像。 团队协作:介绍了各团队间如何协同进行开发、测试和发布。 代码重用:提及将库中的函数或方法封装为组件,实现跨项目调用。 Docker Deployment与Service Configuration 配置传递:主要通过如K8S中的配置文件。 部署方式:介绍了二进制部署和可部署两种策略,并讨论了各自的优缺点。 关于容器化部署和代码优化的探讨 容器化:提议将多个进程合并为一个容器进行管理。 部署方式兼容性:讨论了如何实现并进行微调。 技术架构和组件:如Helm chat、OpenM等,及其在系统中的作用和重要性。 关于一键部署的技术问题与解决方案 一键部署问题:可能的问题有无法翻墙、无法安装等。 解决方案:1) 将现有方案通用化;2) 采用第三方服务实现一键部署。 K8S部署与自动化的优化策略 部署工具:如使用Shell实现一键部署、K ks部署等。 组件整合:考虑如何将不同组件组合成完整解决方案,并保持不同环境中的一致性。 微服务架构中的最佳实践 应用程序部署:建议将应用程序划分为不同的容器,每个容器内运行一个业务进程。 代码整合:提议将相关代码整合为一个文件进行管理。 微服务的优化与部署策略 微服务划分:强调避免过于细致的模块分割。 自动化:部署时不增加额外维护工作量,采用自动化策略。 关于存储方式和编排工具的选择 文件存储:如使用NFS作为本地分布式文件存储。 编排工具:推荐使用 rook 进行对象存储编排,数据库使用专用编排器。 NFS与Flexible File System的应用 苹果手机上的MFS:讨论了其使用情况和如何同步全局配置文件到各业务模块。 PV/PVC管理数据:示例讲解如何使用此文件系统进行数据管理。 二进制代码与配置文件的应用 代码适配:通过配置文件进行,涉及传递配置路径、文件映射等细节。 关于软件开发中的优化与改进 项目脚本编写:讨论了性能瓶颈、部署统一处理、服务发现模块的优化建议。 关于Web应用配置文件的编写与优化 IP分配:配置文件用于IP分配和模块间分段处理。 接口应用:如在不同环境使用不同的接口实现心跳等功能。 技术架构改进:优化轻量化、提高开发效率和维护效果等。 结论:本次讨论会涉及了开源部署环境的多个方面,从软件开发、部署、测试到微服务架构和存储方式等多个领域。希望通过此次讨论,可以为OpenIM的集群化部署提供有力的参考和指导。...

九月 17, 2023 · 2 分钟 · 342 字 · 熊鑫伟,我

自动化的高级追求: Prow 是什么?Kubernetes 为什么需要它

why? 故事是从这个 proposal 开始idea~ 🤖 OpenIM cicd robot machine proposal Prow是基于Kubernetes的CI/CD系统。作业可以由各种类型的事件触发,并将其状态报告给许多不同的服务。除了作业执行,Prow还以策略执行、通过 /foo 风格命令的聊天操作和自动PR合并的形式提供GitHub自动化。 有关 Golang 文档,请参阅 GoDoc 。请注意,这些库仅供prow使用,我们不会尝试保留向后兼容性。 Kubernetes 专门为 Prow 提供了网页命令查询: https://prow.k8s.io/command-help 关于Prow如何运行作业的简要概述,请参阅 Prow作业的生命周期 。 要查看Prow的常用用法和交互流,请参见拉取请求交互序列图。 hello world 最简单的一个上手案例莫过于 pull request 。 提出一个拉取请求(以下简称PR)。在PR正文中,可以随意添加区域标签(如果合适),例如 /area <AREA> 。标签列表在这里 。也可以随意推荐一位评论者 /assign @theirname 。 一旦你的审阅者满意,他们会说 /lgtm ,这将应用 lgtm 标签,如果他们是OWNER,将应用 approved 标签。 approved 标签也将自动应用于所有者打开的PR。如果你和你的审阅者都不是OWNER,请 /assign 某个所有者。如果你的PR有 lgtm 和 approved 标签,没有任何 do-not-merge/* 标签,并且所有测试均通过,则PR将自动合并。 查看测试结果 Kubernetes TestGrid 显示历史测试结果 在 testgrid/config.yaml 配置自己的 testgrid 仪表盘 Gubernator 格式化每次运行的输出 PR Dashboard 查找需要注意的 PR Prow 安排测试并更新问题 Prow 响应 GitHub 事件、定时器和在 GitHub 评论中给出的手动命令 。 prow dashboard 显示当前正在测试什么 在 config/jobs 配置 prow 运行新测试 Triage Dashboard 汇总故障 将故障集群在一起 搜索跨作业的测试失败 在特定的测试和/或作业的 regex 中过滤失败 Velodrome 指标跟踪作业和测试健康状况。 Kettle 进行收集,metrics 进行报告,velodrome 是前端。 功能和特性 prow 的功能很强大,甚至是比 actions 更加出众。可以测试、批处理、工件发布的作业执行。...

九月 16, 2023 · 5 分钟 · 858 字 · 熊鑫伟,我

速读开源项目 Sealos 的源码

准备 这篇文章等的太久了,大致 四个月了把,也是自己经历 docker 跨越到 Kubernetes 以及 CloudNative 生态的过程。 反过来再去理解开源、理解 sealos、 理解 Kubernetes,有种豁然开朗的视角。 这篇文章和其他文章不一样的是,这篇是按照自己现在的思路来写的,具体为什么,在以前的文章中能找到答案~ 从 CMD 角度上对接源码,从最开始出发: 不管是 sealer 还是 sealctl,都离不开 镜像的构建核心》 buildah: package main import ( "github.com/containers/buildah" "github.com/labring/sealos/cmd/sealctl/cmd" ) func main() { if buildah.InitReexec() { return } cmd.Execute() } 从 InitReexec 调用 buildah 初始化开始,进行走进 sealos 的大门:Execute 在 cobra 中,Execute 只会执行一次,不管是正确的还是失败的~ 在调用的时候,会先执行 init 初始化函数,它 定义了一些初始化工作以及标志: func init() { cobra.OnInitialize(func() { logger.CfgConsoleLogger(debug, showPath) }) rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "enable debug logger") rootCmd.PersistentFlags().BoolVar(&showPath, "show-path", false, "enable show code path") } 哈哈,sealos 对于日志包的封装,还是很让我惊喜的,使用了 zap 进行二次开发和封装,用于适合自己的业务需要,这对我是有参考意义的,包括 horizon,未来可能需要在 日志包和 错误码设计上进行改进,这是成就一个优秀的开源项目的必要条件~...

九月 11, 2023 · 12 分钟 · 2382 字 · 熊鑫伟, 我

开源的阶段性成长指南

✨ 熟悉我的人都知道,我是一名不折不扣的开源爱好者,从大一开始接触到 GitHub 后,逐渐的沉迷于 开源世界 ~ 今天这篇文章很特别,算是自己参考并且总结出来的开源阶段,以及学习开源项目的步骤和心得。未来自己也是按照自己的规划来进行成长。 同学习 Kubernetes 的成长轨迹 一样,这篇文章将会长期更新,也可以参与贡献 ~ 目前我是处于第一阶段,处于一种对开源世界和对知识的沉淀与积累的过程中,这个阶段的主要表现是我们开始学一些基础。但是我喜欢做笔记将它们记录下来,供自己日后翻阅和复习,当然也是制作自己的内容价值。 GitHub - cubxxw/awesome-cs-cloudnative-blockchain: 📚 菜鸟成长手册🚀 CS系列 、云原生系列、区块链系列、web3系列🔥、Golang系列💡…… 这一阶段,并不是意味着我开始迈入第二阶段,第一阶段就 come to an end. 我认为以下所讲的所有阶段就像是人生轨迹,并不是意味着你当爸爸了就不是父母的孩子,你依旧可以扮演着多种角色,并且不断完善和改进自己的角色。开源项目也是如此,类比我们的成长经历,在后一阶段我依旧会扮演好前一阶段的角色。所以我会坚持做自己的内容创作和知识共享 ~ ✨ 下面开始介绍适合大多数人的开源项目的不同阶段,为了方便定位,我将上面知识积累称呼为 0 阶段知识积累阶段。下面开始从第一阶段开始讲起~ 第一阶段:简单看源码阶段 💦 在这一个层次的我们,是一个刚毕业或者没毕业的大学生,又或者是刚刚踏入职场,我们是一个新手,对于开源项目保持一心热血但是不知道从何开始。 方法: 简单看源码 说明: 简单看源码、文档、跑跑样例代码 学习效果: 1 ~ 2 有产出: 没有产出 是否达成学习闭环: 尽量问题驱动看源码,从问题出发学源码回归问题,达成闭环 Get 到的技能点: 阅读源码的技能 案例: 阅读 sealer、sealos、Kubernetes、k3s、horizoncd 的源码,并且测试 阶段 第一阶段:简单看源码阶段 方法 简单看源码 说明 简单看源码、文档、跑跑样例代码 学习效果 1 ~ 2 有产出 没有产出 是否达成学习闭环 尽量问题驱动看源码,从问题出发学源码回归问题,达成闭环 技能点 阅读源码的技能 案例 阅读 sealer、sealos、Kubernetes、k3s、horizoncd 的源码,并且测试 第一阶段的建议是简单地看源码、文档、跑跑样例代码来学习。这个阶段的主要目的是积累基础知识,建议尽量问题驱动看源码,从问题出发学源码回归问题,达成闭环。阅读源码的技能是这个阶段最重要的技能点。建议阅读一些开源项目,例如 sealer、sealos、Kubernetes、k3s、horizoncd 等,并进行测试。...

五月 16, 2023 · 3 分钟 · 508 字 · Xinwei Xiong, Me

Openkf 多架构镜像的构建策略设计

自动化构建openkf的多架构镜像并推送到多个镜像仓库 https://github.com/openimsdk/openkf 描述: 为了满足各种用户的需求,我们的目标是自动化构建用于各种架构的openkf Docker镜像,并无缝地将它们推送到多个镜像仓库。 目标: 自动构建openkf的linux/amd64和linux/arm64架构的Docker镜像。 将镜像推送到Docker Hub、阿里云Docker Hub和GitHub容器仓库。 任务: 设置多架构构建系统 使用GitHub Actions,配合QEMU和Docker Buildx,支持linux/amd64和linux/arm64的多架构构建。 在每次新版本发布、提交到main分支或定期事件时,触发构建过程。 支持多个镜像仓库 Docker Hub:推送到openim/openkf-server。 阿里云Docker Hub:推送到registry.cn-hangzhou.aliyuncs.com/openimsdk/openkf-server。 GitHub容器仓库:推送到ghcr.io/openimsdk/openkf-server。 动态镜像标记 使用Docker Metadata Action,基于事件(如定期触发器、分支提交、拉取请求、语义版本控制和提交SHA)生成动态标签。 确保在拉取请求事件中不推送已构建的镜像。 身份验证和安全性 使用秘密配置Docker Hub、阿里云和GitHub容器仓库的身份验证。 确保每个仓库的推送操作都是安全且无缝的。 通知和日志 通过GitHub Actions,如果有任何构建或推送失败,向开发团队发送通知。 保留每次构建和推送操作的日志以供追踪。 验收标准: openkf镜像应该成功地为linux/amd64和linux/arm64架构构建。 在成功构建后,镜像应该在Docker Hub、阿里云Docker Hub和GitHub容器仓库上可用。 根据定义的事件和属性正确标记镜像。 整个过程中不需要人工干预。 附加说明: 自动化过程在GitHub Actions工作流中定义。确保根据需要查看和更新工作流。 确保在单独的分支或环境中测试此过程,以避免中断。

四月 23, 2023 · 1 分钟 · 46 字 · 熊鑫伟 (Xinwei Xiong)

Kubernetes一篇快速入门的文章

正片开始~ Kubernetes 是 Google 团队发起的一个开源项目,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为 Go 语言。Kubernetes 的组件和架构还是相对较复杂的。要慢慢学习~ 我们急需编排一个容器~ 为什么 kubernetes 弃用了 docker ::: tip 很意外 听到 Kubernetes 从 Kubernetes 版本 1.20 开始弃用对 Docker 作为容器运行时的支持,这似乎有点令人震惊。 Kubernetes 正在删除对 Docker 作为容器运行时的支持。Kubernetes 实际上并不处理在机器上运行容器的过程。相反,它依赖于另一个称为容器运行时的软件。. ::: docker 比 kubernetes 发行的早 docker本身不兼容 CRI 接口。Kubernetes 适用于所有实现称为容器运行时接口 (CRI) 标准的容器运行时。这本质上是 Kubernetes 和容器运行时之间通信的标准方式,任何支持此标准的运行时都会自动与 Kubernetes 配合使用。 Docker 不实现容器运行时接口 (CRI)。过去,容器运行时没有那么多好的选择,Kubernetes 实现了 Docker shim,这是一个额外的层,用作 Kubernetes 和 Docker 之间的接口。然而,现在有很多运行时可以实现 CRI,Kubernetes 维护对 Docker 的特殊支持不再有意义。 ::: warning 弃用的意义 虽然移除了 docker ,但是还是保留了以前的 dockershim,如果你愿意,你依旧可以使用 docker 容器化引擎提供容器化支持。 除了docker,还有 containerd、CRI-O...

四月 28, 2022 · 3 分钟 · 506 字 · 熊鑫伟,我