Helm Chart 编写与私有仓库管理

为什么需要 Helm 裸用 kubectl apply -f 管理 K8s 应用,在规模小时够用,但随着环境增多(dev/staging/prod)和服务增长,问题立刻暴露: 配置硬编码:每个环境一份 YAML,镜像 tag、副本数、资源限制全写死,改一个值要改十个文件 无版本管理:升级回滚靠手动记录,不知道上次部署了什么版本 无法复用:部署 Redis 和部署 MySQL 写两套完全不同的 YAML,无法模板化 Helm 是 K8s 的包管理器,把一组 K8s 资源打包成 Chart,通过 values.yaml 参数化配置,实现一份模板、多环境部署、版本化升级和一键回滚。 本文参考 Helm 官方文档 Helm Chart 目录结构 my-web-app/ ├── Chart.yaml # Chart 元信息(名称、版本、描述) ├── values.yaml # 默认配置值 ├── values-prod.yaml # 生产环境覆盖配置 ├── charts/ # 依赖的子 Chart ├── templates/ # K8s 资源模板 │ ├── _helpers.tpl # 命名模板(可复用的模板片段) │ ├── deployment.yaml # Deployment │ ├── service....

January 16, 2025 · 10 分钟 · 2088 字 · 徐保金

Linux 防火墙:iptables/nftables 入门与实践

概述 Linux 防火墙经历了从 ipfwadm → ipchains → iptables → nftables 的演进。底层均基于 Netfilter 框架,但上层语法和管理方式不断改进。从 Netfilter 架构出发,深入 iptables 的五链四表、nftables 的优势与用法、NAT/端口转发、连接追踪机制以及生产环境的性能优化实践。 Netfilter 框架 架构概览 Netfilter 是 Linux 内核中的数据包处理框架,通过在内核网络栈的关键位置挂载钩子(hook)来实现数据包过滤、地址转换、连接追踪等功能。 Netfilter 钩子点 [数据包进入] → PREROUTING → [路由判断] →─┬─→ FORWARD → POSTROUTING → [数据包发出] │ └─→ INPUT → [本地进程] → OUTPUT → POSTROUTING → [数据包发出] 五大钩子点 钩子点 触发时机 中文含义 NF_INET_PRE_ROUTING 数据包进入网络栈,路由前 路由前 NF_INET_LOCAL_IN 数据包目的地是本机 输入 NF_INET_FORWARD 数据包需要转发到其他接口 转发 NF_INET_LOCAL_OUT 本机产生的数据包 输出 NF_INET_POST_ROUTING 数据包即将离开网络栈 路由后 数据包流向 入站(访问本机): NIC → PREROUTING → INPUT → 本机进程 出站(本机发出): 本机进程 → OUTPUT → POSTROUTING → NIC 转发(经过本机): NIC → PREROUTING → FORWARD → POSTROUTING → NIC iptables 五链四表 四张表 iptables 通过"表"来组织不同功能的规则链:...

January 10, 2025 · 13 分钟 · 2596 字 · 徐保金

SRE 可靠性工程:从理论到落地

可靠性工程:不只是"不出故障" 可靠性工程的目标不是追求零故障——那既不现实也不经济。真正的目标是:在故障不可避免的前提下,让系统具备快速发现、自动恢复、持续学习的能力。 Google SRE 提出的核心公式: MTTR << MTBF / (MTBF + MTTR) × (1 - SLO) 这个公式揭示了一个关键事实:当故障间隔(MTBF)远大于修复时间(MTTR)时,系统的可用性自然趋近于 SLO 目标。因此,可靠性工程的发力方向是双重的——延长无故障时间(提升 MTBF)和缩短故障恢复时间(降低 MTTR)。 可靠性层级模型 参考 CMMI 能力成熟度模型的思想,可靠性工程同样存在层级递进关系。从低到高分为五个层级: 层级 特征 典型表现 L1 被动响应 故障发生后人工处理 告警轰炸 → 人工排查 → 手动恢复 L2 监控覆盖 关键指标可观测 仪表盘完备,告警有阈值,但恢复仍靠人 L3 自动化恢复 常见故障自动处理 健康检查自动重启、HPA 自动扩容 L4 主动预防 提前发现风险 压测、容量规划、混沌工程主动注入故障 L5 自愈系统 闭环自适应 故障自动感知 → 诊断 → 恢复 → 学习 大部分团队的真实水平在 L2 到 L3 之间。从 L3 到 L4 的跨越是最关键的——它意味着从"等故障来"转变为"主动找故障"。L5 自愈是理想态,也是持续演进的方向。 层级跃迁的关键 L1 → L2:建设可观测性体系(指标、日志、链路追踪)。 L2 → L3:引入自动化恢复机制(Kubernetes 健康检查、HPA、自动故障转移)。 L3 → L4:引入混沌工程,主动验证系统的弹性。 L4 → L5:建设自愈闭环,将人工经验沉淀为自动化策略。 每一层级的跨越都需要对应的技术投入和组织能力建设,不能跳级。...

