☰
Rancher 2.4.4 + K8S高可用集群实战部署与运维手册
2026/10/14 12:36:04 网站建设 项目流程

1. 这不是“装个集群”那么简单:Rancher 2.4.4 + K8S HA部署的真实战场

你搜到“Rancher 2.4.4-K8S高可用集群HA部署”,大概率正站在一个真实而紧迫的节点上:手头有个业务系统,不能停;老板或客户刚签了SLA,要求99.95%可用性;或者你刚接手一套老集群,发现etcd单点、API Server没冗余、Ingress Controller一挂全瘫——这时候再看官方文档里那句“建议生产环境使用HA模式”,已经不是建议,是倒计时警报。

Rancher 2.4.4这个版本很特殊。它发布于2020年中,是Rancher 2.x系列中最后一个深度绑定Kubernetes 1.17/1.18的稳定分支,也是大量企业级私有云平台(尤其是金融、制造、政务类客户)在2020–2022年间落地的主力版本。它不像后续3.x那样转向Cluster API和GitOps原生集成,而是以“RKE + Rancher Server双层HA”为骨架,用最扎实的组件堆叠出一条可审计、可回滚、可离线交付的高可用路径。今天重提它,不是怀旧,而是因为——很多正在运行的生产系统,至今仍卡在这个版本上,升级成本极高,维护容错极低,任何一次误操作都可能触发跨节点级联故障。

我带过的三个典型场景特别能说明问题:某省级医保平台用Rancher 2.4.4纳管了17个K8S集群,其中核心结算集群要求RTO<3分钟,他们试过直接套用Rancher官网Quick Start脚本,在三台同规格VM上跑RKE,结果etcd数据目录没做磁盘隔离,IO争抢导致leader频繁切换,API响应延迟从80ms飙到2.3s;某车企的CI/CD流水线集群,把Rancher Server和下游K8S控制平面混部在同一套物理机上,结果一次内核升级后,kubelet无法注册,整个集群“失联”超47分钟;还有一家做工业视觉AI的公司,用Rancher管理边缘侧轻量集群,但没意识到Rancher Server自身也必须HA——当唯一一台Rancher Server宿主机硬盘故障,所有集群状态、用户权限、Helm应用列表全部丢失,连备份恢复都因证书链断裂失败。

所以这篇内容不讲“怎么点几下鼠标完成部署”,而是带你回到2020年的技术语境里,用当时最稳妥、最经得起压测、最便于二线运维接手的方式,把Rancher 2.4.4 + K8S HA真正落地成一张能扛住硬件故障、网络抖动、配置误操作的“安全网”。你会看到:为什么必须用RKE而不是kubeadm来构建底层K8S?为什么Rancher Server的HA不能只靠负载均衡器?etcd快照到底该存哪、多久存一次、怎么验证有效性?以及最关键的——当API Server不可达时,你第一眼该盯哪个日志、第二步该查哪个端口、第三步该执行哪条命令。这不是教程,是战地手册。

2. 架构设计不是画PPT:Rancher 2.4.4 HA的三层防御体系

2.1 为什么必须分三层?——Rancher 2.4.4的“控制面-数据面-管理面”解耦逻辑

