1. 先想清楚:单机版Rancher2到底适合什么场景
不少团队提起Rancher2,第一反应就是“这玩意儿得上高可用吧,生产环境最少三节点起步”。这个想法在大型团队里确实没毛病,但放到开发环境或者初创公司身上,很多时候是被自己吓住了。
Rancher2单机版是什么?一句话解释:把Rancher管理端当成一个普通容器跑在一台服务器上,用它统一管理你手头已有的Kubernetes集群,或者在它上面直接创建集群。它面向的不是“大规模生产集群的管理中枢”,而是“一个人也能轻松盯着十几个业务服务”的轻量级控制面。
我见过很多初创团队的实际状态:两三个后端、一个前端,加上一个兼着运维的负责人,集群可能只有三台机器,甚至先跑在开发者本机或者一台云服务器上。这个时候上HA(高可用)架构,光是三套数据库同步、VIP、多副本证书管理就能占据大量精力,真正业务代码的进展反而被拖慢。更核心的问题是,初创期业务形态一天一变,部署工具本身应该是“可替换的配件”,而不是一个需要专职运维伺候的复杂系统。
所以这篇手顺的核心结论先放在前面:如果你的集群规模在50个节点以内、业务服务数量不超过几十个、团队没有专职SRE,单机版Rancher2是性价比极高的选择。它提供完整的多集群管理、RBAC权限、应用商店、日志监控集成能力,只是控制面自身不做多副本冗余。而单机版部署,整个流程熟练之后半小时内就能从裸机跑到页面可登录。
这和我多年来见到的真实情况一致:很多初创公司用单机版Rancher撑了两年,直到集群规模真正上来了才迁移到HA。那个迁移过程因为有Rancher的备份恢复机制,实际上也比较顺滑。后面会专门讲备份,这里先不展开。
2. 部署前的版本选型和环境准备
2.1 三个关键决定:K3s、RKE还是RKE2
聊Rancher2单机版之前,必须先澄清一个绕不开的问题:Rancher管理端本身需要跑在一个Kubernetes集群上,那么用来跑Rancher管理端的底层集群选什么?
Rancher2支持在自己的管理集群中使用三种方案:Docker单容器模式(直接docker run启动Rancher)、K3s集群模式、RKE/RKE2集群模式。单机版部署里绝大多数人走的是前两条路。
先说Docker单容器模式:Rancher官方目前仍然保留了docker run rancher的启动方式,适合最快速的验证环境。这种模式下Rancher管理端数据写在容器内部的etcd里,备份恢复靠docker exec命令配合rancher-backup插件实现。好处是简单到极致,坏处是Rancher升级时容器迁移稍微麻烦一点,而且本地数据文件一旦损坏,管理配置恢复成本较高。
再说K3s模式:K3s本身就是专为边缘和轻量场景设计的Kubernetes发行版,对资源要求很低,自带etcd或SQLite存储。用K3s跑Rancher管理端,相比Docker单容器模式最大的优势是:Rancher自身的运行状态可以用一套标准的Kubernetes工作负载管理,升级、回滚、健康检查都变成常规操作,不再依赖Docker命令手工处理。这也是我个人最推荐的单机版Rancher方式。
RKE2暂时先不选。RKE2的服务端组件默认需要更多系统依赖,比如Containerd配置、CNI组件,对新手没那么友好,在单机部署场景下没有明显收益。
所以这段的核心推荐是:单机Rancher2 + K3s承载Rancher管理端,业务集群可以后续在Rancher里创建独立的自定义集群,也可以直接管理已有的K3s/RKE集群。
2.2 节点配置和操作系统选型
Rancher2管理端本身的资源占用并没有想象中那么高。根据官方文档的建议和实测经验:管理端节点建议至少2核CPU、4GB内存,磁盘30GB以上。这个建议要稍微打折看,因为除了Rancher自身,K3s还要运行一系列系统组件。我实际部署过的开发环境里,1核2GB的机器跑起来非常勉强,卡顿明显;2核4GB就比较舒适;4核8GB属于完全够用的状态。
磁盘这块容易被忽略。K3s默认的容器镜像存储目录是/var/lib/rancher,随着镜像增多,10GB的云盘很快吃紧。建议把系统盘直接给到50GB以上,或者提前把Docker/K3s的数据目录挂到独立数据盘上。
操作系统方面,Ubuntu 20.04/22.04 LTS和CentOS 7.9我都在生产环境里跑过,选型原则很简单:用你团队最熟悉的发行版。Rancher2对这些系统的支持差异不大。但有一个重点需要注意:所有节点保证内核版本不要太老,K3s默认使用的iptables模式和部分CSI驱动对内核版本有要求,宿主机内核太旧会导致网络插件工作异常。我踩过一次Ubuntu 16.04内核版本过低导致flannel网络不通的坑,后来统一换到20.04就没再遇到。
2.3 安装Docker和基础系统参数
如果选择K3s托管Rancher的方式,其实Docker不是必须的,K3s自带Containerd。但很多初创团队的运维习惯还是依赖Docker命令排查问题,而且某些业务容器还需要通过Docker运行。所以我仍然会先把Docker装好,统一一致的环境。
安装Docker的步骤比较复杂,如果是在主流发行版上,直接使用官方安装脚本最省事,这就是开发环境的标准做法。装完Docker之后,需要设置镜像加速,否则拉取镜像速度会让人崩溃,特别是管理端还要拉取Rancher自身和K3s系统组件的镜像。镜像加速的配置在/etc/docker/daemon.json里:
{ "registry-mirrors": ["https://docker.m.daocloud.io"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }这里有两个容易被忽略的参数:exec-opts指定了Docker使用systemd作为cgroup驱动,这个必须和K3s保持一致,否则Kubernetes调度容器时会出现cgroup驱动不匹配的报错,具体报错是类似failed to start container "xxx": cgroup的问题。log-driver限制容器日志大小非常重要,初创团队经常忘记设置,结果日志文件把磁盘塞满,整个节点挂掉。
配置完成后重启Docker:
systemctl daemon-reload systemctl restart docker顺手把基础系统参数设置好:
# 关闭swap swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 加载必要模块 modprobe br_netfilter cat > /etc/modules-load.d/k8s.conf << EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF systemctl restart systemd-modules-load这三步操作分别解决三件事:关闭swap避免Kubernetes节点因为内存交换出现性能抖动;加载内核模块支持iptables网络转发;持久化模块加载让重启后依然生效。这些步骤做完,环境准备才算到位。
3. 从裸机到Rancher2页面可登录的完整实操
3.1 安装K3s承载Rancher管理端
环境准备好之后,最先安装的是K3s。安装命令非常简单:
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC="--write-kubeconfig-mode=644 --disable=traefik" sh -这里重点解释两个参数:
K3S_KUBECONFIG_MODE="644"是让/etc/rancher/k3s/k3s.yaml配置文件能被普通用户读取。否则我们后续用kubectl操作管理集群时总要先加sudo,在脚本化操作时特别别扭。
--disable=traefik则是关闭K3s自带的Traefik Ingress Controller。为什么要禁用它?因为Rancher2管理端需要一个Ingress来暴露自身服务,而Rancher官方的Helm Chart默认自带Ingress定义。K3s自带的Traefik和Rancher官方Chart的Traefik配置可能在版本上产生冲突,干脆禁用内置的,让Rancher自己带一个更干净。
安装完成后检查状态:
systemctl status k3s kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get nodes看到Ready状态就说明K3s单节点集群已经跑起来了。此时可以先验证一下集群内的Pod运行状态:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods -A正常情况下所有的系统组件Pod都在Running,可能有个别Pending几秒钟,等镜像拉完就好。
3.2 通过Helm Chart部署Rancher2
Rancher2本身有不同的部署方式,但我强烈推荐用Helm Chart。原因在后面会讲得比较细,这里先看实操。
先安装Helm(如果环境里没有):
curl https://baltocdn.com/helm/signing.asc | apt-key add - apt-get install apt-transport-https --yes echo "deb https://baltocdn.com/helm/stable/debian/ all main" | tee /etc/apt/sources.list.d/helm-stable-debian.list apt-get update apt-get install helm不过不同发行版的安装方式有差异,最简单的办法其实是直接下载Helm二进制包,放到/usr/local/bin/helm就完事。
接下来添加Rancher官方Helm仓库并部署:
helm repo add rancher-latest https://releases.rancher.com/server-chart/latest helm repo update kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml create namespace cattle-system helm install rancher rancher-latest/rancher \ --namespace cattle-system \ --set hostname=rancher.example.internal \ --set bootstrapPassword=admin \ --set replicas=1 \ --set ingress.tls.source=letsEncrypt这段命令里几个参数值得展开说明:
hostname是Rancher管理界面的访问域名。这个域名必须提前做好DNS解析指向这台服务器,并且在事后颁发证书时保证该域名能从公网或内网正常访问到服务器。我自己遇到的最多的问题是:域名还没有解析好就急着部署,证书签发失败了N次,最后排查了一圈才发现是DNS记录根本没生效。
bootstrapPassword是首次登录的初始密码,登录之后强烈建议立刻修改。
replicas=1表示Rancher管理端只运行一个副本。单机版么,副本多了也没意义,除非你加了一个管理端的HA集群。
ingress.tls.source=letsEncrypt是让Rancher自动集成Let's Encrypt证书签发。这个选项对开发环境非常友好,省去手动管理证书的麻烦,三个月自动续期。但如果你的环境是完全内网隔离、没有公网出网能力,那就要换成ingress.tls.source=secret,自己把自签证书的Secret提前准备好。
3.3 等待Rancher完成初始化和证书签发
部署命令执行之后,不会立刻就能打开页面。Rancher需要拉取一堆镜像、生成证书、启动各个子组件。此时用watch命令观察:
watch -n 5 kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods -n cattle-system正常情况下若干分钟后,cattle-system命名空间里的rancher-xxx-xxxxPod会变成Running,Ready显示1/1。
需要留意的常见坑:如果Pod一直处于CrashLoopBackOff状态,大概率是证书签发环节出了问题。查看日志:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml logs -f -n cattle-system <pod名>常见报错包括Failed to get ACME certificate、TLS handshake timeout。这类问题的排查顺序是:先确认域名能解析到这台机器,再确认服务器的80和443端口能从公网访问,最后看cert-manager组件的日志确认签发失败的具体原因。
等到Pod稳定Running之后,用浏览器打开设置的域名,首次访问会看到一个红色警告页面,提示证书未受信任。这是因为Rancher默认生成的临时自签证书还没有被替换掉。点继续访问会进入初始化页面,要求设置管理员密码。
这里有一个特别重要的操作细节:初始密码提前用bootstrapPassword设置好了,但首次登录时系统会提示修改密码,这个修改动作实际上是让你以bootstrapPassword作为登录凭证登录一次,再设置新密码。有些同学在这里卡住,觉得怎么输入都不对,其实是没走这个流程。
登录成功之后,Rancher2的界面就出来了。到这里,单机版Rancher2管理端的部署只完成了一半,后面的配置才是真正影响使用体验的部分。
4. 首次登录后必须完成的七个配置
4.1 修改admin密码并创建日常管理员账号
登录后第一件事,把admin密码改掉,然后创建一个专门的日常账号。不建议平时直接用admin操作,因为Rancher的审计日志里所有操作会记录操作用户,如果大家都共用admin,出了问题根本查不到是谁干的。
创建账号的入口在界面右上角头像 -> 用户。
给日常账号分配全局权限时注意区分:如果只是管理某个业务集群的开发人员,只需要给集群成员权限,不需要给全局管理员。全局管理员可以创建集群、修改全局设置,权限范围太大。
这里我建议的最小权限方案是:运维负责人作为全局管理员,其他开发人员各自独立账号,按集群划分权限。全局管理员最多不超过两个人。
4.2 配置Rancher的权限认证方式
初创团队一般不会单独搭一套LDAP或SAML,直接用本地账号就够了。但如果团队人数超过二三十个,建议提前接上企业微信、钉钉或GitHub身份认证。Rancher2支持多种认证方式,接入之后可以通过OAuth让员工用公司账号直接登录,避免给每个人单独建账号和记密码的麻烦。
我见过有团队从第一天就开始接LDAP,结果因为配置参数理解不准确,折腾了两天还没成功,最后退回本地账号。我的建议是:初期本地账号完全够用,等到团队规模明确超过十个人再考虑认证对接,没必要一开始就背上这个运维负担。
4.3 调整全局设置中的两个关键开关
Rancher的全局设置里有一个“内置工作负载功能”相关的选项,以及一个“默认集群角色”的模板。实际部署经验里,最需要改的是一个开关:“显示Rancher v1的版本升级提醒”和“允许用户创建新集群”。
“允许用户创建新集群”这个开关在开发环境建议开启,方便做实验;但在正式使用的时候建议关掉,避免有人误操作创建了一堆临时集群然后忘记清理,白白占用节点资源。
另一个值得调整的开关是rke2-ingress-nginx的默认配置,如果你的集群里已经自建了Ingress,Rancher自带的一套Ingress组件可能会覆盖掉原有配置,这个要根据实际网络方案来定。
4.4 创建项目并规划命名空间
Rancher2中的“项目(Project)”和Kubernetes原生的“命名空间(Namespace)”不一样,它是对一组命名空间的逻辑分组,同时可以作为RBAC权限的划分边界。
开发环境的项目规划建议如下:
| 项目名称 | 所含命名空间 | 用途 |
|---|---|---|
| 开发项目 | dev-*, devtools | 日常开发服务、开发工具 |
| 测试项目 | test-* | 联调、自动化测试环境 |
| 基础设施 | cattle-system, ingress, monitoring | 系统组件,一般只有管理员能进入 |
这个划分的好处是:可以做到“开发人员只看得见开发项目,测试人员只看得见测试项目”,不同项目之间的资源配额还能独立设置。初创团队一开始数据规模小感觉不到这层权限的价值,等业务上去了,这个结构就是救命的。
4.5 开启监控和日志收集
Rancher2页面内置了监控套件和日志套件的集成入口。开发环境不强制要求全套监控,但Prometheus监控我是建议开的。
在项目详情页 -> 监控告警 -> 安装监控套件,可以选择内置的Prometheus或Grafana。
为什么开发环境也要监控?因为开发环境往往承担着联调压测任务,很多问题其实是开发环境先把性能瓶颈暴露出来的。没有一个基础的监控面板,全靠开发人肉说“哎呀这服务怎么这么慢”,排查效率会极低。
日志收集这块,开发环境可以先不开,因为日志量不大,直接kubectl logs看就行。等到后面日志量超过每天1GB,再考虑接入云厂商的日志服务或自建ELK。
4.6 配置统一的证书管理方案
Rancher2在解密用户对HTTPS证书的需求这方面做得很不错。通过内置的cert-manager,可以在创建工作负载时直接申请证书,也可以统一管理私有CA证书。
开发环境里的证书管理有一个特殊情况:内网服务通常没有合法域名,只能使用自签证书。我的方案是:用OpenSSL生成一个内网专用的CA根证书,然后在Rancher中创建基于该CA签发的证书。这样所有内网服务都能用可信证书,开发浏览器里安装一次根证书就不会再出现红色警告。
4.7 备份Rancher自身配置
千万记得:Rancher管理端的配置,包括全局设置、项目结构、用户权限、集群关联关系,这些数据都存在管理集群里。如果管理端所在节点挂了,数据没备份,就意味着所有的配置要重来一遍,集群本身倒是不受影响(业务工作负载在业务集群里),但通过Rancher管理的便捷性就全丢光了。
备份方案在Rancher的UI里就能配置:应用市场里搜rancher-backup,安装时配置S3存储作为备份目标。备份周期我建议每天一次保留7天,这个频率不高,但对开发环境足够。
不要犯的一个典型错误是:以为备份了业务集群的etcd就等于备份了Rancher。业务集群的备份和管理端的备份是两码事。
5. 开发环境与初创公司最常用到的核心操作
5.1 通过Rancher创建工作负载的完整流程
对于一个小团队而言,最常见的工作场景就是把一个后端服务跑起来。在Rancher界面操作和纯命令行打kubectl完全等价,但界面更直观,且能可视化查看日志和事件。
顺序是这样的:
- 选择目标项目,点击“工作负载” -> “创建”
- 输入工作负载名称,例如
order-api - 选择命名空间
- 填写容器镜像地址,例如
registry.internal/order-api:1.2.3 - 配置资源限额:CPU和内存建议设limits
- 添加环境变量和配置映射
- 设置健康检查探针(这个非常关键,见下文)
- 点击创建
我个人强烈建议每个工作负载都配置健康检查探针。环境变量里最容易被忽视的是存活探针和就绪探针:存活探针告诉Kubernetes“容器活着就继续跑”,就绪探针告诉Kubernetes“流量可以进来了”。不要偷懒跳过这一步。等到发布变慢才发现探针没配置,排查半天全因没有存活探针导致实例挂掉没有被发现。
5.2 Ingress规则的配置和重定向坑
创建好服务后,最核心的一步是把服务暴露出去。Rancher界面菜单里有一个“负载均衡”或“Ingress”的入口,可以直接创建Ingress。
配置Ingress时有个高频问题:后端服务收到请求时会使用HTTP上的Host头来区分不同服务。如果你的前端域名dev.example.com和后端服务域名api.example.com指向同一个Ingress,务必在Ingress里配置好主机规则,并且确认后端服务接收请求时的Host头是api.example.com而不是dev.example.com。否则会出现跳转到错误域名、路由无法打通的乱象。
初创团队的常见场景:一个域名下面挂多个服务路径,例如/api代理到后端服务、/static代理到静态资源服务。在Ingress注解里加上:
nginx.ingress.kubernetes.io/rewrite-target: /$2配置好路径的重写规则才能生效,否则访问/api/login时后端收到的是/api/login而不是/login,服务端路由直接404。
5.3 环境变量和配置映射的高效管理方法
在Rancher2里面管理配置,有两个概念务必区分:ConfigMap和Secret。Rean:ConfigMap存明文配置,比如日志级别、开关配置;Secret存敏感信息,比如数据库密码、API Key。
开发环境的配置管理有一个很容易犯的错误:把数据库密码直接写在镜像里或环境变量里。这个习惯在开发和测试环境里养成之后,带到生产环境是非常危险的。我的建议是:一开始就养成用Secret的习惯,把数据库密码、Redis密码、第三方密钥全部放到Secret里,工作负载通过引用的方式获取。等后面有需要的时候,迁移到云厂商的密钥托管服务也容易。
5.4 查看日志的几种方式和常用命令
Rancher界面里能直接查看工作负载的日志,而且支持彩色高亮和时间过滤,用起来比kubectl logs舒服。但有些场景必须在命令行里操作。
比如容器崩溃导致日志滚动太快,界面里看不过来,直接用:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml logs -n dev <pod名> --previous--previous参数是查看容器上次启动的日志,这在排查CrashLoopBackOff问题时几乎是百试百灵。
多条日志并存的时候,加-f和--timestamps:前者持续输出,后者展示时间戳,方便对齐分析多个Pod的日志。
6. 运行三个月后才会遇到的常见坑
6.1 证书过期导致的页面无法访问
Let's Encrypt证书有效期三个月,Rancher通过cert-manager自动续期。但自动续期的前提是:域名解析正常、端口可达、cert-manager的RBAC权限还在。
我遇到过的最高频问题是:初次部署时域名DNS解析正常,但三个月后DNS记录被误删或迁移到另一个IP,证书续期失败。Rancher页面开始报证书警告,看起来像是“服务挂了”,实际是证书过期。
排查步骤:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get certificates -n cattle-system kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get certificaterequests -n cattle-system看到证书请求状态显示Failed后,基本就是域名解析或端口连通性问题。
修复也很简单:修正DNS记录,等cert-manager重试即可。cert-manager默认设置了重试机制,通常几个小时内会自动续期成功,不需要手动干预。
6.2 节点磁盘被系统日志和镜像占满
K3s节点上如果跑了多个服务,/var/lib/rancher/k3s/agent/containerd/目录里的镜像层数据会持续增长。再加上之前设置的容器日志大小限制,正常情况下一个月也就几GB。但如果有应用往容器内写大量临时文件,或者Docker的log driver配置漏了,磁盘占用会飞速膨胀。
建议定时检查磁盘占用:
du -sh /var/lib/rancher/k3s/* du -sh /var/lib/docker/*清理镜像时不要直接删Docker镜像目录,因为K3s侧用的是containerd,从Rancher界面里找到不需要的旧镜像版本删除,或者用k3s crictl rmi --prune清理。
这个坑对初创团队来说容易在云服务器上踩雷:默认只有40GB系统盘,两个月不到就满了,然后集群节点变成NotReady。预防方案很简单:部署当时就把数据盘倾向挂载,至少预留100GB空间。
6.3 全局管理员误操作导致的权限锁定风险
在Rancher里,全局管理员有最高权限,可以修改RBAC配置。一个非常迷惑的操作是:为了让某些用户能看到集群,把默认的是集群成员角色模板修改了,结果全局管理员权限也被模板覆盖,导致自己无法登录。
这个情况一旦发生,单机版是可以通过命令修复的,不需要重新部署。找到K3s集群上的kubeconfig,直接操作Kubernetes中的RBAC资源,把被修改的RoleBinding恢复:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get rolebindings -n cattle-system kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml edit rolebindings -n cattle-system rancher-cattle-admin改回subjects里的用户名称对应的权限即可。这个操作需要一定的Kubernetes RBAC知识,但至少有个救命通道。
6.4 Rancher升级之后界面菜单消失
Rancher2版本迭代节奏不快,但偶尔会有跨小版本升级。升级之后偶尔遇到一些界面组件不刷新、菜单不显示的问题。最多的原因是浏览器缓存了旧的静态资源,强制刷新(Ctrl+Shift+R)基本能解决。如果还不行,检查Rancher Pod日志里有没有跨版本的数据库迁移报错。
升级前强烈建议跑一次备份,这不是官方的例行建议,是我自己在某次升级中遇到cattle-system里的Webhook配置因为版本差异产生冲突后的切身教训。
6.5 Contoller Manager的“僵尸资源”清理
Rancher2的架构中有一个NameSpace叫cattle-system和cattle-global-data,这些系统命名空间里会存放一些自动创建的Secrets和配置映射。如果部署过程中反复改密或者重新安装Rancher,这些资源可能会变成“僵尸”状态:旧数据还在,新实例无法使用同名资源。
我常用的一种清理方法是:确认没有数据依赖之后,直接删掉对应命名空间并重建。但这操作风险比较大,动手之前一定要确认业务集群的关联关系没有依赖这些系统资源。非技术背景的同事遇到问题切勿直接上手删资源,而是先看日志找原因。
7. 单机版Rancher2的备份、恢复与升级策略
7.1 Rancher自身的备份实操
Rancher备份首选官方rancher-backup插件。安装方法是在Rancher界面的应用市场搜索并安装,配置时指定S3存储路径或本机路径。
如果用本地路径,务必注意路径要在K3s可访问的位置,我一般放在/opt/rancher-backup/。备份文件本身是一个tar.gz,里面包含了管理端的配置、全局设置、用户信息。
备份恢复的完整过程:
# 通过Helm安装新Rancher helm install rancher rancher-latest/rancher \ --namespace cattle-system \ --set hostname=rancher.example.internal \ --set bootstrapPassword=admin \ --set replicas=1 # 恢复备份 kubectl apply -f backup-crd.yaml kubectl create -f restore.yamlrestore.yaml里指定备份文件来源,可以通过S3或本地路径读取。恢复之后Rancher会重启,大概几分钟后进入正常的登录页面,用户名和权限都会恢复到备份时点的状态。
7.2 业务集群的保存和恢复
Rancher管理着业务集群,但业务集群本身的数据主要放在业务集群的etcd里。单机版Rancher的备份不会自动备份你管理的业务集群的etcd数据,需要为每个业务集群单独配置etcd备份策略。
在Rancher的集群设置里可以配置etcd自动快照,备份到本地或S3。这个配置非常关键,尤其是开发环境里如果跑了数据库类应用,没有etcd备份,一旦集群节点坏掉,数据就是灭顶之灾。
我这里看到不少团队只备份了Rancher管理端,却忽略了业务集群的etcd备份,直到真出事了才发现。备份不是运维的KPI,是数据恢复时的救生绳。
7.3 升级Rancher2的正确操作顺序
升级操作本身不难,但顺序错了会出问题。
我的建议顺序是:
- 先备份Rancher管理端配置
- 再备份所有业务集群的etcd
- 升级Rancher管理端(使用新版本的Helm Chart执行
helm upgrade) - 观察Rancher页面状态,等管理端稳定Running
- 更新业务集群的所在节点上的
agent组件(Rancher通常会自动触发,个别旧版本需要手动)
尽量避免跨大版本跳级升级,例如从2.6直接升到2.9,虽然官方文档表明支持跨版本,但实际操作中遇到未知属性配置的报错概率不低。稳妥的做法是两个版本之间过渡:先升到2.7,再升到2.9。
7.4 升级中常见到报错和应对方法
常见报错之一是x legacy chart,通常表示Helm Chart中的某些废弃字段在新版本中不支持。这种时候先用helm get values看当前配置,把废弃字段从values里移除再执行升级。
另一个常见问题是升级后的Rancher Pod不断重启,日志里报数据库迁移失败。这通常是因为备份恢复或跨版本迁移时,数据中的旧字段和新版本的迁移逻辑不兼容。遇到这种情况先不要慌,把Rancher Pod停掉,用最后一个正常的镜像版本回滚:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml set image deployment/rancher -n cattle-system rancher=rancher/rancher:v2.x.y-old回滚之后立刻做一次完整备份,再处理迁移问题。
8. 单机版部署到高可用架构的平滑过渡思路
单机版Rancher2在开发环境和初创公司里很够用,但如果团队快速成长,集群规模扩大到一个阈值(我个人建议是管理集群的节点数量超过50个,或者业务集群数量超过3-5个),单机版管理端会成为瓶颈。这个瓶颈主要在性能上:Rancher管理端要持续收集所有被管理集群的状态信息,单节点处理能力有限,页面操作会明显变慢。
但好消息是,从单机版过渡到HA版并不是推倒重来。操作思路是:
- 在现有K3s单节点上,通过Rancher的备份把配置导出
- 准备三台新服务器,部署K3s高可用模式(内置etcd集群)
- 安装Rancher HA版本的Helm Chart,指定
replicas=3 - 从备份恢复配置和用户权限
- 业务集群不受影响,因为业务集群的关联关系本来就在Rancher备份里
整个迁移过程官方文档有详细说明,实际操作下来耗时大约半天。对初创团队来说,最重要的事情是先正常使用单机版,把产品跑出来,别过早背负高可用运维负担。
说到底,单机版Rancher2的价值就是:一个人也能优雅地管理整个Kubernetes世界。这个结论在我带的多次部署中都得到了验证。对于开发环境、测试环境、初创团队,选它不会错。