January 9, 2025 · 5 分钟 · 1060 字 · 徐保金

Kubernetes 集群升级策略:从规划到零故障落地

概述 Kubernetes 每年发布三个版本,每个版本的支持周期约为 14 个月。这意味着生产集群大约每 6-12 个月就需要进行一次版本升级。集群升级是 K8s 运维中最敏感的操作之一——既要紧跟社区获得安全补丁和新特性,又要确保升级过程中业务零中断、零故障。 我将从版本策略制定、升级前准备、升级执行流程、蓝绿/金丝雀策略、回滚机制到生产环境实战,系统性地讲解 Kubernetes 集群升级的完整方法论。 一、Kubernetes 版本策略 1.1 版本发布节奏 Kubernetes 每年发布三个小版本(约每 15 周一个),版本号的命名规则经历了从北欧神话地名到主题词的演变: 版本 代号 发布时间(约) 关键特性 v1.30 Uwubernetes 2024-04 结构化认证配置 v1.31 Ichigo 2024-08 AppArmor GA、动态资源分配 v1.32 Penelope 2024-12 用户命名空间 Beta v1.33 Patricia 2025-04 Sidecar Containers GA v1.34 衔尾蛇 2025-08 Kubelet 凭证提供者 v1.35 Timbernetes 2025-12 Pod 资源就地更新 GA、Gang 调度 v1.36 Haru 2026-04 User Namespaces GA、CEL 准入策略 v1.37 — 2026-08(预期) — 参考:Kubernetes Release History...

January 3, 2025 · 14 分钟 · 2895 字 · 徐保金

Prometheus 自动化巡检脚本集

概述 监控系统本身也需要被监控。Prometheus 采集了整个基础设施的指标,但如果 Prometheus 自己的配置出了问题、某个 target 掉线了、SSL 证书快过期了、告警规则写得有语法错误——谁来发现这些问题?答案是:一套自动化巡检脚本。本文围绕 Prometheus 生态,构建一套覆盖"拨测→证书检查→配置审计→规则验证→告警模拟→报表生成"的完整巡检工具集。 参考来源:Prometheus 官方文档、Blackbox Exporter 一、批量服务拨测脚本 1.1 基于 Blackbox Exporter 的拨测 Blackbox Exporter 是 Prometheus 官方的黑盒探测工具,支持 HTTP、TCP、ICMP、DNS 等协议。通过 Prometheus API 查询探测结果,可以实现批量服务健康检查: #!/usr/bin/env python3 """ 批量服务拨测脚本 通过 Prometheus API 查询 Blackbox Exporter 探测结果 """ import requests import json from datetime import datetime from typing import List, Dict, Optional from dataclasses import dataclass, asdict import smtplib from email.mime.text import MIMEText import sys @dataclass class ProbeResult: """探测结果""" instance: str module: str # http_2xx, tcp_connect, icmp 等 success: bool status_code: Optional[int] duration: float # 探测耗时(秒) error: Optional[str] last_error: Optional[str] ssl_cert_expiry_days: Optional[float] class PrometheusProber: """Prometheus 拨测器""" def __init__(self, prometheus_url: str, timeout: int = 30): self....

December 19, 2024 · 19 分钟 · 3844 字 · 徐保金

混沌工程:主动发现系统弱点