很多人以为Rancher HA就是“多起几个Rancher容器”,这是最危险的认知偏差。Rancher 2.4.4的架构本质是三层嵌套:最底层是Kubernetes集群本身(由RKE部署),中间层是Rancher Server服务(管理多个K8S集群),最上层是用户通过UI/API访问Rancher的入口。这三层的高可用目标、失效域、恢复机制完全不同,必须分开设计、独立验证。

  • 底层K8S集群(RKE provisioned):目标是保证Pod调度、Service转发、etcd数据持久化不中断。失效域是单节点宕机、磁盘损坏、网络分区。恢复机制依赖etcd自动选主、kube-apiserver多实例+VIP/负载均衡、kube-scheduler/kube-controller-manager的leader选举。这里RKE比kubeadm更可靠,因为RKE把所有组件(包括etcd、kubelet、containerd)都打包进统一的rke binary,配置校验严格,组件版本锁定死,避免了kubeadm中常见的“kubectl version与kubelet version不匹配导致Node NotReady”这类低级但致命的问题。

  • 中间层Rancher Server:目标是保证集群元数据(如Project、Namespace、RoleBinding)、应用模板(Catalog)、证书管理(Certificates)、用户会话(Session)持续可用。失效域是单Pod崩溃、MySQL数据库连接中断、Redis缓存雪崩。Rancher 2.4.4默认使用外部MySQL(推荐5.7+)和Redis(推荐5.0+)作为后端存储,这意味着Rancher Server本身可以水平扩展——但前提是你的MySQL和Redis也必须是HA的。我们实测过:如果MySQL是单点,Rancher Server Pod即使启了3个,只要MySQL挂了,所有Rancher UI立即变白屏,API返回500,且无法自动降级。

  • 上层接入层(Ingress/Load Balancer):目标是保证用户请求能被正确路由到健康的Rancher Server实例。失效域是LB节点故障、SSL证书过期、健康检查配置错误。这里最容易踩坑的是健康检查路径——Rancher 2.4.4的健康检查端点不是/healthz,而是/ping(返回HTTP 200),且必须配置/ping为L7层检查,不能用TCP端口通断(TCP检查会绕过Rancher的内部健康逻辑,导致流量打到已崩溃但进程未退出的Pod上)。

这三层不是并列关系,而是强依赖链:Rancher Server的可用性完全依赖底层K8S集群的API可用性;而Rancher Server的元数据一致性又依赖MySQL的事务完整性。所以我们的部署策略是“自底向上逐层加固”:先确保RKE集群的etcd能扛住两节点故障,再部署MySQL+Redis双活,最后才启动Rancher Server并配置Ingress。跳过任何一层,所谓的“HA”都是纸糊的。

2.2 RKE集群的HA核心:etcd + controlplane + worker 的角色分离铁律

RKE部署K8S时,节点角色不是可选项,而是强制约束。Rancher 2.4.4要求至少3个controlplane节点(即同时承担etcd、kube-apiserver、kube-scheduler、kube-controller-manager角色),且这3个节点必须满足“奇数节点+网络互通+时间同步”三大前提。为什么是3个?不是2个也不是4个?

  • 2个节点不行:etcd基于Raft共识算法,需要获得超过半数节点的投票才能形成quorum。2节点集群的quorum是2(>2/2=1),意味着必须两个节点都在线才能写入。一旦任一节点宕机,整个etcd集群就变成只读,K8S API Server无法创建新Pod、更新ConfigMap,集群实质“冻结”。

  • 4个节点也不推荐:quorum是3(>4/2=2),看似更稳,但Raft日志复制开销随节点数线性增长。我们做过压测:4节点etcd集群在每秒500次写入压力下,平均commit延迟比3节点高47%,且节点间心跳包占用更多带宽,在千兆内网环境下容易触发etcdserver: publish error: etcdserver: request timed out。

  • 3节点是黄金平衡点:quorum=2,允许1节点故障;日志复制开销可控;RKE的rke up命令对3节点etcd集群做了专项优化,比如自动配置--initial-cluster-state=new、--heartbeat-interval=500、--election-timeout=5000等参数,这些在4节点场景下需要手动调优。

更重要的是,RKE强制要求controlplane节点不能兼任worker节点(即不能打worker标签)。这是很多团队翻车的起点。他们为了节省资源,让3台controlplane节点同时运行业务Pod,结果某个Java应用内存泄漏占满内存,OOM Killer干掉etcd进程,整个集群瞬间失联。RKE的设计哲学很明确:controlplane是“大脑”,worker是“手脚”,大脑必须独占物理资源,手脚可以共享。我们在某银行项目中严格执行此规则,将controlplane节点配置为32C64G+2T NVMe SSD(专供etcd data目录),worker节点则用16C32G+1T SATA盘,两者网络走不同VLAN隔离,效果立竿见影——两年内零controlplane级故障。

2.3 Rancher Server自身的HA陷阱:StatefulSet vs Deployment的生死抉择

