Go 语言中的并发类型检查与跨平台开发

OpenIM 跨平台源代码类型检查工具 开始 问题 在 OpenIM 的自动化道路中,涉及到越来越全面的自动化设计和测试,在这个过程中,我遇到了一个问题,于是完成了从 go 语言类型检测再到集成本地以及 CI 的全套体验。 问题是这个 issue:https://github.com/openimsdk/open-im-server/issues/1807 我们的 Go 代码在 32 位系统(linux/386)上运行时遇到了整数溢出问题。出现这个问题的原因是 Go 中的 int 类型随体系结构的不同而大小不同:在 32 位系统上相当于 int32,而在 64 位系统上相当于 int64。 恰好在 64 位机器上正常运行,但是在 32 位机器上会出现溢出的问题,于是想着去做一套检测的工具,来解决各个平台的类型检测。 第一部分:Go 语言基础回顾 在深入探讨代码之前,让我们回顾一下 Go 语言的一些基本概念,特别是包管理、并发编程和类型系统。这些概念是理解和使用 Go 语言进行有效编程的基础。 包管理 包的概念 Go 语言中的每一个文件都属于一个包,包是多个 Go 文件的集合。 包用于组织代码,防止命名冲突,并提高代码复用性。 导入包 使用 import 语句来导入其他包。 可以导入标准库包、第三方包,或自定义包。 创建自定义包 在项目中创建一个新的目录,该目录下的 Go 文件属于同一个包。 包名通常与目录名相同,但不是强制性的。 并发编程 Goroutine Go 语言的并发单元称为 goroutine。 使用 go 关键字来启动一个新的 goroutine。 Goroutine 比线程更轻量,能有效利用多核处理器。 Channel Channel 是用于在 goroutines 之间传递消息的管道。 可以是带缓冲的或无缓冲的。 通过 channel 进行数据传递可以避免竞态条件。 类型系统 类型声明 Go 是一种静态类型语言,每个变量都有一个明确的类型。 支持基本类型(如 int, float, bool),复合类型(如 struct, slice),以及用户定义的类型。 接口 接口类型是一种抽象类型,它指定了一组方法,但不实现这些方法。 任何具有这些方法的类型都可以实现该接口。 接口提供了一种方式来指定对象的行为。 类型断言和反射 类型断言用于检查接口值的动态类型。 反射是一种检查、修改变量类型和值的方法。 类型声明 在 Go 语言中,类型声明是定义新类型的方式。Go 支持多种类型,包括基本类型(如 int、float64、bool)、复合类型(如 array、slice、map、struct),以及接口类型。通过类型声明,你可以创建自定义的类型,这对于编写清晰、易于维护的代码非常重要。...

January 24, 2024 · 15 分钟 · 3176 字 · 熊鑫伟,我

向量数据库的学习