概述 传统的可靠性保障思路是"尽量不出故障"——加监控、加告警、加冗余。但这种被动防御有一个根本缺陷:你不知道系统在故障发生时的真实表现,直到故障真正发生。 混沌工程反其道而行之:主动、可控地注入故障,在故障变成事故之前发现系统的弱点。 它不是搞破坏,而是一种科学的实验方法——提出假设(“系统应该能承受某节点故障”),设计实验(杀掉一个节点),验证假设(服务是否仍然正常),发现弱点(如果服务异常了)。 Netflix 的 Chaos Monkey 开创了这一领域,如今混沌工程已经成为 SRE 体系的重要组成部分。从原理、实验设计、爆炸半径控制、Kubernetes 实战到常态化实践,详细梳理如何把混沌工程从"概念"落地为"日常实践"。 关于混沌工程的原则,可参考 Principles of Chaos Engineering 和 Chaos Engineering Book。 一、混沌工程的原理 核心思想 混沌工程的核心思想是: 在正常流量期间,通过有意注入故障来验证系统的弹性,从而在故障变成事故之前发现并修复弱点。 这与传统的测试有本质区别: 维度 传统测试 混沌工程 目标 验证"代码是否正确" 验证"系统是否能承受故障" 环境 测试环境 生产环境(或接近生产的预发环境) 故障来源 预定义的测试用例 真实模拟的故障场景 发现时机 开发阶段 运行阶段 关注点 功能正确性 系统弹性 为什么要在生产环境做 混沌工程最反直觉的一点是"在生产环境注入故障"。为什么不 在测试环境做? 测试环境无法复制生产的复杂性:生产环境的流量模式、数据量、网络拓扑、依赖关系与测试环境完全不同 测试环境的故障不会造成真实影响:没有压力,就不会暴露在压力下才出现的问题 只有在生产环境才能验证完整的恢复链路:告警是否触发?On-Call 是否响应?自动恢复是否生效? 当然,直接在生产环境做混沌实验需要严格的控制——这正是"爆炸半径控制"要解决的问题。 混沌工程的四条原则 根据 Principles of Chaos Engineering,混沌工程遵循以下原则: 围绕稳态行为定义"正常":先定义系统的正常状态(SLI/SLO),再注入故障看是否偏离 假设稳态在对照组和实验组中都保持:一部分流量/节点不注入故障(对照组),一部分注入(实验组),对比差异 在真实环境中实验:生产环境或接近生产的环境 自动化持续运行:不是一次性实验,而是持续自动化运行 混沌工程的收益 chaos_engineering_benefits: direct_benefits: - "提前发现系统弱点和单点故障" - "验证告警和恢复机制是否有效" - "提升团队对故障的响应能力" - "验证架构设计假设是否成立" indirect_benefits: - "建立团队对系统弹性的信心" - "驱动架构改进(从'看起来能扛'到'验证过能扛')" - "减少真实故障的 MTTR(因为已经演练过类似场景)" - "培养'故障不可避免'的工程文化" 二、从 Chaos Monkey 说起 Netflix 的混沌工程演进 Netflix 是混沌工程的开创者,其演进路径值得参考:...

December 17, 2024 · 8 分钟 · 1689 字 · 徐保金

服务依赖地图与故障域分析:从拓扑发现到爆炸半径控制

