1. Rancher到底解决了什么问题:多套K8s的混乱是真实痛点
先说个很多人都有过的场景:公司里两三个核心集群,再加上测试、预发,一共五六套Kubernetes环境。每套环境一个kubeconfig文件,为了区分还得改一个很长的context名字。平时还好,一旦当天有发布任务或者要紧急排查线上问题,光切集群上下文就能把人绕晕。更别提权限了,一套集群一个admin账号,新人入职挨个配,离职了还得挨套删,漏掉一个就是安全隐患。
我最初接触Rancher管理平台,就是被这种多集群琐事折磨到不行之后才认真去评估的。当时最直接的需求有三个:能不能一个页面看所有集群的状态,能不能把账号和权限统一收口,能不能让开发同学用浏览器完成大部分日常操作。Rancher 2.x在这三件事上都做得挺到位,所以后来从2.6一直维护到新版本,也算积累了不少可复现的经验。这篇笔记就以我自己运维的真实视角来写,内容包括高可用部署、集群接入、权限模型、日常运维和典型排错,适合正在选型K8s管理平台,或者已经装了Rancher但还没把最佳姿势摸清的团队。
1.1 没有统一管理面时,K8s运维有多折腾
原生Kubernetes所有的操作入口就是API Server,日常接触最多的是kubectl。工具本身并不难,难的是多集群场景下的心智负担:每个集群的证书不同、token不同、context不同,任何操作之前都得确认一遍自己当前在哪个环境。
这不是简单换个工具能解决的问题。监控数据分散在各个Prometheus里,日志要分别登录不同集群查看,审计就更别提了,原生K8s默认的audit log很多人根本没开。权限管理也很原始:要么交付一个admin kubeconfig,要么去维护一堆ServiceAccount和RBAC role绑定。我见过不少团队最后流落到用Excel表格记录"哪个账号能访问哪个集群",这比不改还要危险。
更深层的问题是,开发和运维之间的协作成本太高。开发同学对kubectl不熟,每次想看个Pod日志还得让运维帮忙执行命令。运维自己也累,因为同样的操作要在多个集群重复执行。Rancher这类管理平台的价值并不在于它把kubectl"图形化"了,而是它真正把多集群的认证、授权、监控、日志、发布这些能力收拢到一个入口里。
1.2 Rancher的管理架构:总控制台和底层集群是分开的
很多人第一次接触Rancher会误以为它是个类似K8s发行版的容器编排引擎,其实不是。Rancher 2.x是控制面产品,它本身跑在一套Kubernetes集群上,管理和监控的资源却落在下游集群里。
这种架构的拆分非常关键。Rancher Server所在的集群一般叫local集群,它负责承载Rancher自身的组件,比如UI、API、权限控制逻辑、一些controller。而业务容器全部运行在导入或创建的下游集群中,下游集群独立运行,并不依赖Rancher Server的连续性。换句话说,就算Rancher Server停机了,你的业务集群大概率还能正常跑,只是少了一个统一管理的入口。
核心组件上,Rancher Server内部主要是一堆CRD controller,配置都存储在local集群的etcd中。下游集群则会有cattle-cluster-agent和cattle-node-agent这两个代理组件,分别负责集群级和节点级的通信。理解这个链路很重要,后面所有接入集群、排错的内容都围绕这个架构展开。
1.3 为什么不用原生Dashboard或者其他平台
K8s官方有个Dashboard,装起来不难,但它基本是"只读+简单操作",权限模型也粗糙。要拿它管多个集群,几乎没有可能。另一个常见选择是自己搭一套Prometheus+Grafana,再加一个自研的发布平台,这个路线能解决问题,但开发和维护成本非常可观,更需要专门的小团队持续投入。
Rancher的优势在于它把企业级多租户模型做得相对完整:全局、集群、项目、命名空间四级结构,加上对LDAP/AD和SAML的支持,基本能覆盖大多数企业内部IT的账号体系。对比OpenShift这种重平台,Rancher的部署又轻很多,不需要强制装一堆配套组件,升级路径也更简单。因此它在K8s管理平台里的生态位一直很稳。
当然Rancher也不是没有缺点,它对下层集群的版本兼容范围、云厂商托管集群的支持细节、以及每次大版本升级带来的API变化,都需要提前评估。但总的来说,对于K8s集群数量大于等于两套的团队,早期引入Rancher统一管理,投入产出比是非常高的。
2. 部署规划:Rancher Server本身不能跑在单机上
2.1 测试环境的一键启动要分清用途
刚接触Rancher时,官方文档给的快速开始命令很简单,一条docker run就能把Server跑起来,比如这样:
docker run -d --name rancher \ --restart=unless-stopped \ -p 80:80 -p 443:443 \ --privileged \ rancher/rancher:v2.8.5启动之后,浏览器访问服务器的443端口,就能看到初始化页面,拿到默认密码后设置管理员账号。这个模式只适合在测试环境体验功能,或者在培训时快速搭一个沙盒,绝对不建议拿它当生产环境的管理端。原因也很直白:单容器没有高可用,Rancher自身的配置全部存在容器的etcd里,一旦容器异常或者宿主机出问题,整个管理面就没了。而且后续如果要升级版本,单容器的迁移路径设计得并不好,有可能卡在某个版本上。
2.2 高可用部署的节点与网络准备
生产环境我建议直接把Rancher Server高可用装起来,也就是选择一套专门用于承载Rancher的Kubernetes集群。这个集群可以是独立的RKE2集群,也可以是已有的稳定集群,但原则上要和承载业务的工作集群分开。因为Rancher管理面本身会生成大量的CRD和Controller,如果和核心业务混跑,很容易互相争抢资源,出了问题还分不清是谁的锅。
以我这边的一个典型部署为例,整个控制面集群是3个节点,角色分配为1个etcd节点、1个controlplane节点、1个worker节点,再加2个worker节点给Rancher各组件和监控使用。更严谨一点的方案是etcd和controlplane都分别铺满3个,但这套环境规模不算大,所以用了RKE2默认的最小高可用方式。网络层面重点就两条:第一,Rancher Server的域名访问入口要稳定,建议前端放一个独立负载均衡;第二,集群节点、下游集群agent需要访问的端口都要提前列好清单,且对云安全组和内部防火墙都放通。
2.3 Helm安装Rancher的配置要点
用Helm来部署Rancher是生产环境最推荐的方式。先把Chart仓库加进来:
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update kubectl create namespace cattle-system然后执行安装。我的习惯是把关键参数写清楚,尤其hostname、replicas、bootstrapPassword和TLS方式:
helm install rancher rancher-latest/rancher \ --namespace cattle-system \ --set hostname=rancher.example.com \ --set replicas=3 \ --set bootstrapPassword=YourStrongPass \ --set ingress.tls.source=letsEncrypt \ --set letsEncrypt.email=ops@example.comhostname一定要用规划好的内网域名或公网域名,别用IP。安装完成后,Rancher生成的ingress、代理配置和后端地址都会绑定这个域名,后期修改会带来一系列agent重连问题,所以第一步就定死是最省事的。bootstrapPassword是首次访问时引导设置管理员密码的占位口令,Helm装完以后可以用它登录,系统会要求改成自己的密码。
TLS方面,如果公司有自己的证书体系,推荐用ingress.tls.source=secret,提前在cattle-system里创建好证书secret。没有也不想申请证书的话,可以用Let‘s Encrypt自动签发,前提是域名能通过公网校验,适合有对外域名的场景。
2.4 备份的不只是etcd,还有Rancher自己的CRD
Rancher几乎所有的配置——用户、角色绑定、集群信息、项目结构、应用商店配置——都以CRD形式存在于local集群的etcd中。很多人以为备份了etcd就万事大吉,但实际中etcd快照只是底下一层,恢复起来也比较重。
我一般会做两层备份。第一层是local集群自身etcd的定期快照,用RKE2自带的快照机制即可,快照文件存放在/var/lib/rancher/rke2/server/db/snapshots目录。第二层是用Rancher官方提供的backup-restore-operator,把Rancher的CRD资源备份到S3兼容的对象存储里。后者恢复起来比纯etcd快照简单,而且可以直接在UI或CRD层操作。
备份策略上建议每天全量、保留最近7份,另外在大版本升级之前手动触发一次备份。这个动作不复杂,但能救命的场景远比你想象的多,后面讲升级的时候我会再展开。
3. 接入集群:导入已有K8s和用RKE2新建集群两条路
3.1 导入已有集群的完整链路
如果你手头已经有一套跑得不错的Kubernetes集群,不想动它,那么Rancher的集群导入功能就是首选。在UI上进入"添加集群",选择导入已有集群,Rancher会生成一条可以执行的命令,大概长这样:
curl --insecure -sfL https://rancher.example.com/v3/import/XXXXX/YYYYY.yaml | kubectl apply -f -在目标集群的控制节点上执行这条命令,Rancher就会通过一个yaml把cattle-cluster-agent和cattle-node-agent等组件部署进去。这些agent会主动向Rancher Server发起连接,把集群的状态同步回来。等UI上集群状态从Provisioning变成Active,导入就算完成了。
这个流程理解起来不复杂,但有一些隐藏细节容易忽略。首先,生成的yaml里带了一个clusterID和token,本质上就是个身份凭证,别随手发到群里。其次,集群导入后,Rancher Server必须能访问到下游集群的API Server地址,默认端口是6443,安全组和防火墙要放通。第三,如果下游集群之前装过别的管理组件,注意别冲突,尤其是涉及Webhook、网络策略的部分。
3.2 用RKE2新建集群的规划要点
除了导入,Rancher也能直接从UI上创建一套新的RKE2或K3s集群。这个方式适合全新的项目,可以把节点初始化、集群配置、默认存储类、网络方案一并做掉。在UI里创建集群时,Rancher会要求选择节点模板、填写节点池信息、指定ControlPlane和Worker角色。
我实践下来的经验是:新建集群前先把网络方案和镜像仓库想清楚。RKE2默认用Canal作为CNI,如果你的底层网络对VXLAN或策略控制有特定要求,就在集群配置里改一下。镜像拉取方面,如果生产环境无法直接访问外网镜像仓库,要提前给RKE2配置私有仓库,不然后面装组件时会卡很久。节点初始化之后,建议先确认node-agent正常启动,再看Pod调度情况,不要急着把业务压上去。
3.3 端口和连通性的底层逻辑
接入集群过程中最常见的排障方向其实不是命令写错,而是网络不通。我把典型端口整理成表,方便对应检查:
| 通信方向 | 协议与端口 | 用途 |
|---|---|---|
| 下游集群Agent到Rancher Server | TCP 443 | agent上报状态、拉取配置 |
| Rancher Server到下游集群API Server | TCP 6443 | 管理面访问下游kube-apiserver |
| Rancher Server到下游节点SSH(新建集群时) | TCP 22 | 初始化节点、部署K8s组件 |
| 下游集群内部的kubelet | TCP 10250 | 节点指标采集和Pod生命周期管理 |
| 控制面etcd节点之间 | TCP 2379/2380 | etcd集群通信 |
很多导入后半天显示Pending的案例,最后查下来都是443端口出站被防火墙拦了,或者Rancher Server访问不到下游6443。网络排查要按照这张表逐条验证,用telnet或nc去测试端口可达性,基本能定位出问题所在。
4. 权限模型:项目、命名空间与用户组的组合玩法
4.1 全局、集群、项目、命名空间的四级关系
Rancher的权限体系是我觉得它最值钱的部分,也是初用者最容易被绕晕的部分。逻辑上可以理解成四级嵌套:全局是所有集群之上的一个管理层,负责管理员账号、全局用户组、全局策略;全局下面是多个集群;每个集群内部可以划分项目;项目再包含具体的命名空间。
很多人分不清项目和命名空间。简单来说,命名空间是Kubernetes原生概念,项目是Rancher自己做的逻辑组合。一个项目里可以有多个命名空间,项目成员可以访问项目内的所有命名空间和资源。这样做的意义在于:一个开发团队负责的往往不只是单个命名空间,而是一组相关的命名空间,比如一个应用的前端、后端、中间件各占一个ns,把它们统一放进一个项目,整组人的授权就可以一次性完成,不用逐个ns去绑权限。
权限继承上,Rancher支持在任意层级绑定用户或用户组,低层级的角色叠加生效。举例来说,一个用户在全局是"普通用户",在某个集群被授予"集群成员",在该集群的某项目里又被授予"项目所有者",那么这个人最终的能力范围就是这几个角色的并集。
4.2 对接LDAP与自定义权限模板
企业内部账号体系一般都在AD/LDAP里,Rancher支持直接对接,在认证页面填好LDAP服务器地址、Base DN和组过滤规则即可。配好之后,团队用户可以用自己的域账号登录,权限分配可以按用户组批量绑定,而不是一个个给人员授权。
这里有一条我踩过坑才明白的规则:永远不要关掉本地管理员入口。对接LDAP后,如果LDAP服务器临时宕机,或者配错了Base DN导致所有用户无法登录,你还能用local admin进来修复。一旦把本地认证彻底禁用,又没有保留可用账号,那只能去local集群里手工改CRD,体验相当痛苦。我现在的习惯是保留一个专门的本地管理员账号,仅用于应急恢复,日常登录统一走LDAP。
自定义角色模板也值得用起来。比如研发团队需要一个只能查看Pod日志、重启Deployment、不能删除命名空间的角色,Rancher默认角色里没有现成的,我是复制"项目成员"角色,去掉一些API权限后重新生成的。这类模板配置一次之后,后续新团队加入整个授权流程就很快。
4.3 资源配额与多租户隔离
多团队共享同一个集群时,资源配额必须做,否则团队之间互相挤兑是早晚的事。Rancher在项目层面提供了ResourceQuota配置,可以给项目限定Pod总数、CPU使用上限、内存使用上限等。
我在实际项目中通常按环境和团队来规划项目:一个"平台组-生产"项目、一个"平台组-预发"项目、一个"数据组-开发"项目。每个项目设置合理的配额,比如生产项目限制CPU总核心数,Pod总数限制在几百以内。这个配额不仅对UI上创建的workload生效,对直接用kubectl创建的Pod也生效,因为Rancher会在项目对应命名空间里写入真正的ResourceQuota资源。团队申请资源时,运维只需要调整项目配额,不用深入到每个命名空间去改。
5. 日常运维:我每周会碰的界面和命令
5.1 工作负载与服务发布
Rancher的"工作负载"页面覆盖了Deployment、StatefulSet、DaemonSet三类常见资源。平时开发团队要发布新版本,我不再让他们去工单里要kubeconfig,而是直接授权他们访问所属项目的工作负载页面。表单布局和K8s概念是一一对应的:副本数、镜像地址、环境变量、挂载卷、健康检查探针、调度规则,填完点部署即可。对于习惯写YAML的工程师,界面右上角也有对标的编辑YAML入口,两种模式可以切换。
这个页面最好用的地方是变更历史和回滚。每次更新都会记录版本号,一旦发布号有问题,直接在下拉框里选择上一个版本执行回滚,比命令行操作要直观得多。新增Service和Ingress也在这套界面里完成,域名、路径、证书都能配置,不需要切到原生kubectl。
5.2 应用商店与自定义Chart仓库
应用商店是Rancher把Helm引入管理界面的落地方式。系统自带一套官方Chart列表,像Nginx Ingress、Prometheus、Grafana等常见中间件都能从这里一键安装到指定项目里。实际使用中更实用的功能是添加自定义Helm仓库,很多公司内部有自己的发布Chart仓库,在UI上配置好仓库地址后,所有Chart和版本都会同步显示,开发同学装中间件时不用再敲helm命令。
应用商店安装的Chart本质上就是标准的Helm Release,所以如果后续需要命令行管理,它们同样可以用helm命令看到,只是要注意不要从两个入口同时操作同一个Release,避免配置漂移。我遇到过UI上改了副本数,又被某个自动化脚本用旧Values覆盖的情况,建议明确一下管理入口,团队内部只走一条路径。
5.3 用起来最舒服的kubectl shell
Rancher UI里自带一个kubectl shell,相当于在浏览器里打开一个终端,默认执行环境是一个临时Pod,里面内置了kubectl,并自动使用当前用户在页面所对应集群的凭证。这个功能最大的价值是省事:不需要在本地配置任何kubeconfig,也不需要在跳板机上维护token,只要有页面权限,就可以执行命令。
但要注意,这个shell的能力边界取决于当前用户被赋予的角色。如果用户在某个集群里只有"项目成员"权限,那shell里默认只该看到对应命名空间的资源,不会被直接放开成admin。所以给用户开放shell之前,我习惯先自测一遍角色效果,防止配置的角色模板权限过宽。从审计角度,Rancher会把shell里执行的操作记录到API事件中,日常排障时能通过操作记录定位是谁动了哪个资源。
5.4 监控告警与日志的快捷入口
新环境装完Rancher后,我第一件事就是开监控组件。Rancher内置的监控基于Prometheus和Grafana,启用后集群基础指标、节点资源、工作负载的Pod状态会全部进入监控链路,默认的Dashboard基本够用。告警规则也可以直接在UI里设置,比如节点内存使用率超过90%、Pod持续重启、PVC容量超过80%,这些规则一目了然,比手动去写PrometheusRule要省心。
日志方面,Rancher的Logging项目可以对接Elasticsearch、Splunk、Kafka等后端。统一日志入口给排查分布式问题提供了很大便利。我给团队的建议是:至少把kube-system、cattle-system和核心业务命名空间的日志都接进去,这样查问题时不至于一台台机器翻文件。
6. 踩坑记录:证书、Agent失联、etcd恢复
6.1 证书过期的问题与旋转流程
Rancher环境中最容易拖垮日常使用的就是证书问题。尤其是生产环境采用自签证书时,证书过期会导致UI无法打开、Agent连接异常、甚至API调用全部失败,但底层集群和业务往往还在正常跑,这种"管理面挂了,业务还活着"的状态特别迷惑人。
处理思路是先确认证书类型。如果用的是Let‘s Encrypt或自带证书,检查入口是Rancher Server的ingress证书和内部组件证书。更新证书只需替换secret后触发滚动:
kubectl -n cattle-system create secret tls tls-rancher-ingress \ --cert=tls.crt --key=tls.key \ --dry-run=client -o yaml | kubectl apply -f - kubectl -n cattle-system rollout restart deploy/rancher重启后注意观察Pod状态,同时去集群页面确认agent是否重新注册。如果用的是Rancher自签CA,则需要在UI里找到证书轮转的功能来操作。我建议给证书配置到期告警,提前30天就提醒自己,不要等到页面上冒出红色报错才去处理。
6.2 cattle-cluster-agent失联的排查链路
下游集群状态从Active变成Disconnected,是运维群里的高频求救信号。先看cattle-cluster-agent是否处于Running:
kubectl -n cattle-cluster-agent get pods kubectl -n cattle-cluster-agent logs -l app=cattle-cluster-agent --tail=50日志里如果频繁出现连接失败、TLS握手错误,基本可以锁定为网络或证书问题。先去验证下游集群到Rancher Server的443端口是否通,再检查agent的secret是否过期或被误删。另一种常见情况是Rancher Server升级后,旧版本agent无法与新Server通信,此时在UI集群页面通常会显示"有新版本agent可用",点击升级即可。
排查链条我一般按这个顺序走:网络连通性 → Agent Pod状态 → Agent日志 → 集群凭证 → Server侧Controller日志。曾经有一次查了好几个小时,最后发现是下游集群node节点的系统时间与Rancher Server差了十几秒,导致TLS证书校验失败。这类问题提示我,遇到证书相关报错时,系统时间同步一定要作为基础检查项。
6.3 etcd快照备份与一次恢复演练
没有做过备份恢复演练的K8s环境,我不太敢称它是生产就绪。etcd快照是K8s集群的最后一个保命手段,Rancher Server所在集群和每个下游集群的etcd都要覆盖到。
以RKE2为例,创建快照的命令很简单:
rke2 etcd-snapshot save --name manual-$(date +%F-%H%M)快照会存在/var/lib/rancher/rke2/server/db/snapshots目录里。恢复场景通常是etcd数据损坏、误删关键资源且无法回滚,恢复前要停机维护,执行:
systemctl stop rke2-server rke2 etcd-snapshot restore snapshot-name systemctl start rke2-server我专门找了一个低峰时段做过完整演练,记录下整个流程大约需要20分钟左右。演练过程中发现,恢复后的集群各节点状态需要逐一检查,尤其是etcd成员列表和Pod调度情况。等到一切都恢复成正常之后,再从Rancher角度重新验证集群管理状态。经验就是:备份要经常确认是否在真正产生文件,不要相信“配了自动备份就等于备份完成”。
7. 升级与迁移:从老版本滚到新版本的一些体会
7.1 版本升级的通用流程
Rancher大版本升级要谨慎对待,我遵守的原则是绝不跨大版本跳级,比如2.6升2.8,中间必须经过2.7的路径。原因是大版本之间会引入API版本变更和CRD结构调整,直接跳级可能导致旧数据无法兼容。
操作上,先做备份,然后查阅官方release notes,重点看Deprecated功能和新的行为变化。升级命令依然用Helm:
helm repo update helm upgrade rancher rancher-latest/rancher \ --namespace cattle-system \ --version 2.8.5 \ --values values.yaml执行后观察Rancher Pod是否全部就绪,再逐个去各下游集群升级agent。小版本迭代相对安全,但也不能完全省略备份。我在一次小版本升级中遇到过监控组件版本落后,导致Grafana Dashboard显示空白,最后把monitoring组件一起升级才解决。所以升级完成后,建议把监控、日志、应用商店这些周边功能都抽查一遍。
7.2 整体迁移到新环境
有些场景下需要把Rancher从旧基础设施整体搬到新机房的K8s集群。如果备份做得到位,迁移过程其实不复杂。核心思路是:在旧环境用backup-restore-operator把CRD备份到S3,然后在新环境安装全新Rancher,再把备份恢复进去。
恢复完成之后,所有下游集群的导入关系应该会重新出现,但Agent的连通性可能因为Server地址变化而中断。迁移前如果改了域名或IP,下游集群里的agent配置依然指向旧地址,这时候需要在每个集群里重新执行导入命令,或者通过UI里的"编辑集群",更新Server URL后让agent重新注册。
从实际经验讲,迁移最大的风险不在技术操作,而在关联系统:如果Rancher和外部LDAP、OIDC、GitLab等系统做了集成,新环境的网络策略、TLS证书、回调地址都要同步迁移。把这些依赖梳理清楚,再动手切流量,整个迁移就会可控很多。
7.3 从实际环境里换来的几条经验
第一,server-url从一开始就要定准,它一旦确定,后续所有Agent注册、证书签发、回调地址都会用到。后续改动的成本通常比预想的高很多,能不碰就不碰。
第二,权限配置要跟着组织架构走,尽量用用户组批量授权,而不是逐人授予。团队人员流动很大的时候,逐人授权的维护成本会越来越高,用户组模型能把这些琐碎工作一次简化。
第三,Rancher的UI虽然好用,但高级排障和底层诊断还得会K8s原生命令。遇到问题先从底层集群看Pod、看Event、看日志,不要只盯着Rancher页面上的状态。数据最终都在K8s里,管理平台只是替你翻译成了更友好的人话。
最后说句实在话。Rancher这类管理平台从来不是装上就能一劳永逸,关键还是得把备份、升级、权限这些基础动作变成习惯。我在实际项目中感受最深的是:省下的时间越多,越要留出时间做演练,否则一次事故就能把前面偷的懒全部补回去。希望这篇笔记能帮你在自己的环境里少绕几个弯。