今天学习 rust ,发现 rust 是非常适合编写数据库的语言,找到了一个宝藏的项目 tikv,它的 github 项目地址是 https://github.com/tikv/tikv,是一个非常活跃的项目,但是我今天的主题是 AI 领域的向量数据库,话不多说,我们马上开始吧。 先决条件 0.1 基础知识介绍:了解向量数据库的基本定义及其与传统数据库的区别。 0.2 数据结构基础:学习向量和其他基本数据结构,如何在数据库中表示和操作这些结构。 0.3 线性代数入门:介绍向量运算,包括向量加法、减法和点乘。 0.4 相似性度量:了解如何计算向量间的相似度,例如余弦相似性。 0.5 数据库索引基础:介绍数据库索引的基本概念,特别是在向量数据库中的应用。 0.6 搜索算法初步:学习基础的搜索算法,理解如何在大型数据集中进行有效的搜索。 0.7 应用案例研究:研究向量数据库在不同领域(如推荐系统、图像识别)中的应用。 主要课程 1.1 向量数据库深入:探索向量数据库的高级特性和优势。 1.2 算法探究:深入了解在向量数据库中使用的关键算法,包括索引和搜索算法。 1.3 数据库设计:学习如何设计和实现一个有效的向量数据库架构。 1.4 集成机器学习:了解如何将向量数据库与机器学习模型集成,以提高性能和功能。 1.5 实际案例分析:通过分析实际案例来加深对向量数据库应用的理解。 1.6 高级数学概念:深入学习相关的高级数学概念,如高维空间的向量表示和操作。 1.7 项目实践:开展一个小型项目,实践向量数据库的设计和应用。 1.8 回顾和评估:复习所学内容,并通过评估来测试理解和应用。 0.1 基础知识介绍 向量数据库是一种特殊类型的数据库,它们使用数学向量来表示和存储数据。这与传统数据库有很大的不同,传统数据库通常使用表格和行来组织数据。 向量数据库的定义 💡 向量数据库是如何工作的? 在向量数据库中,数据以向量的形式进行存储和处理,因此需要将原始的非向量型数据转化为向量表示。数据向量化是指将非向量型的数据转换为向量形式的过程。通过数据向量化,实现了在向量数据库中进行高效的相似性计算和查询。此外,向量数据库使用不同的检索算法来加速向量相似性搜索,如 KD-Tree、 VP-Tree、 LSH 以及 倒排索引 等。在实际应用中,需要根据具体场景进行算法的选择和参数的调优,具体选择哪种算法取决于数据集的特征、数据量和查询需求,以及对搜索准确性和效率的要求。 它们是如何使用向量来存储和处理数据的? 向量数据库使用数学向量来存储和处理数据,这与传统的数据库存储方式有显著不同。这里的关键步骤和概念包括: 数据转换为向量 🔄 在向量数据库中,数据首先被转换为数学向量的形式。例如,文本数据可以通过自然语言处理技术转换为向量,图像数据可以通过深度学习模型转化为向量。 向量表示 📈 每个数据项都被表示为一个向量,这个向量在多维空间中有其特定的位置和方向。这些向量通常在高维空间中,每个维度代表数据的一个特征。 相似性搜索 🔍 向量数据库的一个关键功能是相似性搜索。它通过比较数据项的向量之间的距离(例如,使用余弦相似性)来找到相似的项。这对于处理复杂查询和大数据集特别有效。 索引和检索 📚 向量数据库使用高效的索引机制来快速检索和访问数据。这些索引帮助数据库快速定位查询中涉及的向量,从而加快搜索速度。 机器学习集成 🤖 许多向量数据库可以与机器学习模型紧密集成。这允许数据库不仅存储数据,还可以通过模型直接处理和分析数据,从而提供更高级的数据处理和分析能力。 通过使用向量来表示和处理数据,向量数据库能够处理更复杂、更丰富的数据类型,同时提供更快的搜索和检索性能。这使它们在如今的数据驱动世界中变得越来越重要。...

January 20, 2024 · 5 分钟 · 954 字 · 熊鑫伟,我

OpenIM:构建高效的版本控制和测试工作流程

OpenIM 构建高效的版本控制和测试流程 开源项目的成功与否在很大程度上取决于其质量管理和协作流程。在 OpenIM 开源社区中,项目管理和测试流程的规范性至关重要,以确保代码的质量和稳定性。本文将简要介绍我们的测试方案、分支管理和质量控制策略,以及如何应用于 main 分支、PR 测试分支和稳定的 release 分支,以满足开发者、测试人员和社区管理者的需求。除此之外,还将介绍OpenIM开源社区的规范、测试方案和项目管理策略,旨在提供清晰的指导,以确保项目的稳定性和可持续性。 分支管理与版本控制 对于 OpenIM 来说分支的版本管理策略是尤其重要的,这里面设计到两块,一块是 OpenIM 的部署分支策略,一个是镜像版本策略,这两块分别参考下面的文章: 分支以及 tag 的版本策略 镜像的版本策略 总的来说: 在OpenIM社区中,main 分支被视为稳定版本的代表。所有代码必须经过严格的代码审查和测试,确保其质量和稳定性,然后才能合并到 main 分支中。 release 分支用于发布稳定版本。在 openim-docker 以及 openim-k8s 中使用的镜像版本也都是 release-v3.* 。在 release 分支上的任何更改都应该是针对已知问题的修复或功能的精心策划的添加。测试工作应重点关注于 release 分支,以确保发布版本的可靠性。 测试方案 Main 分支测试 在 main 分支上进行的测试应覆盖核心功能和关键路径,以确保基本功能的稳定性。测试工作应包括单元测试、集成测试和端到端测试。这部分所有的工作全部交给自动化去做,而不需要测试干预。 Release 分支测试 对于三种仓库,分别是 https://github.com/openimsdk/open-im-server 仓库,https://github.com/openimsdk/chat 仓库,https://github.com/openimsdk/openim-sdk-core 仓库。 在 release 分支上进行的测试要求更严格。测试团队应深入测试所有功能,并着重检查先前已知的问题是否已解决。确保在发布前没有潜在的问题。 这里的 PR 合并规则: 以 这个PR 为例: 首先是 PR 标题,PR 标题 fix pageFindUser ,首先,我们知道 git commit 信息包括是三种:...

