卫星实验室 on XLabs

Recent content in 卫星实验室 on XLabs

Introduction

云原生技术探索。

2023/9/7
articleCard.readMore

Introduction

卫星实验室,用开源探索边界,用分享传递价值。 此项目为卫星实验室主页 xlabs.club 的源码,在这里将分享我们的平台工程实践经验,介绍如何以技术驱动业务长期发展和高速增长。 欢迎提交 PR 进行开源共建。 主页内容 平台工程:我们的平台工程建设之路,关于 DevOps, DataOps, FinOps 以及 AIOps 的工程实践。 云原生:云原生技术探索,如何以云原生技术支撑起不断变化的复杂业务。 技术博客:研发踩坑记录,翻一翻总有惊喜。 awesome-x-ops:一些关于 AIOps、DataOps、DevOps、GitOps、FinOps 的优秀软件、博客、配套工具。 xlabs-ops:一些 IaC 运维脚本和通用模板,如 Argo Workflows 模板仓库,是对官方 Examples 的组合、扩展。 xlabs-developer-platform:一个基于 Backstage 自建的开发者平台。 backstage-plugins:卫星实验室的开源 backstage plugins,欢迎提交 PR。 License 本文档采用 CC BY-NC 4.0 许可协议。

2023/9/7
articleCard.readMore

Kubernetes

常用 Kubernetes 命令,复制,粘贴,这就是生活。 复制 secret 到另一个 namespace。 kubectl get secret mys --namespace=na -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=nb -f - 批量删除 pod。 kubectl get pods --all-namespaces | grep Evicted | awk '{print $2 " --namespace=" $1}' | xargs kubectl delete pod # Delete by label kubectl delete pod -n idaas-book -l app.kubernetes.io/name=idaas-book 原地重启 Pod。 kubectl rollout restart deploy/xxx -n your-namespace 命令行快速扩缩容。 # kubectl scale -h kubectl scale --replicas=1 deploy/xxx -n your-namespace 密钥解密。 kubectl get secret my-creds -n mysql -o jsonpath="{.data.ADMIN_PASSWORD}" | base64 --decode 合并多个 kube config 文件。 export KUBECONFIG=~/.kube/config:~/.kube/anotherconfig kubectl config view --flatten > ~/.kube/config-all cp ~/.kube/config-all ~/.kube/config # 顺手把权限改了,避免 helm 或 kubectl 客户端 warning chmod 600 ~/.kube/config 获取某个 namespace 下的全部资源,找出你看不见的资源,常用于 webhook/CR/CRD 等资源清理,解决强制删除失败。 ns=your-namespace for resource in `kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -o name -n $ns`; do kubectl get $resource -n $ns; # kubectl patch $resource -p '{"metadata": {"finalizers": []}}' --type='merge' -n $ns; done 根据特定字段排序 Pod 列表。 # 根据重启次数排序 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' -A

2023/9/7
articleCard.readMore

总体架构

我们的平台工程建设之路,介绍前期方案设计、中间踩坑历程。 原则 分享我们平台工程建设的一些基本原则。 以开发者为中心:赋能开发者,了解困难,解决问题,让开发者生活更轻松。 自动化:自动化手动和重复性任务,减少人为错误,提高效率。 标准化:标准化保持一致性,减少复杂性,减少团队认知负载,提供最佳实践和统一的编码结构。 模块化:松耦合且独立的模块,可独立开发、测试和部署。 弹性:可扩展水平扩缩容的能力,以及容错抗脆弱的能力。 安全:相比于微服务、云原生领域的安全,在平台工程里,更强调代码、基础设施、数据和其他资源的安全。 协作:平台工程师、开发人员、运维运营人员以及其他参与者之间的协作,提高生产力、促进创新并创造积极包容的工作环境。 持续改进:持续性反馈、评估、改进。 架构概述 为便于理解,我们仍然按照惯用架构模型,将架构分为 IaaS、CaaS、PaaS、Applications 这几个层级。 专业的运维人员作为 platform engineer 着重于 IaaS、CaaS、PaaS 建设,开发人员作为 application engineer 更专注于 PaaS、Applications 建设,为开发和运维提供工具、协作平台、基础应用。 C4Context title 平台工程总体架构 Boundary(users, "Users", "用户接入") { Person(superAdmin, "超级管理员") Person(admin, "平台管理员") Person(developer, "开发人员") Person(maintenance, "运维人员") } Boundary(console, "Console", "开发者平台") { Container(backstage, "Backstage","react","开发者门户") Container(apps, "应用管理平台","Application","容器管理、应用管理、配置管理、自动化测试") Container(ops, "统一运维平台","x-ops","数据库、中间件、日志、监控告警平台") Container(iam, "IAM", "Keycloak", "统一用户、组织、角色权限管理") } Boundary(paas, "PaaS", "PaaS") { ContainerDb(rds, "RDS", "PostgreSQL/MySQL", "PostgreSQL、MySQL 等关系型数据库") ContainerDb(clickhouse, "ClickHouse", "ClickHouse", "BI、Logging、Metrics 等列式数据库") ContainerDb(nosql, "NoSQL", "NoSQL", "ES、Redis、Mongo 等缓存数据库、文档数据库") ContainerDb(mq, "消息队列", "Kafka", "Kafka、RocketMQ 等消息队列") } Boundary(caas, "CaaS", "CaaS") { Container(k8s, "Kubernetes","k8s","K8S 容器平台") Container(workflow, "编排引擎","Argo","流水线,流程、应用编排引擎") Container(kms, "KMS","HashiCorp Vault","秘钥管理系统") Container(harbor, "Harbor","harbor","容器镜像仓库") Container(git, "IaC","GitLab","IaC、GitOps 源码仓库") } Boundary(iaas, "IaaS", "IaaS") { Container(vm, "云主机","vm","云主机自带本地存储") Container(cbh, "堡垒机","cbh","安全运维审计堡垒机") Container(s3, "S3","S3/Minio","分布式对象存储") Container(nfs, "NFS","nfs","共享文件存储") } UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="1") 基础设施标准化 基础设施标准化是平台工程建设的第一步,通过对基础设施服务进行标准化,减少开发人员和运维团队之间的摩擦,减少运维难度,大大降低出错的概率。