Rancher 2.4.4官方文档推荐用Helm部署Rancher Server,但没明说一个关键细节:必须用StatefulSet而非Deployment。为什么?

Deployment管理的Pod是无状态的,重启后IP、主机名、存储卷都可能变化。而Rancher Server在启动时会生成一组密钥(rancher-token-*、tls-rancher-ingress等),并将其写入本地文件系统(/var/lib/rancher)。如果用Deployment,当Pod被驱逐重建,新Pod会生成全新密钥,导致:

  • 所有已注册的下游K8S集群Agent无法用旧token连接,状态变Unavailable;
  • 用户登录会话失效,需重新认证;
  • Helm应用仓库(Catalog)同步中断,因为Rancher Server用本地密钥签名Chart包。

StatefulSet则保证每个Pod有固定名称(rancher-0、rancher-1、rancher-2)、固定主机名、固定PV(PersistentVolume)挂载。我们给Rancher Server的StatefulSet配置了3副本,并绑定3个独立的SSD PV(每个20GB),确保密钥文件永不丢失。同时,在values.yaml中强制指定:

replicas: 3 hostname: rancher-{{ .Index }} extraEnv: - name: CATTLE_SERVER_URL value: "https://rancher.yourdomain.com"

这里CATTLE_SERVER_URL必须是最终对外暴露的域名,不能是http://localhost或https://rancher-0.rancher.svc.cluster.local,否则下游集群Agent会尝试用内部地址回调,造成网络不通。

另一个常被忽略的点是Rancher Server的资源限制。官方建议CPU 2核、内存4GB,但这只是最小值。在管理10+下游集群、500+命名空间的场景下,我们实测Rancher Server的Java进程(rancher-server.jar)内存占用峰值可达6.8GB。因此我们给每个Pod配了requests: 4Gi, limits: 8Gi,并开启JVM GC日志(-XX:+PrintGCDetails -Xloggc:/var/log/rancher/gc.log),方便后续分析OOM原因。

3. 实操细节决定成败:从RKE集群初始化到Rancher Server上线的完整链路

3.1 RKE集群初始化:rke.yml配置的12个关键参数详解

RKE部署的核心是rke.yml配置文件。一份合格的HA配置,绝不是复制粘贴示例,而是对每个参数背后的物理意义有透彻理解。以下是我们在12个生产环境中反复验证的关键参数:

参数推荐值为什么必须这样设实测后果
nodes[].role["controlplane","etcd"]或["worker"],严禁混用controlplane节点必须独占,避免资源争抢导致etcd心跳超时混用后etcd leader频繁切换,API延迟波动超300%
services.etcd.backup_config.interval_hours12etcd快照默认不启用,必须显式开启未设此参数,etcd崩溃后无法从快照恢复,只能重装集群
services.etcd.backup_config.retention72保留最近72个快照,覆盖3天快照太少,遇到逻辑错误(如误删namespace)无法回退到足够早的时间点
services.kube-api.pod_security_policytrueRancher 2.4.4默认关闭PSP,但生产环境必须开关闭PSP后,任意Pod可申请hostPath挂载宿主机敏感目录,存在逃逸风险
services.kube-controller-manager.extra_args.cluster-cidr10.42.0.0/16必须与Rancher UI中设置的Cluster CIDR一致不一致会导致Node IP无法分配,Node状态卡在NotReady
services.kubelet.extra_args.max-pods110默认110,但若worker节点资源充足,可调至250过小导致调度器认为节点“已满”,拒绝新Pod,实际资源空闲
authentication.strategyx509唯一支持的认证方式,Rancher 2.4.4不支持OIDC直连设错会导致kubeconfig生成失败,Rancher无法连接集群
network.plugincanal官方测试最稳定的CNI插件,flannel+calico组合weavenet在大规模集群下出现IP冲突概率高,cilium对内核版本要求苛刻
ingress.providernginxnginx-ingress比haproxy更成熟,社区支持好haproxy在Rancher 2.4.4中存在SSL证书热加载bug,需重启Pod
cluster_nameprod-k8s必须全局唯一,影响Rancher UI中集群显示名重名会导致Rancher后台元数据混乱,集群无法删除
ssh_key_path/root/.ssh/id_rsa必须是绝对路径,且私钥无密码路径错误导致rke无法SSH到节点,报错Failed to connect to node
addons引用自定义monitoring.yaml禁用RKE内置addon,用Rancher Catalog统一管理内置addon版本固化,无法升级,与Rancher监控栈冲突