January 15, 2024 · 2 分钟 · 304 字 · 熊鑫伟,我

AI元年: 2024年的新兴挑战与趋势

2024年1月6日大语言模型分享会 模型的局限: 深度学习 预训练模型 大语言模型 大语言模型的涌现能力: Link: 大语言模型进化之谜:涌现现象的挑战与争议_AI_张俊林_InfoQ精选文章 大语言模型的特点趋势的转变: 大语言比人更懂人类的习惯。 使用 RLHF 训练 使用人类习惯的方式交互 大语言模型的发展脉络: 开源模型越来越多,比例越来越大。 预训练模型依旧是非常多的,但是微调的比例越来越高 如何学习大语言模型 模型结构的配置 大语言模型的微调 使用技巧 自己训练模型 不一定要只是单一的数据,也可以是数据的混合(包括自己提供的业务文档或者代码) 训练的数据来源: 当处理和准备用于机器学习模型训练的数据时,确保数据的质量、安全性、和去重非常重要。这里有一些关键步骤和方法,可以帮助你实现这一目标: 质量过滤(Quality Filtering): 确保数据准确无误:移除或修正任何错误的、不完整的或者是不准确的数据。 保证数据的一致性:确保所有的数据遵循同样的格式和标准。 数据去重(Data Deduplication): 识别和移除重复数据:使用算法或者工具来识别完全相同或高度相似的数据项,并将其合并或删除。 对于文本数据,可以使用哈希算法或者基于内容的去重方法。 隐私去除(Privacy Removal): 确保数据中不含有任何个人可识别信息(PII),如姓名、地址、电话号码等。 在某些情况下,可以使用数据脱敏技术,如匿名化或伪匿名化,来保护用户隐私。 分词(Tokenization): 对于文本数据,分词是将连续文本分割成更小单元(如单词、短语或字符)的过程。 分词的方法依赖于特定语言的语法和词汇结构。对于中文,可能需要特定的分词工具,因为中文是一个无空格分隔的语言。 解码器结构 “causal decoder"和"prefix decoder"是两种不同的解码器结构,它们在处理序列数据,尤其是在文本生成任务中扮演着重要角色。下面是这两种解码器的对比: Causal Decoder (因果解码器) 定义和应用: 因果解码器,如在GPT系列模型中所使用的,是一种单向解码器。 它在生成文本时,仅考虑已经生成的或给定的前文(即,它只看到左侧的上下文)。 工作原理: 在处理每个新词时,因果解码器仅使用前面的词作为上下文。 这种模式模拟了人类自然语言的生成方式,即基于已知信息顺序地产生新信息。 用途: 适用于文本生成任务,如故事叙述、自动写作、聊天机器人等。 特点: 保证了生成的文本是连贯的,并且在逻辑上遵循了之前的上下文。 不能回看或考虑未来的词汇或句子结构。 Prefix Decoder (前缀解码器) 定义和应用: 前缀解码器是一种可以同时考虑前文和后文的解码器,类似于BERT中的masked language model(MLM)。 它在处理数据时,可以同时考虑序列中的前缀和后缀信息。 工作原理: 在处理每个词时,前缀解码器使用前面的词和后面的一些占位符或掩码作为上下文。 这种方式使得解码器在生成某个词时,可以考虑到整个序列的结构。 用途: 常用于需要双向上下文理解的任务,如文本填空、句子完善、语言模型训练等。 特点: 能够在生成文本时考虑到更全面的上下文信息。 更适合于理解整个句子或段落的结构和含义。 模型结构的优化 模型结构优化一直以来都是比较fancy的工作,优秀的模型结构设计,可以大大提高模型参数的效率,甚至小模型效果可以超过大模型。本文我们以XLNet、ALBERT、ELECTRA为例进行分析。虽然他们也可以认为是预训练任务优化和模型轻量化方面的工作,但鉴于模型结构创新力度很大,我们还是在模型结构优化这个版块来分析他们。...

