卫星实验室 on XLabs

Recent content in 卫星实验室 on XLabs

Introduction

<p>云原生专题围绕 Kubernetes 生态展开,涵盖弹性伸缩、应用交付、容器化与工程实践等方向,帮助团队系统掌握核心方案。</p> <h2 id="专题内容">专题内容</h2> <ul> <li><strong>KEDA 弹性伸缩</strong>:基于事件驱动的 Kubernetes 工作负载自动扩缩容方案,支持 Kafka、Prometheus、RabbitMQ 等多种事件源。</li> <li><strong>容器镜像最佳实践</strong>:Dockerfile 编写、多架构编译、镜像瘦身与安全扫描,以及 ORAS、skopeo 等辅助工具使用。</li> <li><strong>StatefulSet 磁盘扩容</strong>:PV/PVC 平滑扩容的实战方案与各 StorageClass 兼容性分析。</li> <li><strong>cert-manager 证书管理</strong>:使用 Pulumi 部署 cert-manager,为内网环境自动签发和信任自签名证书。</li> <li><strong>长连接负载均衡</strong>:K8S Service 长连接导致流量不均的问题分析与多种解决方案。</li> </ul> <h2 id="相关博客">相关博客</h2> <p>更多云原生实践内容请查阅 <a href="https://www.xlabs.club/blog/">技术博客</a> 中 <code>k8s</code>、<code>Docker</code> 等分类文章。</p>

2023/9/7
阅读更多

Introduction

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

2023/9/7
阅读更多

Kubernetes

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

2023/9/7
阅读更多

总体架构

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

2023/9/7
阅读更多

统一身份认证

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

2023/12/19
阅读更多

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

梳理 Spring Boot 4 关键特性、迁移步骤与常见问题,帮助团队从 3.x 平稳升级到 4.0 并完成验证

2025/11/25
阅读更多

Awesome Alternatives Bitnami:寻找 Bitnami Charts 的替代方案

Bitnami 停止更新后,汇总常用的替代 Helm Charts 和容器镜像方案,帮助团队平滑迁移

2025/11/3
阅读更多

Javax 和 Jakarta 过渡期兼容方案

详细介绍从 Javax 到 Jakarta EE 的迁移兼容方案,包括背景、工具选择和实施策略,帮助企业平滑完成迁移

2025/9/14
阅读更多

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

介绍 Maven CI 中禁止调用特定 API 的实现方式,借助 Forbidden APIs 在编译期拦截技术债

2025/9/9
阅读更多

Keycloak 自定义 User Federation SPI 实现:对接企业已有用户系统

通过 Keycloak SPI 实现自定义用户联合,将企业已有的 LDAP、AD 或自有用户系统接入 Keycloak 统一认证

2025/1/11
阅读更多