ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rancher多集群管理实战:部署、权限与运维排错全解析

Rancher多集群管理实战:部署、权限与运维排错全解析 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装起来不难但它基本是只读简单操作权限模型也粗糙。要拿它管多个集群几乎没有可能。另一个常见选择是自己搭一套PrometheusGrafana再加一个自研的发布平台这个路线能解决问题但开发和维护成本非常可观更需要专门的小团队持续投入。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 \ --restartunless-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 hostnamerancher.example.com \ --set replicas3 \ --set bootstrapPasswordYourStrongPass \ --set ingress.tls.sourceletsEncrypt \ --set letsEncrypt.emailopsexample.comhostname一定要用规划好的内网域名或公网域名别用IP。安装完成后Rancher生成的ingress、代理配置和后端地址都会绑定这个域名后期修改会带来一系列agent重连问题所以第一步就定死是最省事的。bootstrapPassword是首次访问时引导设置管理员密码的占位口令Helm装完以后可以用它登录系统会要求改成自己的密码。TLS方面如果公司有自己的证书体系推荐用ingress.tls.sourcesecret提前在cattle-system里创建好证书secret。没有也不想申请证书的话可以用Let‘s Encrypt自动签发前提是域名能通过公网校验适合有对外域名的场景。2.4 备份的不只是etcd还有Rancher自己的CRDRancher几乎所有的配置——用户、角色绑定、集群信息、项目结构、应用商店配置——都以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 ServerTCP 443agent上报状态、拉取配置Rancher Server到下游集群API ServerTCP 6443管理面访问下游kube-apiserverRancher Server到下游节点SSH新建集群时TCP 22初始化节点、部署K8s组件下游集群内部的kubeletTCP 10250节点指标采集和Pod生命周期管理控制面etcd节点之间TCP 2379/2380etcd集群通信很多导入后半天显示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 shellRancher 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 \ --certtls.crt --keytls.key \ --dry-runclient -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是否处于Runningkubectl -n cattle-cluster-agent get pods kubectl -n cattle-cluster-agent logs -l appcattle-cluster-agent --tail50日志里如果频繁出现连接失败、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功能和新的行为变化。升级命令依然用Helmhelm 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这类管理平台从来不是装上就能一劳永逸关键还是得把备份、升级、权限这些基础动作变成习惯。我在实际项目中感受最深的是省下的时间越多越要留出时间做演练否则一次事故就能把前面偷的懒全部补回去。希望这篇笔记能帮你在自己的环境里少绕几个弯。
返回列表