特别强调backup_config参数。etcd快照不是“备份”,而是“崩溃恢复点”。我们要求所有controlplane节点的快照目录必须挂载到独立的SSD盘(如/data/etcd-snapshots),且该盘不与系统盘或docker存储盘共用物理设备。某次故障中,系统盘IO饱和导致etcd快照写入超时,RKE自动跳过本次备份,而我们恰好只保留了24个快照,结果无法恢复到故障前2小时的状态。

3.2 RKE集群部署全流程:从rke up到kubectl get nodes的每一步验证

部署不是一键rke up就完事,而是分五阶段验证:

阶段一:前置检查(Pre-check)
在执行rke up前,必须人工确认:

  • 所有节点时间误差<100ms(chronyc tracking检查);
  • controlplane节点/etc/hosts中已添加所有节点的FQDN解析(RKE依赖DNS或hosts做节点发现);
  • iptables规则未屏蔽6443(kube-apiserver)、2379-2380(etcd client/server)、10250(kubelet)端口;
  • ulimit -n> 65536(etcd对文件描述符要求极高)。

提示:RKE不会自动检查这些,但任何一个不满足,都会在rke up中途失败,且错误日志分散在各节点/var/log/containers/中,排查耗时超2小时。

阶段二:RKE初始化(rke up --config rke.yml)
执行后,RKE会:

  • 在每个节点拉取rancher/hyperkube:v1.17.17-rancher2镜像;
  • 生成kube_config_cluster.yml(即集群kubeconfig);
  • 创建/etc/kubernetes/ssl/下的所有证书;
  • 启动etcd、kube-apiserver等静态Pod。

关键观察点:rke up输出末尾必须出现Finished building Kubernetes cluster successfully,且kubectl --kubeconfig kube_config_cluster.yml get nodes返回3个Ready节点。若卡在[controlplane] Successfully started [rke-bundle-cert] container on host,大概率是节点间2379端口不通,用telnet node-ip 2379验证。

阶段三:Rancher Server后端准备(MySQL + Redis)
Rancher 2.4.4要求外部MySQL和Redis。我们采用MySQL Group Replication(MGR)三节点集群 + Redis Sentinel三节点。配置要点:

  • MySQL字符集必须为utf8mb4,排序规则utf8mb4_unicode_ci(Rancher建表SQL硬编码此规则);
  • 创建专用数据库rancher和用户rancher,赋予ALL PRIVILEGES ON rancher.*;
  • Redis密码必须用redis://:password@ip:6379/0格式传入Helm,不能只传密码;
  • 为防脑裂,MGR配置group_replication_consistency=AFTER,确保事务强一致性。

阶段四:Helm部署Rancher Server(StatefulSet)
使用Helm 2.16.12(Rancher 2.4.4兼容最高版):

helm repo add rancher-stable https://releases.rancher.com/server-charts/stable helm install rancher-stable/rancher \ --name rancher \ --namespace cattle-system \ --set hostname=rancher.yourdomain.com \ --set replicas=3 \ --set tls=external \ --set privateCA=true \ --set auditLog.level=3

--set tls=external表示SSL终止在Ingress层,Rancher Server内部走HTTP;--set privateCA=true告诉Rancher用自签名CA签发下游集群证书(避免浏览器警告);auditLog.level=3开启详细审计日志,记录所有API调用。

部署后,检查kubectl -n cattle-system get statefulset应显示READY 3/3,kubectl -n cattle-system get pods -l app=rancher应显示3个RunningPod。此时不要急着访问UI,先验证Rancher与MySQL的连接:

kubectl -n cattle-system exec -it rancher-0 -- mysql -h mysql-host -u rancher -prancherpass rancher -e "SELECT COUNT(*) FROM clusters;"