概述 在现代微服务架构中,一个看似简单的用户请求可能穿越数十个服务节点。当故障发生时,SRE 工程师面对的第一个问题往往不是"怎么修",而是"影响范围有多大"。如果无法快速回答这个问题,故障恢复就会被拖延在无休止的排查中。 服务依赖地图(Service Dependency Map)和故障域分析(Failure Domain Analysis)是解决这一问题的工程方法论。前者解决"谁依赖谁、怎么依赖"的认知问题,后者解决"故障会扩散到哪、爆炸半径多大"的控制问题。两者结合,构成了 SRE 可靠性工程的基础设施。 从依赖拓扑的发现方法出发,深入分析故障域的识别与隔离策略,最后给出爆炸半径控制的工程实践方案。 服务依赖的复杂性本质 微服务架构下的依赖特征 单体应用时代的依赖关系是显式的、编译期的——通过 import 语句和函数调用就能完整描绘依赖图。微服务架构彻底改变了这一范式: 维度 单体应用 微服务架构 依赖发现方式 代码静态分析 运行时流量观测 依赖类型 函数调用 HTTP/gRPC/消息队列/事件总线 依赖稳定性 编译期确定 运行时动态变化 依赖可见性 IDE 可直接跳转 需要专门工具发现 故障传播路径 进程内异常栈 跨网络级联故障 依赖数量级 几十到几百 几百到几千 依赖关系的分类体系 并非所有依赖都具有相同的风险等级。一个成熟的依赖地图必须对依赖关系进行分类标注: 按调用方式分类: 同步调用:HTTP REST、gRPC、数据库查询。调用方阻塞等待响应,是级联故障的主要传播路径。 异步调用:消息队列(Kafka、RabbitMQ)、事件总线。调用方不阻塞,但消费端故障可能导致消息积压。 共享资源依赖:共用数据库、缓存集群、存储卷。资源竞争可能引发间接故障。 基础设施依赖:DNS、服务发现、配置中心。这类依赖故障影响面极广,属于关键路径。 按关键性分类: 强依赖:被依赖方不可用时,调用方无法完成核心功能。例如订单服务依赖库存服务。 弱依赖:被依赖方不可用时,调用方可降级运行。例如商品详情页依赖推荐服务。 条件依赖:在特定场景下才触发的依赖。例如促销活动期间才调用的优惠券服务。 # 依赖分类标注示例 class DependencyType: SYNC_HTTP = "sync_http" SYNC_GRPC = "sync_grpc" ASYNC_MQ = "async_mq" SHARED_DB = "shared_db" SHARED_CACHE = "shared_cache" INFRA_DNS = "infra_dns" INFRA_SERVICE_DISCOVERY = "infra_sd" class DependencyCriticality: STRONG = "strong" # 不可降级 WEAK = "weak" # 可降级 CONDITIONAL = "conditional" # 条件触发 # 依赖关系数据结构 class ServiceDependency: def __init__(self, caller, callee, dep_type, criticality): self....

December 16, 2024 · 17 分钟 · 3412 字 · 徐保金

Postmortem 文化:从故障中学习的工程实践

概述 每一个故障都是一次免费的学习机会——前提是你有机制从中提取经验。Postmortem(事后复盘)不是写检讨书,不是找替罪羊,而是一套结构化的工程方法,用于把故障中的经验转化为系统性的改进。 Google SRE 的核心信条之一是:“Blameless postmortem”——无指责复盘。复盘的焦点永远是"系统为什么失败了"而非"谁搞砸了"。这不是温情主义,而是工程理性:如果人们在复盘时感到威胁,他们就会隐藏信息,而你将永远无法看到故障的真正根因。 从复盘文化的意义、blameless 原则、根因分析方法、复盘模板、改进项跟踪到组织文化障碍,详细梳理如何把 Postmortem 从"走流程"变成"真学习"。 关于 Postmortem 文化的系统方法论,可参考 Google SRE Book - Postmortem Culture 和 Google SRE Workbook - Postmortem。 一、为什么需要 Postmortem 文化 故障不可避免的工程现实 分布式系统的故障不是"如果"的问题,而是"何时"的问题。一个典型的微服务架构可能有上百个服务节点、数十个依赖系统、跨多个可用区部署,组合复杂度呈指数级增长。在这个复杂度下,以下场景几乎必然发生: 网络分区导致服务间调用超时 配置变更引发级联故障 依赖的第三方 API 限流或不可用 数据库连接池耗尽 某次发布引入了边界条件的 bug 问题不在于故障是否发生,而在于:同一个故障是否会重复发生。 不做复盘的代价 没有 Postmortem 文化的团队,通常会陷入以下循环: 故障发生 → 紧急修复 → 松一口气 → 不了了之 → 类似故障再次发生 这个循环的代价远比你想象的大: 维度 代价 重复故障 同类根因未消除,故障反复发生,MTBF 无法提升 知识断层 关键排查经验留在个人脑中,人员流动后经验丢失 信任消耗 团队反复犯类似错误,管理层和用户信任持续下降 个人压力 无制度保障,值班人员独自承担心理压力,加速 burnout 改进无追踪 修复措施停留在口头和聊天记录中,无跟踪无验收 做 Postmortem 的工程价值 一个成熟的 Postmortem 体系能带来三个层面的价值:...