January 14, 2024 · 3 分钟 · 574 字 · Xinwei Xiong, Me

对开源商业化的思考 & 全球流量大会(GTC)学习以及总结

引言:深圳福田会展中心的全球视野 2023年12月6日,在深圳福田会展中心,GTC 2023 全球流量大会如火如荼地展开。这场盛会汇集了来自全球的技术精英,共同探索互联网行业的前沿动态和未来发展趋势。身为参与者,我有幸深入这场融合科技与商业的交流盛会,特别是“聚焦开源,扩展出海新领航”这一议题,让我收获颇丰,印象深刻。 大会聚焦于全球化的多元话题,包括出海市场的选择、广告推广策略等,与我此前参加的专注于日本市场出海活动的公司非常相似。然而,这次大会让我首次深入接触开源社区,不仅结识了众多开源界的领袖和布道者,也与许多杰出的开发者交流了心得。通过这些交流,我不仅学习到了许多新知识,还在思想上得到了升华。 在这篇博客中,我将对这次独特的经历进行深入的反思和总结,分享我在开源和全球化交汇中的洞见和学习。 对于 OpenIM 来说,我们现阶段正在全力准备奔向海外市场,希望打开国界,将 OpenIM 好用而且免费的开源核心功能贡献给全世界开发者。 开源项目天生就是分布式协作的,这是一种松散的结构。以 OpenIM 的开发者为例,我们现在有很多贡献者,开发者,虽然社区有双周会,但是还是很难和人或者同事有深层次的交流。 但对于开源商业公司而言,并不能简单的使用这种远程工作模式。在商业公司中,协作会更加的密切,而且对时效性的要求更高,当面沟通更能保证信息传递的完整性,这是远程工作难以替代的。当然,远程工作也有自己的优势,那就是吸引全球的人才。 所以,开源商业公司采用远程协作并没有问题,但一定要保证沟通的足够充分,拉平信息: 要视频沟通,文字只作为最终的记录。视频是沟通过程中信息丢失比较少的方式,是远程工作交流的首选方式。千万不要用文字来讨论非技术问题,这会带来巨大的信息差和误解。 保证沟通的尊重和善意。在开源项目中,大家因为没有雇佣关系,都是无偿做贡献,所以在异步沟通时特别强调尊重和善意;而在商业公司的远程办公时,因为缺少同事之间的沟通、吐槽和心理按摩,就更要注意沟通的尊重。 定期线下见面,增加相互之间的了解和信任。 另外一点,长期的远程协作,对于参与的工程师来说,除了需要很高的自律和自我管理的要求外,也要注意工作和生活的隔离,保持正常的社交活动和运动健身,否则很容易与社会脱节。 之前和 Apache APISIX 的某个小姐姐聊天,她说的一句话感触很深。也有很多适应不了远程工作的同事一一离去,这也是一个适者生存的达尔文法则。 关于 OpenIM 的远程工作,以及企业的文化,强烈推荐阅读下面的博客: Englist Version 中文版本 出海挑战:中国互联网企业的全球化之旅 中国互联网企业在全球化道路上的探索充满挑战与机遇。从初涉海外市场的尝试到在竞争激烈的国际环境中求生存,它们不断在新的市场环境中寻找增长点。这一过程中,企业需要超越传统的商业模式,适应多元文化和不同的市场需求。 首先,来到了第一个话题,为什么要去做海外社区? 和很多的开源社区的布道者和专家沟通交流,然后反思,我深信建立一个活跃的海外社区是开源项目成功的关键。在全球化的今天,开源不仅是关于代码的分享,更是一种文化和思想的交流。通过建立海外社区,我们不仅能将技术带到世界的每个角落,还能促进不同文化背景下的思想碰撞和创新。 人性化地讲,建立海外社区意味着建立更广泛的连接和共鸣。每一位开源贡献者,不论身处何地,都希望他们的声音被听见,他们的贡献被认可。海外社区提供了一个平台,让来自世界各地的开发者能够参与到项目中来,分享他们独特的视角和经验。这种多元化的参与不仅丰富了项目本身,还激发了更多创新的火花。 同时,海外社区的建立也是对开源精神的一种致敬。开源精神强调的是开放、协作和共享,而这些价值观在全球范围内都是通用的。当我们向海外扩展时,我们不仅在分享代码,更在传播这种包容和合作的精神。 此外,对于开源项目而言,海外社区的建立还意味着更广阔的市场和使用场景。不同的地区和文化背景下,用户对技术的需求和应用方式可能截然不同。这些多样性的输入是项目发展不可或缺的,它们有助于项目更全面地成长,更好地服务于全球用户。 我从大一开始接触 Github ,这个成功打开我通往未来的钥匙。 从2020年左右我开始接触开源,觉得开源比业务代码更有意义。因为开源不仅有技术积累,而且能把你学到的东西分享给其他人,一起成长,所以开源对程序员来说是一个双赢的事。 最开始的时候,我通过学习做笔记,分享笔记到 GitHub ,到后面做项目,参与到一些顶级的开源项目中来,然后慢慢的追求精益。整个过程,我很清晰的看到自己的成长。 甚至我的代码,就像 Git 或者 区块链的默克尔树结构,一步步的串起来记录,每当一个时间段,看到以前的 PR ,满满的都是回忆和尴尬 … 同样,我也是一个云原生的爱好者。 在如今这个时代,开源已经成为了一个不可逆的潮流,尤其是在云原生的领域。以微软为例,他们在 Github 上的开源项目贡献位居全球前列,这充分体现了他们对开源的全面拥抱。在云原生时代,如果你不拥抱开源,不利用开源组件去构建和优化你的核心系统,很可能会在激烈的市场竞争中落后。云原生技术的迅猛发展要求企业和开发者必须快速适应新技术和方法论,而开源社区正是这种创新和合作的孵化器。在这个时代,开源不仅仅是技术选择,更是一种必要的战略思维。 开源社区国际化选择:第一站,启航 美国:开源发展的领头羊 美国仍然是全球最大的开发者社区,拥有超过2000万的开发者,过去一年增长了21%。美国的开源社区历史悠久且成熟,是全球开源活动的重要推动者。 亚太地区:快速增长的新星 亚太地区,尤其是印度、日本和新加坡,正经历着显著的开源社区增长。印度的开发者社区增长尤为显著,预计到2027年将超过美国,成为全球最大的开源社区。 非洲:充满潜力的新兴市场 非洲各地区,尤其是尼日利亚、加纳和肯尼亚,也在迅速发展成为技术公司的新兴枢纽。这些地区的开发者数量每年都在显著增长。 南美洲:稳健增长的活跃区域 南美洲的开发者社区,特别是在阿根廷和巴西,也在持续增长,与亚太和非洲的增长速度相仿。 欧洲:稳定增长的成熟市场 欧洲的开源社区虽然增长速度较美国慢,但在西班牙、德国和英国等国家仍保持稳定增长。...

