使用Ocelot Kubernetes Provider 17.0.0出现UnableToFindServiceDiscoveryProviderError报错
这个报错是Ocelot无法加载Kubernetes服务发现提供器导致的,按以下顺序排查即可解决:
- 确认已安装K8s服务发现扩展包
检查项目是否安装了Ocelot.Provider.KubernetesNuGet包,需保证该包版本和你使用的Ocelot主包版本完全一致,未安装则先补充安装。 - 检查服务注册代码
启动类的服务注册逻辑中必须显式启用K8s服务发现,示例代码如下:
builder.Services.AddOcelot() .AddKubernetes();
漏写该配置的情况下,即使配置文件内容正确也无法加载对应服务发现提供器。
- 补全配置文件缺失字段
你当前的服务发现配置缺少必填参数,需要补充K8s服务所在的命名空间等信息,修正后的GlobalConfiguration参考:
"GlobalConfiguration": { "ServiceDiscoveryProvider": { "Type": "KubernetesServiceDiscoveryProvider", "Namespace": "your-service-namespace", // 替换为下游服务所在的K8s命名空间 "PollingInterval": 1000 // 可选参数,服务列表刷新间隔,单位为毫秒 } }
如果是在K8s集群外调试Ocelot,还需要额外补充Host、Port、AccessToken等参数指定K8s apiserver的连接信息。
- 确认K8s资源权限
Ocelot运行的Pod关联的ServiceAccount需要有查询服务和端点的权限,可部署如下RBAC规则:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ocelot-service-reader namespace: your-service-namespace # 和下游服务命名空间保持一致 rules: - apiGroups: [""] resources: ["services", "endpoints"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ocelot-read-service namespace: your-service-namespace subjects: - kind: ServiceAccount name: your-ocelot-service-account # 替换为Ocelot Pod使用的ServiceAccount名称 roleRef: kind: Role name: ocelot-service-reader apiGroup: rbac.authorization.k8s.io
- 校验服务名正确性
确认你配置的ServiceName字段值productshttpaggegator和K8s中对应Service的metadata.name完全一致,无拼写错误。如果目标服务不在上面配置的Namespace下,需要写成服务名.命名空间的格式。
排查完成后重启Ocelot服务即可解决该报错。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