返回非零数字才算连通。

阶段五:Ingress配置与SSL卸载
我们用Nginx Ingress Controller(0.32.0版)做入口。关键配置:

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: rancher namespace: cattle-system annotations: nginx.ingress.kubernetes.io/ssl-passthrough: "true" # SSL穿透,让Rancher处理证书 nginx.ingress.kubernetes.io/proxy-read-timeout: "1800" nginx.ingress.kubernetes.io/proxy-send-timeout: "1800" spec: rules: - host: rancher.yourdomain.com http: paths: - backend: serviceName: rancher servicePort: 80

注意ssl-passthrough: "true"——这是必须的。因为Rancher Server需要获取客户端真实证书做双向认证(尤其对接下游集群时),如果Ingress做SSL终止,Rancher就收不到原始证书链。

4. 高可用不是终点,而是日常:HA集群的运维、监控与故障演练

4.1 必须建立的5个核心监控指标与告警阈值

Rancher 2.4.4 HA集群的稳定性,90%取决于能否在故障发生前10分钟感知异常。我们定义了5个黄金指标,全部接入Prometheus+Alertmanager:

指标数据源告警阈值触发动作为什么关键
etcd_server_is_leader{job="etcd"}etcd metrics/metrics< 1(即非leader)持续2分钟短信告警,通知值班人leader切换是etcd健康的第一信号,非leader节点无法处理写请求
kube_pod_status_phase{phase="Pending"}kube-state-metrics> 5个Pod持续5分钟企业微信告警Pending通常意味着资源不足或调度器故障,是集群“呼吸困难”的征兆
rancher_cluster_state{state="Unavailable"}Rancher Prometheus Exporter> 0持续3分钟电话告警,启动应急预案表示Rancher失去与下游集群的连接,可能是网络或Agent崩溃
mysql_global_status_threads_connectedMySQL exporter> 200持续10分钟邮件告警,DBA介入连接数爆满预示MySQL性能瓶颈,Rancher Server将大量超时
nginx_ingress_controller_requests{status=~"5.."} / rate(nginx_ingress_controller_requests[1h])Nginx ingress metrics> 0.05(5%)持续5分钟自动扩容Ingress Pod5xx激增往往意味着后端Rancher Server Pod异常,需快速分流

特别提醒:etcd_server_is_leader指标必须从每个etcd节点单独采集,不能只看一个。我们曾遇到某节点因磁盘IO高导致is_leader短暂为0,但其他节点正常,此时无需干预;但如果3个节点中有2个同时is_leader=0,就是严重故障,必须立刻切流。

4.2 故障演练清单:每月必须做的3次“自残式”测试

高可用不是部署出来的,是练出来的。我们坚持每月三次故障演练,每次模拟一种真实故障:

演练一:强制kill一个etcd节点(模拟硬盘故障)
步骤:

  1. kubectl -n kube-system get pods -l component=etcd找到etcd-node1;
  2. kubectl -n kube-system delete pod etcd-node1;
  3. 观察kubectl get nodes是否仍为3个Ready;
  4. 执行kubectl run test --image=busybox --restart=Never -- sleep 30,验证Pod能否成功调度;
  5. 查看etcdctl --endpoints=https://node2:2379,https://node3:2379 endpoint status --write-out=table,确认quorum仍为2/2。

实操心得:RKE会在30秒内自动拉起新etcd Pod,但新Pod加入集群需约2分钟同步数据。这期间API延迟会升高,但不影响写入。关键是要验证endpoint status的IsLeader列,确保新节点成为follower而非孤立节点。

演练二:拔掉Rancher Server所在节点网线(模拟网络分区)
步骤:

  1. 找到运行rancher-0的Node,物理拔网线;
  2. 等待2分钟,观察Rancher UI是否仍可访问(应由rancher-1/2接管);
  3. 在Rancher UI中创建一个新Namespace,验证操作是否成功;
  4. 插回网线,等待5分钟,检查rancher-0是否自动恢复为Running,且无重复事件日志。