2023/9/7
articleCard.readMore

统一身份认证

统一身份认证(Identity and Access Management,身份认证和访问控制,简称 IAM)的技术选型和实践。 核心需求 集中管理:从一个地方管理账户和身份。 单点登录:允许用户使用一组凭据访问所有集成的系统和应用,避免记忆多个用户名和密码。 动态访问控制:基于角色和策略动态授予或撤销访问权限。 审计与合规:记录和监控访问活动,以支持合规性审计。 无缝快速集成:作为平台工程的一部分更强调“自助”,各个应用能够无缝快速接入,甚至有些应用只需要简单的权限能够不需要开发自动接入。 强化认证机制:采用多因素认证(MFA:OTP 口令、指纹、短信验证码等)方法,为重要操作增加额外防护。 技术选项 为满足以上需求,在初期技术选项时主要关注以下几个开源组件。 keycloak : 全面的 IAM 解决方案 ,实现用户、权限管理,单点登录、MFA 等。 Dex : 身份代理,连接多个身份源,仅作为 OpenID Connect。 Ory : 包含多个独立的组件,组成一个全家桶的解决方案。 oauth2-proxy : 反向代理工具,专为提供 OAuth 2.0 身份验证和授权服务而设计,附带基于用户、分组、角色的权限管理。 Pomerium : Pomerium 不仅仅是一个 OAuth 2.0 代理,它还提供了细粒度的访问控制,能够根据用户、组、和其他上下文属性来决定访问权限。 以下为 keycloak 和 Dex 的简单对比。为什么不把 Ory 加进来,因为没有实际用过,不便于发表意见,如果你是一个 Ory 用户欢迎补充。 特性/工具 Keycloak Dex 类型 全面的 IAM 解决方案 身份代理 用户管理 支持内置用户管理 不直接管理用户,依赖外部身份提供者 协议支持 OpenID Connect、OAuth 2.0、SAML 2.0 OpenID Connect SSO 支持 依赖外部身份提供者实现 社交登录 支持多种社交登录选项 不直接支持,可通过连接外部身份提供者实现 角色管理 支持复杂的角色和权限管理 不直接支持 扩展性 高,适合各种规模和复杂性的需求 适合将多个身份源统一到一个认证流程的环境 使用场景 需要全面、集中式身份管理的组织 需要统一多个身份源认证,如在云原生环境中 用户界面 提供丰富的用户和管理员界面 主要是 API,没有详细的用户界面 适用性 适用于需要完整 IAM 解决方案的组织 适用于作为多个身份源代理,尤其在 Kubernetes 环境中 以下为 OAuth2 Proxy 和 Pomerium 的简单对比。

2023/12/19
articleCard.readMore

Spring Boot 3 到 4 迁移完全指南:新特性、废弃功能与实战踩坑经验

