Kubebuilder自定义K8s Controller部署遇资源锁获取I/O超时错误
Kubebuilder自定义Controller部署到Docker Desktop K8s集群的Leader选举超时问题
问题场景
- 基于Kubebuilder构建的自定义Controller,本地执行
make run时功能正常 - 执行
make docker-build custom-controller:0.1.0和make deploy custom-controller:0.1.0完成部署,命名空间、Controller Pod均成功创建 - Pod日志出现Leader选举超时错误,无法访问集群kubernetes服务的ClusterIP(10.96.0.1:443)
错误日志
2024-03-26T13:49:16Z INFO setup starting manager 2024-03-26T13:49:16Z INFO starting server {"kind": "health probe", "addr": "[::]:8081"} 2024-03-26T13:49:16Z INFO controller-runtime.metrics Starting metrics server 2024-03-26T13:49:16Z INFO controller-runtime.metrics Serving metrics server {"bindAddress": "127.0.0.1:8080", "secure": false} I0326 13:49:16.092772 1 leaderelection.go:250] attempting to acquire leader lease vault-system/9737ddd2.ivzdso... E0326 13:49:46.093895 1 leaderelection.go:332] error retrieving resource lock vault-system/9737ddd2.ivzdso: Get "https://10.96.0.1:443/apis/coordination.k8s.io/v1/namespaces/vault-system/leases/9737ddd2.ivzdso": dial tcp 10.96.0.1:443: i/o timeout E0326 13:50:18.973156 1 leaderelection.go:332] error retrieving resource lock vault-system/9737ddd2.ivzdso: Get "https://10.96.0.1:443/apis/coordination.k8s.io/v1/namespaces/vault-system/leases/9737ddd2.ivzdso": dial tcp 10.96.0.1:443: i/o timeout
原因分析
- 集群内部网络异常:Docker Desktop的K8s集群偶尔会出现CNI网络路由故障,导致Pod无法访问集群内部的ClusterIP服务(比如kubernetes服务)。本地
make run通过主机kubeconfig直接连接API Server,不受集群内部网络影响,所以能正常运行。 - RBAC权限缺失(低概率):如果Controller的RBAC规则未配置
coordination.k8s.io/leases资源的相关权限,理论上会返回权限错误而非超时,但仍可作为排查点。 - 主机网络干扰:主机的VPN、代理、防火墙规则可能拦截了K8s集群内部的流量,导致Pod无法路由到ClusterIP网段。
解决办法
- 重启Docker Desktop K8s集群:打开Docker Desktop设置→Kubernetes,先禁用再启用集群,等待集群完全重启后重新部署Controller,这是最快速的修复方式。
- 验证Pod内部网络连通性:进入Controller Pod执行网络测试:
如果无法连通,确认集群网络故障,优先重启集群。kubectl exec -it <controller-pod-name> -n vault-system -- sh curl -v https://10.96.0.1:443/healthz - 检查RBAC权限配置:查看Controller对应的ClusterRole,确认包含
coordination.k8s.io/leases资源的权限:
如果权限缺失,修改kubectl describe clusterrole <controller-clusterrole-name> -n vault-systemconfig/rbac/rbac.yaml中的规则,添加以下权限后重新部署:- apiGroups: ["coordination.k8s.io"] resources: ["leases"] verbs: ["get", "list", "create", "update", "delete"] - 排查主机网络干扰:关闭主机的VPN、代理软件,检查防火墙是否允许K8s集群网段(默认
10.96.0.0/12、192.168.49.0/24)的内部流量。
内容的提问来源于stack exchange,提问作者iwrestledthebeartwice
相关产品推荐
相关产品推荐