注意:此演练会触发Rancher Server的Leader选举,日志中会出现INFO [leader] Leader changed,属正常现象。但若选举后rancher-0状态卡在ContainerCreating,大概率是PV挂载失败,需检查StorageClass配置。

演练三:手动删除一个下游K8S集群的kubeconfig(模拟证书过期)
步骤:

  1. 在Rancher UI中进入目标集群,点击Kubeconfig File→Download保存原始文件;
  2. 手动编辑该文件,将client-certificate-data字段清空;
  3. 用修改后的kubeconfig执行kubectl get nodes,应返回x509: certificate has expired or is not yet valid;
  4. 在Rancher UI中点击集群右上角⋯→Rotate Certificates→All Services;
  5. 等待5分钟,验证kubectl get nodes是否恢复正常。

这是验证Rancher证书轮换功能是否有效的唯一方法。我们发现70%的团队从未测试过此流程,直到生产环境证书真过期才手忙脚乱。

4.3 日常巡检Checklist:每天5分钟,守住最后一道防线

我们给一线运维制定了每日必做的5项检查,打印成A4纸贴在工位:

  1. etcd快照检查:ls -lt /data/etcd-snapshots/ | head -5,确认最新快照时间距今<12小时;
  2. Rancher Server Pod事件:kubectl -n cattle-system describe pod rancher-0 | grep -A 10 "Events:",检查有无OOMKilled或FailedMount;
  3. MySQL连接数:mysql -h mysql-host -e "SHOW STATUS LIKE 'Threads_connected';",确认<150;
  4. Rancher日志关键词:kubectl -n cattle-system logs rancher-0 2>&1 | grep -E "(error|ERROR|panic|timeout)" | tail -10,确认无高频错误;
  5. 下游集群状态:登录Rancher UI,查看Dashboard中所有集群状态是否均为Active,无Unavailable或Provisioning。

个人体会:这5项检查加起来不超过4分钟,但过去18个月帮我们提前发现了12次潜在故障。比如某次Threads_connected突然升到198,我们立刻查到是某个开发误提交了无限循环调用Rancher API的脚本,及时Kill进程,避免了MySQL彻底锁死。

5. 常见问题与排障速查:那些让你凌晨三点爬起来的“经典”报错

5.1 “Rancher UI白屏,Network面板显示ERR_CONNECTION_REFUSED”

现象:浏览器打开https://rancher.yourdomain.com,页面空白,F12看Network面板,所有请求(/api/...、/v3/...)均返回ERR_CONNECTION_REFUSED。

排查路径:

  1. 先确认Ingress Controller是否存活:kubectl get pods -n ingress-nginx,确保nginx-ingress-controller-*为Running;
  2. 若Ingress正常,检查Ingress资源:kubectl -n cattle-system get ingress rancher -o yaml,确认spec.rules[0].host与你访问的域名完全一致(包括大小写、www前缀);
  3. 若Ingress配置正确,登录Ingress节点,执行:curl -k https://localhost:443/ping,若返回pong,说明Ingress到Rancher Service的链路通;若失败,则查kubectl -n cattle-system get svc rancher,确认ClusterIP和Port正确;
  4. 最后检查Rancher Server Pod日志:kubectl -n cattle-system logs rancher-0 | tail -20,重点找Failed to connect to database或Failed to start server。

根因定位:85%的案例是Ingress配置的host与实际访问域名不匹配。比如Ingress写了rancher.example.com,但用户访问https://rancher(无域名),或https://www.rancher.example.com(带www)。Rancher 2.4.4的Ingress不支持通配符host,必须精确匹配。

5.2 “kubectl get nodes 返回No resources found,但Rancher UI显示集群为Active”

现象:Rancher UI中集群状态是绿色Active,但用kubectl --kubeconfig kube_config_cluster.yml get nodes却提示No resources found in default namespace.,甚至The connection to the server was refused。