December 7, 2023 · 3 分钟 · 477 字 · 熊鑫伟,我

GitOps 实践理论:Kubernetes 部署策略深入解析

今天我们来看看 kubernetes 和 gitops 的理论实践 命令介绍 首先我们来看看 kubectl 支持的子命名,方便我们使用: kubectl apply - 应用一个或多个资源的定义。通常用于部署应用程序或更新资源。 kubectl get - 显示一个或多个资源的信息。这是查看 Kubernetes 集群中资源状态的常用命令。 kubectl describe - 显示一个或多个资源的详细信息,如事件、状态和配置。 kubectl delete - 删除 Kubernetes 集群中的资源。 kubectl exec - 在集群中的容器里执行命令。 kubectl logs - 打印容器的日志。 kubectl create - 从文件或标准输入中创建一个或多个资源。 kubectl edit - 编辑集群中的资源。这将打开一个编辑器来修改资源的配置。 kubectl port-forward - 将本地端口转发到集群中的 Pod。 kubectl run - 在集群中运行一个指定的镜像。 kubectl scale - 调整资源(如 Deployment、ReplicaSet)的副本数量。 kubectl rollout - 管理资源的部署,如查看状态、暂停、恢复或回滚更新。 除了上面的命令,Kubernetes 中的 kubectl 还支持注解: kubectl annotate 命令用于给 Kubernetes 集群中的资源添加或更新注解(annotations)。注解是一种附加信息,可以用于存储非识别性的元数据。它们通常用于管理工具、库和客户端以存储辅助信息,例如描述、版本信息等。...

