Rancher v2.7.5集群导入翻车实录:cattle-system卡在Terminating,我是如何一步步救回来的
2026/6/15 6:43:53 网站建设 项目流程

Rancher集群导入故障深度解析:从Terminating状态到准入控制器的实战救援

当你在深夜的运维值班中,突然发现Rancher管理的Kubernetes集群出现异常,那个关键的cattle-system命名空间固执地显示着Terminating状态,而集群导入流程因此停滞不前——这种场景恐怕是每个DevOps工程师的噩梦。本文将带你深入一个真实的故障排查历程,不仅解决表面问题,更揭示Kubernetes准入控制器背后的运作机制。

1. 故障现象与初步诊断

那个令人不安的周五下午,在尝试将一个新集群导入Rancher v2.7.5环境时,由于网络波动导致初始操作中断。当我重新执行集群导入命令后,发现cattle-system命名空间陷入了奇怪的僵局:

kubectl get ns cattle-system NAME STATUS AGE cattle-system Terminating 2h

常规的强制删除命令毫无效果:

kubectl delete namespace cattle-system --grace-period=0 --force

甚至尝试清除finalizers也未能奏效:

kubectl patch namespace cattle-system -p '{"metadata":{"finalizers":[]}}' --type='merge'

提示:finalizer是Kubernetes中一种保护机制,确保资源删除前完成必要的清理工作。但有时它也会成为删除操作的绊脚石。

此时,系统日志中开始出现更令人不安的错误信息:

Error from server (InternalError): failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/validation/namespaces?timeout=10s": service "rancher-webhook" not found

这条错误信息成为了我们排查的第一个重要线索——它直指Rancher的webhook服务出现了问题。

2. 深入Kubernetes准入控制器机制

要真正理解这个错误的含义,我们需要先了解Kubernetes的两个关键概念:

  • MutatingWebhookConfiguration:在资源被持久化到etcd之前,可以修改资源的配置
  • ValidatingWebhookConfiguration:在资源被持久化之前,验证资源的合法性

Rancher利用这些机制来实现多种功能,包括:

  1. 命名空间创建时的自动配置
  2. 资源格式验证
  3. 安全策略强制执行
  4. 多租户隔离保障

当这些webhook配置存在,但对应的后端服务不可用时,就会导致我们遇到的这种"死锁"状态——系统无法完成操作,因为webhook不可达;而webhook不可达可能是因为系统状态不正常。

3. 系统性故障排查步骤

3.1 检查相关webhook配置

首先列出集群中所有的webhook配置:

kubectl get MutatingWebhookConfiguration,ValidatingWebhookConfiguration

典型输出可能如下:

NAME WEBHOOKS AGE mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook 1 5h50m mutatingwebhookconfiguration.admissionregistration.k8s.io/mutating-webhook-configuration 8 5h49m mutatingwebhookconfiguration.admissionregistration.k8s.io/rancher.cattle.io 5 120m NAME WEBHOOKS AGE validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook 1 5h51m validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission 1 6h6m validatingwebhookconfiguration.admissionregistration.k8s.io/rancher.cattle.io 13 121m validatingwebhookconfiguration.admissionregistration.k8s.io/validating-webhook-configuration 11 5h50m

3.2 识别问题webhook

通过describe命令查看具体配置:

kubectl describe ValidatingWebhookConfiguration rancher.cattle.io

在输出中,特别注意以下字段:

  • rules: 定义了哪些操作会触发webhook
  • clientConfig: 指定了webhook服务的地址
  • failurePolicy: 决定了webhook失败时的行为(Fail或Ignore)

3.3 关键修复操作

当确认webhook服务确实不可用后,执行以下关键步骤:

  1. 删除有问题的webhook配置:
kubectl delete MutatingWebhookConfiguration rancher.cattle.io kubectl delete ValidatingWebhookConfiguration rancher.cattle.io
  1. 清理finalizers并强制删除卡住的命名空间:
kubectl patch namespace cattle-system -p '{"metadata":{"finalizers":[]}}' --type='merge' kubectl delete namespace cattle-system --grace-period=0 --force
  1. 重新创建命名空间:
kubectl create ns cattle-system

4. 预防措施与最佳实践

经历过这次故障后,我总结了几条关键经验:

  1. 操作前备份关键配置

    kubectl get MutatingWebhookConfiguration,ValidatingWebhookConfiguration -o yaml > webhooks-backup.yaml
  2. 理解webhook的failurePolicy

    • Fail:webhook调用失败会导致操作失败
    • Ignore:webhook调用失败会被忽略,操作继续
  3. 关键操作检查清单

    操作类型前检查项后验证项
    集群导入网络连通性
    DNS解析正常
    证书有效
    命名空间状态
    Pod运行状态
    Webhook服务可达
    大规模删除资源依赖关系
    Finalizers存在情况
    资源实际删除状态
    系统日志监控
  4. 监控webhook服务健康状态

    • 定期检查webhook endpoint可达性
    • 设置适当的超时时间(避免默认的10s太长)
    • 监控webhook调用的延迟和错误率

5. 深入理解Rancher的webhook架构

Rancher使用webhook实现的核心功能包括:

  1. 全局资源验证

    • 确保集群配置符合Rancher策略
    • 实施多租户隔离规则
    • 验证自定义资源(CRD)的合法性
  2. 自动化配置注入

    • 为命名空间自动添加标签和注解
    • 注入默认的资源配额和限制
    • 设置网络策略基础规则
  3. 安全策略执行

    • 镜像来源验证
    • 权限提升预防
    • 敏感操作审计

这种架构虽然强大,但也带来了复杂性。当webhook服务不可用时,可能会影响集群的基本操作能力。因此,在设计类似系统时,需要考虑:

  • 关键webhook服务的冗余部署
  • 优雅降级机制
  • 更精细的failurePolicy配置

6. 高级故障排查技巧

当基本解决方案无效时,可以尝试以下高级技巧:

  1. 临时修改API服务器参数

    # 临时禁用特定的准入控制器 kube-apiserver --disable-admission-plugins=MutatingAdmissionWebhook,ValidatingAdmissionWebhook

    注意:这需要直接访问API服务器配置,仅适用于紧急情况。

  2. 直接操作etcd(最后手段):

    # 获取命名空间的etcd key ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ get /registry/namespaces/cattle-system
  3. 使用kubectl的raw模式

    kubectl get --raw /api/v1/namespaces/cattle-system

这些技术需要深厚的Kubernetes内部知识,操作不当可能导致集群不稳定,应谨慎使用。

那次深夜的故障排查教会了我,在云原生运维中,表面问题背后往往隐藏着更深层的机制。理解Kubernetes的准入控制器不仅帮助我解决了眼前的危机,更为后续设计更健壮的系统提供了宝贵经验。现在,每当我看到"Terminating"状态时,不再只是机械地执行删除命令,而是会思考:这背后是什么样的控制机制在起作用?这种深度思考的习惯,或许才是运维工程师最宝贵的财富。

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

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

立即咨询