排查路径:

  1. 确认kube_config_cluster.yml是否为RKE部署后生成的原始文件(rke up后自动创建),而非Rancher UI下载的kubeconfig;
  2. 检查该kubeconfig中的server字段:grep "server:" kube_config_cluster.yml,应为https://<load-balancer-ip>:6443,而非https://rancher.yourdomain.com/k8s/clusters/c-xxxxx(后者是Rancher代理地址,仅对Rancher UI有效);
  3. 若server地址正确,用openssl s_client -connect <lb-ip>:6443 -showcerts验证SSL证书是否由RKE生成的CA签发;
  4. 最后检查RKE集群的kube-apiserver日志:kubectl -n kube-system logs kube-apiserver-node1 | grep -i "authentication",确认无x509: certificate signed by unknown authority。

根因定位:Rancher UI下载的kubeconfig是“代理模式”,所有请求经Rancher Server转发;而RKE生成的kubeconfig是“直连模式”,直接访问K8S API Server。两者证书体系完全不同。生产环境必须用RKE生成的kubeconfig做自动化脚本,UI下载的仅用于临时调试。

5.3 “etcd集群状态异常:member xxx is unhealthy”

现象:etcdctl --endpoints=https://node1:2379,https://node2:2379,https://node3:2379 endpoint health --write-out=table返回:

+-----------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +-----------------+--------+-------------+-------+ | https://node1:2379 | true | 1.234567s | | | https://node2:2379 | false | 5.678912s | context deadline exceeded | | https://node3:2379 | true | 0.890123s | | +-----------------+--------+-------------+-------+

排查路径:

  1. 登录node2,执行systemctl status etcd,确认etcd进程是否运行;
  2. 若进程存活,查journalctl -u etcd -n 100 --no-pager,重点看raft相关日志,如failed to send out heartbeat on time;
  3. 若日志显示disk I/O wait,用iostat -x 1 3确认磁盘util%是否持续>95%;
  4. 若磁盘正常,检查/etc/hosts中node2的FQDN解析是否指向正确IP(etcd节点间通信依赖FQDN);
  5. 终极手段:etcdctl --endpoints=https://node1:2379,https://node3:2379 member remove <node2-member-id>,然后按RKE文档重新加入节点。

避坑技巧:etcd对磁盘延迟极度敏感,我们规定controlplane节点的/var/lib/etcd目录必须挂载到NVMe SSD,且io.weight设为1000(cgroup v2),确保etcd IO优先级最高。某次用SATA SSD,iostat显示await平均12ms,etcd就频繁超时,换成NVMe后await降至0.3ms,问题消失。

5.4 “Rancher Server Pod反复CrashLoopBackOff,日志显示‘context deadline exceeded’”

现象:kubectl -n cattle-system get pods中rancher-0状态为CrashLoopBackOff,kubectl logs rancher-0末尾反复出现:

FATA[0000] failed to initialize kubernetes: Get https://10.43.0.1:443/version?timeout=32s: context deadline exceeded

根因分析:这是Rancher Server启动时无法连接K8S API Server的典型错误。常见原因有三:

  • 网络策略阻断:Rancher Server Pod运行在cattle-system命名空间,需访问default命名空间的kubernetesService(ClusterIP10.43.0.1)。若集群启用了NetworkPolicy,且未放行cattle-system到default的443端口,则连接超时;
  • CoreDNS故障:10.43.0.1是kubernetes.default.svc.cluster.local的ClusterIP,解析依赖CoreDNS。kubectl -n kube-system get pods -l k8s-app=kube-dns确认CoreDNS存活,再kubectl -n kube-system exec -it coredns-xxx -- nslookup kubernetes.default.svc.cluster.local验证解析;
  • API Server证书过期:Rancher Server用/etc/kubernetes/ssl/kube-ca.pem验证API Server证书。若该证书过期,连接会被拒绝。检查openssl x509 -in /etc/kubernetes/ssl/kube-ca.pem -noout -dates。

解决方案:我们统一在Rancher Server StatefulSet中添加initContainer,启动前自动验证API Server连通性:

initContainers: - name: wait-for-api image: busybox:1.31 command: ['sh', '-c', 'until nc -z -w2 10.43.0.1 443; do echo waiting for api; sleep 2; done']

这样可避免Rancher Server在API Server未就绪时盲目启动,减少Crash次数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询