November 25, 2023 · 10 分钟 · 2034 字 · 熊鑫伟,我

管理后台和监控的部署与设计

OpenIM 提供了多种灵活的部署选项,适用于不同的环境和需求。以下是这些部署方案的简化和优化描述: 源码部署: 普通源码部署:使用 nohup 方式进行部署。这是一种基础的部署方法,适合于开发和测试环境。详情参见:普通源码部署指南。 生产级部署:采用 system 方式,更适合于生产环境。这种方法提供了更高的稳定性和可靠性。详情参见:生产级部署指南。 集群部署: Kubernetes 部署:提供两种方式,包括通过 helm 和 sealos 进行部署。这适用于需要高可用性和可扩展性的环境。具体方法请参考:Kubernetes 部署指南。 Docker 部署: 普通 Docker 方式:适用于快速部署和小型项目。详细信息请见:Docker 部署指南。 Docker Compose 方式:提供了更便捷的服务管理和配置,适合于复杂的多容器应用。 接下来,我们将逐一介绍这些部署方法的具体步骤、监控和管理后台的配置,以及使用技巧,帮助您根据自己的需求选择最合适的部署方案。 源码 & Docker 部署 源码部署 openim-server 和 openim-chat ,其他的组件都是通过 Docker 部署。 docker 部署则通过 https://github.com/openimsdk/openim-docker 仓库一键部署所有的组件。 部署的配置文件,可以阅读 https://github.com/openimsdk/open-im-server/blob/main/scripts/install/environment.sh 文档了解如何学习以及熟悉各个环境变量。 对于 Prometheus 来说,默认是没有开启 Prometheus 的,如果需要开启的话,需要在 make init 之前设置环境变量: export PROMETHEUS_ENABLE=true # 默认是 false 然后执行:...

November 15, 2023 · 3 分钟 · 453 字 · 熊新伟,我

Hugo 的高级教程

来到进阶部分,就需要深度学习一些 Hugo 的高级技巧。 模块 Hugo 模块是 Hugo 的核心构建块。模块可以是您的主项目或较小的模块,提供 Hugo 中定义的 7种组件类型中的一种或多种:static、content、layouts、data、assets、i18n和archetypes。 您可以按照您喜欢的任何组合来组合模块,甚至可以挂载非 Hugo 项目的目录,形成一个大型的虚拟联合文件系统。 Hugo 模块由 Go 模块提供支持。有关 Go 模块的更多信息,请参阅: https://github.com/golang/go/wiki/Modules https://go.dev/blog/using-go-modules 一些示例项目: https://github.com/bep/docuapi是一个在测试此功能时已移植到 Hugo Modules 的主题。这是将非 Hugo 项目安装到 Hugo 文件夹结构中的一个很好的示例。它甚至展示了常规 Go 模板中的 JS Bundler 实现。 https://github.com/bep/my-modular-site是一个非常简单的用于测试的网站。 模块配置: top level 💡简单的一个案例如下: module:noProxy:nonenoVendor:""private:'*.*'proxy:directreplacements:""workspace:"off"noVendor 一个可选的Glob模式匹配模块路径,当自动售货时跳过,例如 github.com/** vendorClosest 启用后,我们将选择与使用它的模块最近的供应商模块。默认行为是选择第一个。请注意,给定的模块路径仍然只能有一个依赖项,因此一旦使用它,就不能重新定义它。 proxy 定义用于下载远程模块的代理服务器。默认值是 direct ,意思是“git clone”或类似的。 noproxy 逗号分隔的glob列表匹配不应使用上面配置的代理的路径。 private 逗号分隔的glob列表匹配应被视为私有的路径。 workspaces 要使用的工作区文件。这将启用Go工作区模式。请注意,这也可以通过OS env设置,例如 export HUGO_MODULE_WORKSPACE=/my/hugo.work 这只适用于Go 1.18+。在Hugo v0.109.0 中,我们将默认值更改为 off ,现在我们可以解析相对于工作目录的任何相对工作文件名。...