2025 年 11 月,Spring Boot 4.0 正式发布,这次升级被业界称为爆炸性升级。同时对于云原生应用而言,这是一次不可错过的性能与效率跃迁: 🐳 容器化友好:模块化架构减少 30-50% 运行时占用,镜像更小、启动更快 ⚡ 启动速度提升 30-50%:多线程异步启动机制,容器冷启动时间显著缩短,更适合 Kubernetes 快速扩缩容 🚀 2-3 倍吞吐量提升:虚拟线程原生支持,I/O 密集型微服务资源利用率大幅提升,单实例可承载更高并发 🎯 云原生特性增强:内置弹性功能(重试、限流)、HTTP 接口客户端自动配置,简化微服务间通信 但这次升级也带来了 36 个废弃 API 移除、模块化架构重构、Tomcat 11 变更等挑战。本文基于 Spring Boot 官方文档和生产环境迁移经验,从原理到踩坑,提供完整、实用的迁移指南,助你平稳完成云原生应用的升级。 Spring Boot 4.0 核心新特性 作为 Spring Boot 3.x 之后的首个大版本更新,Spring Boot 4.0 基于 Spring Framework 7.0、Jakarta EE 11 和 Java 17+(推荐 Java 21 或 25),带来了模块化架构重构、虚拟线程原生支持、HTTP 服务客户端自动配置等重大变化。 Spring Boot 4.0 配套使用 Spring Cloud 2025.1.x。虽然版本号看起来只是中号版本变更,但实际上这是一次大版本变更,包含了大量破坏性变更和重要更新。 模块化架构 Spring Boot 4 将 spring-boot-autoconfigure 拆分为多个专注的模块,每个技术都有独立的 starter 和对应的测试 starter。

2025/11/25
articleCard.readMore

Javax 和 Jakarta 过渡期兼容方案

什么是 Jakarta EE,为什么要切换 Jakarta EE 就是 Java EE 的新名词。这里的 EE 全称是 Enterprise Edition,它是专门为企业级 Java 应用定义的一套规范,与 Java SE (Java Platform, Standard Edition) 相对应。 Java EE 是从 Java 1.2 版本开始推出的 Java 企业级开发平台,最初的名称是 J2EE (Java 2 Platform, Enterprise Edition)。随着 Java 的发展,它的名称于 Java 1.5 版本时更改为 Java EE (Java Platform, Enterprise Edition)。2009 年 Oracle 收购了 Sun,Java EE 开始由 Oracle 通过 JCP (Java Community Process) 开发和维护。 直到 2017 年,Oracle 将 Java EE 提交给了 Eclipse 基金会,并命名为 Eclipse Enterprise for Java。然而,由于"Java"这个名字的商标归 Oracle 所有,Eclipse 基金会无法继续使用 javax.* 和 java.*,因此,项目名称改为 Jakarta EE。

2025/9/14
articleCard.readMore

预防和消灭技术债:Maven CI 如何在编译时禁止调用某些特定 API

在日常开发中,我们经常遇到类似如下需求: 项目组提供了 SDK,某个 API 已经被标记为废弃,但是大家迟迟不升级,项目组还需要花费时间维护已经废弃的 API。 有些项目在使用 JDK 已经废弃的 API,这些废弃 API 在更高版本 JDK 中已经删除,导致推动升级 JDK 比较困难。 有些项目会跨版本混合编译,比如用 Java 8 编译运行在 Java 21 上,常见的错误比如 javafx.util 在 Java 21 默认已经去掉了,就会出现编译成功却运行时失败。 所以我们想提供一种方案,能不能在编译期就强制禁用某些 API,主动阻止让编译不通过,提前报错及早发现及早处理。 实现方案 当前我们使用 maven forbiddenapis 插件,结合 CI 流程来实现。 执行效果,如果有使用禁用的 API,能看到类似如下错误提示,编译失败并给出原因。 12:40:30.647 [INFO] 12:40:30.648 [INFO] --- forbiddenapis:3.9:check (check-forbidden-apis) @ app-biz --- 12:40:30.657 [INFO] Scanning for classes to check... 12:40:30.661 [INFO] Reading bundled API signatures: jdk-deprecated-1.8 12:40:30.694 [INFO] Reading API signatures: /usr/share/maven/conf/forbidden-apis.txt 12:40:30.694 [INFO] Loading classes to check... 12:40:30.695 [INFO] Scanning classes for violations... 12:40:30.849 [ERROR] Forbidden class/interface use: javafx.util.Pair [禁止使用 JavaFX 相关类] 12:40:30.850 [ERROR] in com.tester.HomeController (HomeController.java:11) 12:40:30.865 [ERROR] Scanned 13 class file(s) for forbidden API invocations (in 0.21s), 1 error(s). 12:40:30.872 [INFO] ------------------------------------------------------------------------ 24784 [INFO] --- forbiddenapis:3.9:check (check-forbidden-apis) @ app-api --- 24812 [INFO] Scanning for classes to check... 24884 [INFO] Reading bundled API signatures: jdk-deprecated-1.8 25016 [INFO] Reading API signatures: /usr/share/maven/conf/forbidden-apis.txt 25017 [INFO] Loading classes to check... 25106 [INFO] Scanning classes for violations... 25984 [ERROR] Forbidden method invocation: java.net.URLEncoder#encode(java.lang.String) [Deprecated in Java 1.8] 25984 [ERROR] in com.tester.FormBody$FormBodyBuilder (FormBody.java:60) 26110 [ERROR] Scanned 660 class file(s) for forbidden API invocations (in 1.31s), 2 error(s). 26113 [INFO] Maven 核心配置 首先,在父 pom 里增加了以下片段,此内容主要含义:

2025/9/9
articleCard.readMore

Spring Security 集成 Keycloak 实现用户 RBAC、ABAC 授权

使用 Spring Security Resource Server 和 Keycloak,实现用户 RBAC、ABAC 授权,主要介绍: Spring Security Resource Server 如何与标准 OAuth2 协议集成。 Spring Security Resource Server 如何与 Keycloak Authorization Server 集成。 如何校验和解析 JWT Token,获取用户详细信息。 如何使用 keycloak admin client 获取更多信息,执行更高级动作。 Spring Security JWT Token 模式下如何方便本地 Debug,如何通过 keycloak admin client 模拟用户登录。 在开始之前我们先解释几点: Keycloak 官方的 Spring Boot Starter 后续将逐渐停止维护,所以我们只用 keycloak 的 client,自己实现一部分代码,有 client sdk 实现起来很容易。 Spring Security OAuth 2.0 Resource Server 也有多种集成方式,这里我们只实现 JWT 这一种,并且是 sessionless 的,也就是只负责授权不负责 登录认证, 登录由网关通过 oauth2-proxy 实现,详情可参考另一篇博客介绍 traefik-oauth2-proxy-keycloak 。

2024/11/24
articleCard.readMore

Backstage 集成 oauth2-proxy 和 Keycloak,实现用户管理、登录认证以及 RBAC、ABAC 授权

基于 K8S 部署 Backstage,集成 oauth2-proxy 和 Keycloak,实现用户管理、认证和授权,配置详解和原理介绍。 如果你遇到以下问题或诉求,可以参考此文档。 Backstage 接入 oauth2-proxy,登录或认证失败。 Backstage 实现 RBAC、ABAC 授权管理,以及如何实现自定义权限。 oauth2-proxy 对接 keycloak,参数不理解或者配置一直错误。 在开始之前,我们先了解一个点,Backstage 官方开源有开箱即用的容器镜像,也有丰富的插件生态,然而区别于其他插件类应用,Backstage 有自己的特点: Backstage 插件分为 frontend 和 backend,一个完整的插件可能包含两种,也可能只包含其中一种。 开源发布的开箱即用的容器镜像,只包含基础插件,一般只用来作为初次学习使用。 如果想使用其他插件,需要做一些编码工作,一般步骤如下。 使用 npx @backstage/create-app@latest 创建一个基础项目。 按插件要求安装插件,配置插件菜单、UI 效果、权限、认证信息等,每个插件要求不同。 按需开发自己的插件。 编译成新容器镜像,某些插件可能还需要在容器中额外安装一些依赖包,部署时使用此容器镜像。 基本上每个插件都有自己的配置要求,需根据插件文档配置 app-config.yaml。 可以把 Backstage 类比于 Spring Boot,提供了 starter、framework、plugins,如果想真实使用,需要自己引入依赖,编译成自己的镜像发布部署,欢迎 star 我们基于 Backstage 定制的开源项目 xlabs-developer-platform 。 核心组件介绍: 用户同步使用 Red Hat 贡献的社区开源插件 @backstage-community/plugin-catalog-backend-module-keycloak ,将 keycloak 用户同步到 Backstage 数据库,后面我们会提到为什么需要这一步。 认证使用官方内置的 OAuth 2 Proxy Provider . 授权,权限管理 Permissions,支持 RBAC、ABAC, 使用 Red Hat 贡献的社区开源插件 @backstage-community/plugin-rbac ,虽然插件名字叫 RBAC,但是实际上支持 ABAC。注意 Spotify 也有 RBAC 插件 需要购买 License 才能用,两个插件别弄混了。 以上认证和授权是独立的,如果你只需要认证,不需要授权,那可以不需要 RBAC 插件。

2024/11/16
articleCard.readMore