Spring Cloud Kubernetes配置报错:DiscoveryServerUrlInvalidException求助
解决Spring Cloud Kubernetes Discovery Server配置及健康检查问题
一、修复DiscoveryServerUrlInvalidException错误
这个错误的核心原因是spring.cloud.kubernetes.discovery-server-url配置值不符合URL规范,或者指向的服务不可达。
正确的配置格式:必须包含完整的协议头(
http://或https://),以及服务的完整Kubernetes内部域名和端口。示例配置:spring: cloud: kubernetes: discovery: server-url: "http://spring-cloud-kubernetes-discoveryserver.default.svc:8080"说明:
default是Discovery Server部署所在的命名空间,请根据实际部署的命名空间替换8080是官方镜像springcloud/spring-cloud-kubernetes-discoveryserver:3.1.1默认暴露的端口,可通过kubectl describe deployment spring-cloud-kubernetes-discoveryserver命令确认容器实际端口
验证服务可用性:在集群内任意Pod中执行
curl http://spring-cloud-kubernetes-discoveryserver.default.svc:8080,确认服务能正常响应,排除服务未就绪或DNS解析失败的问题。
二、解决KubernetesClientHealthIndicator健康检查失败问题
io.kubernetes.client.openapi.ApiException通常是应用的ServiceAccount权限不足,或者Kubernetes客户端配置异常导致的。
配置正确的ServiceAccount权限:
- 创建ServiceAccount(如果未存在):
kubectl create sa spring-cloud-kubernetes-sa -n default - 创建Role,赋予必要的K8s API访问权限:
执行命令创建:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: spring-cloud-kubernetes-role namespace: default rules: - apiGroups: [""] resources: ["pods", "services", "endpoints"] verbs: ["get", "list", "watch"]kubectl apply -f role.yaml - 绑定Role和ServiceAccount:
执行命令创建:apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: spring-cloud-kubernetes-rolebinding namespace: default subjects: - kind: ServiceAccount name: spring-cloud-kubernetes-sa namespace: default roleRef: kind: Role name: spring-cloud-kubernetes-role apiGroup: rbac.authorization.k8s.iokubectl apply -f rolebinding.yaml - 在应用的Deployment中指定该ServiceAccount:
spec: template: spec: serviceAccountName: spring-cloud-kubernetes-sa
- 创建ServiceAccount(如果未存在):
确保版本兼容性:应用使用的Spring Cloud Kubernetes版本必须和Discovery Server的版本(3.1.1)保持一致,避免因API版本不匹配导致的调用失败。
集群内部署无需手动配置K8s API地址:Spring Cloud Kubernetes会自动使用集群内默认的API地址
https://kubernetes.default.svc,无需额外配置master-url等参数,除非你的集群有特殊网络配置。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

