
1. 为什么我最终选了 Rancher 2.7 来管生产集群做容器平台运维这些年我经手过的集群管理方案不算少从最早手搓二进制脚本到后来用各类发行版工具再到近两年把重心压到 Rancher 上中间踩的坑能写满一个笔记本。Rancher 2.7 这个版本对我而言是个分水岭——它把下游集群的 provisioning 逻辑、Fleet 的 GitOps 能力、以及基于 Helm 的应用管理整合得相对成熟了尤其是对多集群场景下的权限收敛和审计追溯比早期版本省了太多手工活。先说清楚这个内容面向谁。如果你手里管着三五个以上的 K8s 集群或者正准备把一批业务从虚拟机往容器平台迁移又或者你是个刚接手平台运维、需要一套能落地、能复现的部署方案的中级工程师那这篇东西就是写给你的。它不讲 K8s 基础概念也不教你什么是 Pod而是聚焦在“怎么用 Rancher 2.7 把一套生产级集群从零搭起来、并且长期稳住”这件事上。核心关键词就三个Rancher 2.7、生产级部署、集群运维。这三个词贯穿全文后面所有章节都围绕它们展开。我见过太多团队在测试环境用 Rancher 跑得挺欢一上生产就各种问题证书过期、etcd 抖动、下游集群失联、升级把业务搞挂。根子往往不在 Rancher 本身而在于部署阶段的设计取舍没想清楚。所以这篇博文我会把“为什么这么选”讲透而不是甩一堆 YAML 让你抄。抄配置谁都会但生产环境出问题时能快速定位的前提是你知道每个参数背后的意图。2. 部署前的整体设计与关键取舍2.1 架构分层管理集群和业务集群必须分开这是我最想强调的一条。Rancher 的架构里跑 Rancher Server 的那个集群叫管理集群management cluster被它纳管的叫下游集群downstream cluster。很多小团队图省事把 Rancher 直接装在业务集群里结果就是管理面和业务面互相拖累——业务高峰把管理 API 打满或者管理组件升级时业务跟着抖。我的做法是物理隔离管理集群单独一套只跑 Rancher Server、Fleet 控制器、监控栈这些平台组件业务集群按环境或业务域划分通过 Rancher 纳管。管理集群规模不用大三个节点起步但一定要独立。这样即使某个业务集群出问题管理面还能正常操作不至于“指挥中心跟着前线一起塌”。管理集群的节点规格我一般给到 4C8G 起步etcd 单独放 SSD。为什么是 4C8GRancher Server 本身不重但 Fleet 在同步大量 GitRepo 时会有明显的 CPU 和内存波动加上内置的监控和审计日志2C4G 在集群数量超过五个后就会吃紧。这个数字不是拍脑袋是我在几个中等规模环境里实测出来的经验值。2.2 高可用方案内置 etcd 还是外部数据库Rancher 2.7 支持两种高可用模式一种是 Rancher Server 跑在 K8s 上、用内置 etcd 存状态另一种是外部数据库MySQL/PostgreSQL模式。我强烈建议生产环境用内置 etcd 的 RKE2 集群来承载 Rancher Server。理由很直接外部数据库模式虽然理论上更“传统”但它把数据库的高可用、备份、故障切换全甩给你自己管而 Rancher 的状态数据对一致性要求很高数据库层面出一点问题Rancher 的 UI 和 API 就可能出现诡异的不一致。内置 etcd 模式由 RKE2 统一管理 etcd 的生命周期快照、恢复、成员变更都有成熟工具链运维负担反而更小。这里有个细节RKE2 的 etcd 快照默认是开启的但默认保留策略不一定够用。我通常会把快照间隔调到 6 小时、保留数量调到 30 份以上并且把快照目录挂到独立磁盘。原因是一旦需要恢复你希望手里有足够多的历史点可选而不是只有最近一两份。2.3 证书与域名别等过期了才想起来Rancher 的证书问题是我见过最高频的生产事故来源。2.7 版本默认用 cert-manager 管理证书但如果你用自签证书或者内部 CA续期逻辑需要提前验证。我的习惯是部署完第一件事就是确认证书的签发者和过期时间并且把续期监控接进告警。域名规划上管理集群的访问入口我一般用独立子域比如平台内部约定的一个固定域名通过内部负载均衡器暴露。这里不展开具体域名重点是证书的 SAN 必须覆盖你实际访问用的域名否则浏览器和 API 客户端都会报错。我见过有人部署完发现证书只签了默认的 localhost结果外部访问全部失败返工重签。2.4 网络与存储的前置规划生产级部署里网络和存储是最容易被低估的两块。网络层面Rancher 管理集群和下游集群之间的通信走的是 Rancher 的 tunnel需要保证管理集群的 443 端口对下游集群可达。如果你的环境有网络分区提前把这条链路打通别等纳管时才发现连不上。存储层面管理集群需要一块可靠的存储给 etcd 和 Rancher 的持久化数据。我倾向用本地 SSD 做 etcd 盘Rancher 的 PV 则用支持 ReadWriteOnce 的块存储。下游集群的存储按业务需求来但要注意 Rancher 纳管后Fleet 和监控组件也会在下游集群创建 PV提前留好 StorageClass。3. 管理集群的实操部署过程3.1 节点准备与系统调优三台管理节点操作系统我一般选主流的 Linux 发行版内核版本不要太老。部署前每台机器要做的基础调优包括关闭 swap、加载必要的内核模块、调整网络参数。这些在 RKE2 的官方文档里有清单但我想强调两个容易漏的点。第一是时间同步。etcd 对时钟漂移非常敏感节点间时间差超过一定阈值就会导致选举异常。我要求所有节点接同一个内网时间源并且部署后验证chronyc tracking或等价命令的输出确认偏移在毫秒级。第二是文件句柄数和进程数限制。容器密集运行时默认的 limits 很容易被打满表现为各种“too many open files”。我会在系统层面把 nofile 调到 65535 以上并且确认 systemd 的 LimitNOFILE 也同步调整因为 RKE2 是以 systemd 服务方式运行的光改 limits.conf 不够。# 系统调优示例每台管理节点执行 swapoff -a sed -i /swap/s/^/#/ /etc/fstab cat /etc/sysctl.d/99-k8s.conf EOF net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 fs.inotify.max_user_instances 8192 fs.inotify.max_user_watches 524288 EOF sysctl --system cat /etc/security/limits.conf EOF * soft nofile 65535 * hard nofile 65535 EOF3.2 RKE2 集群初始化与 Rancher 安装管理集群我用 RKE2 来搭第一个节点作为 server 初始化后续节点以 server 角色加入形成高可用。初始化时通过配置文件指定关键参数而不是全靠命令行参数这样便于版本管理和复现。# /etc/rancher/rke2/config.yaml首个 server 节点 token: 预共享的集群令牌 tls-san: - 管理集群访问域名 - 负载均衡器地址 etcd-snapshot-schedule-cron: 0 */6 * * * etcd-snapshot-retention: 30 etcd-snapshot-dir: /data/etcd-snapshots write-kubeconfig-mode: 0644这里tls-san是关键必须把你实际访问 Rancher 用的域名和 LB 地址都列进去否则 API Server 证书校验会失败。etcd-snapshot-dir指向独立数据盘避免和系统盘抢 IO。集群起来后用 Helm 安装 Rancher。我习惯把 Rancher 的 Helm chart 版本固定住不用 latest生产环境最忌讳版本漂移。安装时通过 values 指定副本数、资源限制和 ingress 配置。helm repo add rancher-stable 内部约定的 chart 仓库地址 helm repo update helm install rancher rancher-stable/rancher \ --namespace cattle-system \ --create-namespace \ --version 固定版本号 \ --set hostname管理集群访问域名 \ --set replicas3 \ --set ingress.tls.sourcesecret \ --set resources.requests.cpu500m \ --set resources.requests.memory1Gireplicas3配合三节点集群保证 Rancher Server 本身的高可用。资源 requests 给到 500m/1Gi 是保守值实际运行中 Fleet 同步高峰期会用到更多但 requests 设太高会导致调度困难我一般让 limits 留足余量。3.3 部署后的第一轮验证清单装完不等于完事我有一套固定的验证清单逐项过一遍才算部署成功。这套清单帮我提前发现过好几次隐患。验证项检查方法合格标准证书有效期查看 ingress 证书剩余有效期大于 60 天etcd 健康集群内执行 etcd 健康检查所有成员 healthyRancher Pod 状态查看 cattle-system 命名空间3 个副本全部 RunningAPI 可达性从外部 curl 管理域名返回正常响应快照生成检查快照目录有近期快照文件节点时间偏移各节点对比时间源偏移小于 100ms这张表看着简单但每一项背后都对应过真实故障。比如快照生成这一项我遇到过快照目录权限不对导致快照静默失败的情况表面看一切正常真到要恢复时才发现没有可用快照。所以验证不能只看“有没有报错”要看“结果对不对”。4. 下游集群纳管与日常运维要点4.1 下游集群的注册方式选择Rancher 纳管下游集群有几种方式通过 UI 生成注册命令、通过 Terraform 等 IaC 工具自动化、或者用 Rancher 的 provisioning 直接创建。生产环境我倾向用 IaC 工具生成注册命令并纳入版本管理而不是手工点 UI。原因在于可复现性。手工生成的注册命令里带一次性 token过期就失效而且散落在各人手里容易混乱。用 IaC 管理后集群的注册信息、节点角色、标签都能代码化重建环境时一条命令搞定。对于已经存在的集群比如用其他工具搭好的用注册命令纳管即可对于全新集群可以让 Rancher 直接 provisioning但要注意 provisioning 出来的集群其控制面由 Rancher 管理后续升级路径要跟着 Rancher 的节奏走。4.2 集群标签与项目隔离的规划纳管进来只是第一步真正影响长期运维效率的是标签体系和项目划分。Rancher 里的“项目Project”是命名空间的逻辑分组配合 RBAC 能实现很细的权限控制。我的经验是项目按“环境业务域”二维划分比如“生产-订单”“测试-支付”而不是简单按环境一刀切。标签则用来做自动化筛选。比如给集群打上envprod、regioninternal、tiercritical这类标签后续 Fleet 的 GitRepo 可以按标签选择目标集群监控告警也能按标签聚合。标签设计要在纳管初期就定好后期再补会非常痛苦因为已经部署的工作负载和策略都绑定了旧的标签逻辑。4.3 用 Fleet 做 GitOps 的落地姿势Fleet 是 Rancher 2.7 里我评价最高的组件之一。它的核心价值是你把 K8s 清单放在 Git 仓库里Fleet 负责把清单同步到匹配的下游集群并且持续纠偏。这意味着集群的实际状态永远向 Git 里的期望状态收敛。落地时我建议从“小范围试点”开始别一上来就把所有业务都塞进 Fleet。先拿一两个非核心集群把基础组件比如监控 agent、日志采集用 Fleet 管起来跑顺了再逐步扩大。Fleet 的 GitRepo 资源里可以配置targets按集群标签选择目标配合paths指定清单目录结构清晰。apiVersion: fleet.cattle.io/v1alpha1 kind: GitRepo metadata: name: platform-base namespace: fleet-default spec: repo: 内部 Git 仓库地址 branch: main paths: - /clusters/base targets: - clusterSelector: matchLabels: env: prod这里有个实操心得Fleet 同步失败时的报错信息有时候比较隐晦排查时先看 GitRepo 的 status 字段再看对应 Bundle 的状态最后到目标集群里看实际部署的资源。三层逐级往下查比盲目翻日志快得多。4.4 监控、日志与告警的接入生产集群没有监控等于裸奔。Rancher 2.7 内置了基于 Prometheus 的监控能力可以在 UI 里一键启用但我更推荐用 Fleet 把监控栈的配置也代码化这样多集群的监控配置能保持一致。监控接入的重点是告警规则的收敛。默认规则集往往太吵生产环境需要按业务重要性分级。我的做法是基础设施层节点、etcd、控制面的告警直接推到值班渠道业务层告警先聚合到看板按阈值触发。日志方面采集 agent 用 DaemonSet 部署输出到统一的日志后端保留周期按合规要求设定。5. 升级、备份与故障排查实录5.1 版本升级的节奏与回滚预案Rancher 的版本升级我遵循一个原则管理集群先升下游集群后升且两者之间留观察窗口。管理集群升级前务必确认当前版本的已知问题清单以及目标版本的变更说明。升级管理集群用 Helm 的--version指定目标版本升级后观察至少 24 小时确认 UI、API、Fleet 同步都正常再动下游集群。下游集群的升级通过 Rancher UI 或 API 触发RKE2 集群的升级是滚动式的控制面节点逐个更新。这里的关键是提前确认业务的工作负载分布确保升级期间有足够的副本在其他节点上扛住流量。回滚预案必须提前写好etcd 快照的恢复步骤、Rancher 版本的降级路径都要在升级前演练一遍。我见过升级出问题后现场翻文档的那场面相当被动。5.2 备份策略快照只是其中一环很多人以为 etcd 快照就是全部备份这是个误区。生产级备份至少包含三层etcd 快照集群状态、Rancher 的持久化数据PV 层面、以及 Git 仓库里的清单配置层面。前两者保证能恢复到某个时间点后者保证配置本身不丢。etcd 快照的恢复我实测过几次流程是停掉 Rancher 相关组件、用快照恢复 etcd、重启集群、验证 Rancher 状态。恢复后要重点检查下游集群的纳管状态有时候需要重新触发一次集群同步。这个流程建议每季度演练一次别等真出事才第一次操作。5.3 常见故障速查表下面这张表是我这些年遇到的高频问题汇总按现象、可能原因、排查方向组织方便快速定位。现象可能原因排查方向下游集群显示 Unavailabletunnel 链路中断检查管理集群 443 可达性、下游 agent Pod 状态Rancher UI 登录后空白证书或 ingress 配置异常查 ingress 日志、证书 SANFleet 同步一直 PendingGit 仓库凭证失效检查 GitRepo 的 secret 引用etcd 频繁 leader 切换磁盘 IO 或时钟漂移查 etcd 日志、节点时间同步升级后 API 报 503副本未就绪或资源不足查 Rancher Pod 事件、节点资源监控数据缺失Prometheus 存储满或抓取失败查 PVC 使用率、target 状态排查这类问题的通用思路是从外到内、从管理面到数据面先确认管理集群自身健康再看下游集群的 agent 通信最后看具体业务负载。别一上来就钻到业务 Pod 里查很多时候根子在管理面。5.4 几个踩过的坑和独家心得说几个文档里不太会写、但实际很要命的点。第一个是Rancher 的 token 管理。UI 里生成的 API token 有有效期如果用在自动化脚本里到期后脚本会静默失败。我的做法是给自动化场景单独建服务账号token 有效期设长一些并且把 token 过期时间纳入监控。第二个是下游集群的清理。从 Rancher 里删除一个下游集群时如果只是 UI 上点删除下游集群里的 cattle-system 相关资源可能残留重新纳管时会冲突。正确做法是先在下游集群执行清理脚本再从 Rancher 移除。这个顺序反了返工成本很高。第三个是资源配额的前置设置。Rancher 的项目可以设资源配额但配额是软限制超了不会立刻阻止而是体现在调度失败上。所以配额值要结合业务实际用量留足 buffer并且定期 review别设完就不管。6. 写在最后的一点个人体会这套方案我在几个中等规模的生产环境里跑了一年多整体稳定性是达标的但也谈不上完美。Rancher 2.7 的组件比较多学习曲线不算平缓尤其是 Fleet 和 provisioning 的交互逻辑第一次接触容易绕晕。我的建议是先在测试环境把整条链路走通包括纳管、GitOps 同步、升级、快照恢复每个环节都亲手操作一遍再上生产。另外工具再强也替代不了对底层原理的理解。Rancher 帮你屏蔽了很多 K8s 的复杂度但出问题时能不能快速定位还是取决于你对 etcd、网络、证书这些基础组件的熟悉程度。我个人的习惯是每次遇到新问题解决后都记一笔时间长了就是自己的故障库比任何官方文档都贴合自己的环境。这套东西后续还可以往多租户隔离和跨集群灾备方向继续深挖等有新的实践再整理出来。