Rancher v2.7.5集群导入翻车实录:cattle-system卡在Terminating,我是如何一步步救回来的
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利用这些机制来实现多种功能,包括:
- 命名空间创建时的自动配置
- 资源格式验证
- 安全策略强制执行
- 多租户隔离保障
当这些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 5h50m3.2 识别问题webhook
通过describe命令查看具体配置:
kubectl describe ValidatingWebhookConfiguration rancher.cattle.io在输出中,特别注意以下字段:
rules: 定义了哪些操作会触发webhookclientConfig: 指定了webhook服务的地址failurePolicy: 决定了webhook失败时的行为(Fail或Ignore)
3.3 关键修复操作
当确认webhook服务确实不可用后,执行以下关键步骤:
- 删除有问题的webhook配置:
kubectl delete MutatingWebhookConfiguration rancher.cattle.io kubectl delete ValidatingWebhookConfiguration rancher.cattle.io- 清理finalizers并强制删除卡住的命名空间:
kubectl patch namespace cattle-system -p '{"metadata":{"finalizers":[]}}' --type='merge' kubectl delete namespace cattle-system --grace-period=0 --force- 重新创建命名空间:
kubectl create ns cattle-system4. 预防措施与最佳实践
经历过这次故障后,我总结了几条关键经验:
操作前备份关键配置:
kubectl get MutatingWebhookConfiguration,ValidatingWebhookConfiguration -o yaml > webhooks-backup.yaml理解webhook的failurePolicy:
Fail:webhook调用失败会导致操作失败Ignore:webhook调用失败会被忽略,操作继续
关键操作检查清单:
操作类型 前检查项 后验证项 集群导入 网络连通性
DNS解析正常
证书有效命名空间状态
Pod运行状态
Webhook服务可达大规模删除 资源依赖关系
Finalizers存在情况资源实际删除状态
系统日志监控监控webhook服务健康状态:
- 定期检查webhook endpoint可达性
- 设置适当的超时时间(避免默认的10s太长)
- 监控webhook调用的延迟和错误率
5. 深入理解Rancher的webhook架构
Rancher使用webhook实现的核心功能包括:
全局资源验证:
- 确保集群配置符合Rancher策略
- 实施多租户隔离规则
- 验证自定义资源(CRD)的合法性
自动化配置注入:
- 为命名空间自动添加标签和注解
- 注入默认的资源配额和限制
- 设置网络策略基础规则
安全策略执行:
- 镜像来源验证
- 权限提升预防
- 敏感操作审计
这种架构虽然强大,但也带来了复杂性。当webhook服务不可用时,可能会影响集群的基本操作能力。因此,在设计类似系统时,需要考虑:
- 关键webhook服务的冗余部署
- 优雅降级机制
- 更精细的failurePolicy配置
6. 高级故障排查技巧
当基本解决方案无效时,可以尝试以下高级技巧:
临时修改API服务器参数:
# 临时禁用特定的准入控制器 kube-apiserver --disable-admission-plugins=MutatingAdmissionWebhook,ValidatingAdmissionWebhook注意:这需要直接访问API服务器配置,仅适用于紧急情况。
直接操作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使用kubectl的raw模式:
kubectl get --raw /api/v1/namespaces/cattle-system
这些技术需要深厚的Kubernetes内部知识,操作不当可能导致集群不稳定,应谨慎使用。
那次深夜的故障排查教会了我,在云原生运维中,表面问题背后往往隐藏着更深层的机制。理解Kubernetes的准入控制器不仅帮助我解决了眼前的危机,更为后续设计更健壮的系统提供了宝贵经验。现在,每当我看到"Terminating"状态时,不再只是机械地执行删除命令,而是会思考:这背后是什么样的控制机制在起作用?这种深度思考的习惯,或许才是运维工程师最宝贵的财富。