November 6, 2023 · 15 分钟 · 3095 字 · 熊鑫伟,我

Kubernetes Kustomize 学习指南

介绍 关于 kustomize github 地址 Get Started Kustomize 是一个专为 Kubernetes 设计的开源配置管理工具,它能帮助用户定制 Kubernetes 对象,并以声明式的方式管理这些对象,而无需修改原始的 YAML 文件1。这意味着你可以保留应用和组件的基本设置,同时通过应用名为“补丁”的声明式 YAML 文档来覆盖默认设置,而不会更改原始文件。Kustomize 提供了一种声明式的方法,符合 Kubernetes 的哲学,并且能够以一种可重用、快速生成、易于调试和可伸缩的方式定制 Kubernetes 配置。 Kustomize 的主要功能包括: 声明式配置: 允许你以声明式的方式定义和管理 Kubernetes 对象,例如部署、Daemonsets、服务、ConfigMaps 等,为多个环境提供支持,而无需修改原始的 YAML 文件 配置层叠: 通过利用层叠来保留应用和组件的基本设置,并通过覆盖声明式的 YAML 文档(称为补丁)来选择性地覆盖默认设置 集成与独立使用: Kustomize 可以作为一个独立的工具使用,或者与 kubectl 结合使用。从 Kubernetes 1.14 版本开始,kubectl 也开始支持使用 kustomization 文件来管理 Kubernetes 对象 Kustomize 提供了一种自定义 Kubernetes 资源配置的解决方案,该方案摆脱了模板和 DSL。 版本关系 & kubectl 集成 要查找kubectl最新版本中嵌入的kustomize版本,请运行 kubectl version : $ kubectl version --short --client Client Version: v1....

October 31, 2023 · 5 分钟 · 1004 字 · 熊鑫伟,我

设计 OpenIM 使用 Harbor 构建企业镜像仓库

需求 OpenIM 提供了多种公共的镜像注册地址,比如说 aliyun, github, Docker hub ~ 阅读 https://github.com/openimsdk/open-im-server/blob/main/docs/conversions/images.md 获取更多的镜像构建指南。 大部分企业都会选择自己做镜像仓库,使用 Harbor 来搭建企业级的镜像仓库,将它集成 CICD Pipeline 流程中,最终替换 Docker Hub,进一步降低镜像存储的成本。 此外,在生产环境下,Harbor 一般都会开启 TLS,所以你还需要准备一个可用的域名。 中国的服务器使用域名,需要对域名进行备案 安装 Helm Helm,以及 集群的部署参考 https://github.com/openimsdk/open-im-server/tree/main/deployments 安装 Cert-manager 接下来我们安装 Cert-manager,它会为我们自动签发免费的 Let’s Encrypt HTTPS 证书,并在过期前自动续期。 首先,运行 helm repo add 命令添加官方 Helm 仓库。 $ helm repo add jetstack https://charts.jetstack.io 然后,运行 helm repo update 更新本地缓存。 $ helm repo update 接下来,运行 helm install 来安装 Cert-manager。 $ helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1....

October 25, 2023 · 2 分钟 · 350 字 · 熊鑫伟,我