November 26, 2024 · 6 分钟 · 1255 字 · 徐保金

Kubernetes 成本优化实战:从资源治理到 FinOps 体系

概述 Kubernetes 已成为云原生应用的标准运行平台,但其弹性与灵活性也带来了成本管理的巨大挑战。根据 Flexera 2024 云状态报告,企业平均有 32% 的云支出属于浪费,而 Kubernetes 集群的资源浪费尤为突出——一个缺乏治理的 K8s 集群,资源利用率往往低于 30%。 Kubernetes 成本优化不是一次性的配置调整,而是一个从资源治理、自动扩缩容、实例类型选择到 FinOps 文化建设的系统工程。从实际生产经验出发,给出一套可落地的 K8s 成本优化方法论。 Kubernetes 成本浪费的根源 资源配置的三大陷阱 在深入优化之前,必须先理解成本从哪里流失。K8s 的资源浪费主要来自三个层面: 浪费来源 表现 根因 影响占比 Requests 过高 节点 CPU/内存利用率低 开发按峰值而非实际需求配置 40-50% 无自动扩缩容 低峰期节点空跑 缺少 HPA/VPA/Cluster Autoscaler 20-30% 实例类型不当 全部使用按需实例 未利用 Spot/预留实例 15-25% 镜像冗余 大镜像拖慢部署、占用存储 缺少镜像优化和多阶段构建 5-10% 陷阱一:用峰值配置 Requests 这是最常见的浪费。开发团队为了保证服务"不出事",倾向于把 Requests 设得很高。一个实际只需 200m CPU 的服务,Requests 被设为 1000m,导致节点只能调度少量 Pod,大量 CPU 资源闲置。 # 典型的过度配置 apiVersion: apps/v1 kind: Deployment metadata: name: api-service spec: template: spec: containers: - name: api resources: requests: cpu: "2000m" # 实际使用 200m,浪费 90% memory: "4Gi" # 实际使用 512Mi,浪费 87% limits: cpu: "4000m" memory: "8Gi" 陷阱二:缺少 LimitRange 和 ResourceQuota...

November 22, 2024 · 17 分钟 · 3579 字 · 徐保金

Kubernetes 多集群管理实践

概述 当你的业务规模增长到单集群无法承载时,多集群就成为必然选择。可能的原因包括:单集群节点上限(5000 节点)、多地域部署、混合云策略、故障隔离、合规要求。但多集群带来的管理复杂度是指数级增长——应用如何跨集群部署、服务如何跨集群发现、配置如何同步、故障如何切换。 本文逐步梳理多集群的架构模式、主流管理工具对比,以及跨集群服务发现、CI/CD、容灾切换的实践方案。 本文基于 Kubernetes v1.30。多集群管理领域仍在快速演进,部分工具的成熟度需持续关注。 为什么需要多集群 单集群的瓶颈 瓶颈 说明 规模上限 K8s 单集群推荐上限 5000 节点、15 万 Pod、30 万容器 故障域 单集群 etcd 故障影响所有业务 升级风险 集群升级可能影响所有业务 多租户隔离 软隔离不如硬隔离 地域延迟 跨地域不能用一个集群 合规要求 数据不能跨地域/跨境 多集群的典型场景 场景 架构 目标 多地域容灾 每地域一个集群,DNS 全局负载均衡 RTO < 5min 混合云 云上 + 自建机房 弹性 + 合规 开发/测试/生产隔离 每环境一个集群 安全隔离 多租户硬隔离 每租户独立集群 安全合规 边缘计算 中心集群 + 边缘集群 低延迟 多集群架构模式 模式一:Hub-Spoke(中心辐射) ┌─────────┐ │ Hub │ ← 管理集群 │ Cluster │ └────┬────┘ ┌────────┼────────┐ ▼ ▼ ▼ ┌──────┐ ┌──────┐ ┌──────┐ │Spoke1│ │Spoke2│ │Spoke3│ ← 工作集群 └──────┘ └──────┘ └──────┘ 中心集群负责管理配置、分发应用、收集状态。工作集群只运行业务负载。这是最常见的多集群管理模式。...

November 20, 2024 · 7 分钟 · 1319 字 · 徐保金