ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Rancher 2.7 生产级部署与集群运维实战指南

Rancher 2.7 生产级部署与集群运维实战指南

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。为什么是 4C8G?Rancher 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 EOF

3.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 replicas=3 \ --set ingress.tls.source=secret \ --set resources.requests.cpu=500m \ --set resources.requests.memory=1Gi

replicas=3配合三节点集群,保证 Rancher Server 本身的高可用。资源 requests 给到 500m/1Gi 是保守值,实际运行中 Fleet 同步高峰期会用到更多,但 requests 设太高会导致调度困难,我一般让 limits 留足余量。

3.3 部署后的第一轮验证清单

装完不等于完事,我有一套固定的验证清单,逐项过一遍才算部署成功。这套清单帮我提前发现过好几次隐患。

验证项检查方法合格标准
证书有效期查看 ingress 证书剩余有效期大于 60 天
etcd 健康集群内执行 etcd 健康检查所有成员 healthy
Rancher Pod 状态查看 cattle-system 命名空间3 个副本全部 Running
API 可达性从外部 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 能实现很细的权限控制。我的经验是:项目按“环境+业务域”二维划分,比如“生产-订单”“测试-支付”,而不是简单按环境一刀切。

标签则用来做自动化筛选。比如给集群打上env=prod、region=internal、tier=critical这类标签,后续 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 日志、证书 SAN
Fleet 同步一直 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、网络、证书这些基础组件的熟悉程度。我个人的习惯是每次遇到新问题,解决后都记一笔,时间长了就是自己的故障库,比任何官方文档都贴合自己的环境。这套东西后续还可以往多租户隔离和跨集群灾备方向继续深挖,等有新的实践再整理出来。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进