Ocelot api网关-kubernetes-错误:“;命名空间:serviceservice:managementservice无法使用,它无效。地址必须仅包含主机…”;

Ocelot api网关-kubernetes-错误:“;命名空间:serviceservice:managementservice无法使用,它无效。地址必须仅包含主机…”;,kubernetes,.net-5,ocelot,Kubernetes,.net 5,Ocelot,我面临的问题是ocelot KubernetServiceDiscoverProvider似乎在kubernetes的名称空间中找不到其他服务。我的目标是使用api网关调用同一命名空间中其他服务中的api。我当前收到一个http 404未找到错误。和api网关pod,记录以下内容: Ocelot.Provider.Kubernetes.KubernetesServiceDiscoveryProvider[0] requestId:0HM93C93DL2T0:00000003,previousRe

我面临的问题是ocelot KubernetServiceDiscoverProvider似乎在kubernetes的名称空间中找不到其他服务。我的目标是使用api网关调用同一命名空间中其他服务中的api。我当前收到一个http 404未找到错误。和api网关pod,记录以下内容:

Ocelot.Provider.Kubernetes.KubernetesServiceDiscoveryProvider[0] requestId:0HM93C93DL2T0:00000003,previousRequestId:没有以前的请求id,消息:命名空间:serviceservice:managementservice无法使用,它无效。地址必须仅包含主机,例如本地主机和端口必须大于0

警告:Ocelot.Responder.Middleware.ResponderMiddleware[0] requestId:0HM93C93DL2T0:00000003,previousRequestId:没有以前的请求id,消息:错误代码:ServicesReemptyerror消息:在ResponderMiddle软件中未找到NoLoadBalancer错误中的任何服务。为请求路径设置错误响应:/api/management/User/3910,请求方法:GET

我怀疑我配置错了什么。我第一次尝试使用Ocelot文档,关于kubernetes,但是文档已经过时了。(一个例子是sugest值不适用于此github问题的更多信息的类型)

然后我继续在线搜索github问题、堆栈溢出帖子甚至源代码。但我看不出我的配置中缺少什么

我现在有kubernetes在本地运行,还有minikube。我在网上看到的唯一一件事是其他人错误地配置了ocelot.json。但我看不出我在配置中做了什么错误

(在kubernetes上试用ocelot之前,我首先在本地主机上试用,看看它是否有效,并看看它缺少什么。它显然缺少一个中间件,可以用不同的角色控制jwt,并有权访问端点。我现在自己编写了中间件,它在ocelot的本地主机配置上工作)

对于kubernetes,我的ocelot.json配置文件如下所示:

{
“路线”:[
{
“UpstreamPathTemplate”:“/api/management/User/{everything}”,
“上游TTP方法”:[“发布”、“放置”、“获取”],
“DownstreamPathTemplate”:“/api/management/User/{everything}”,
“下游模式”:“http”,
“服务名称”:“管理服务”,
“身份验证选项”:{
“AuthenticationProviderKey”:“持有者”,
“允许的范围”:[“公司ID”http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" ]
},
“RouteClaimsRequirement”:{“角色”:“1,2,3”},
“AddHeadersToRequest”:{
“公司ID”:“索赔[公司ID]>价值”,
“UserId”:“声明”[http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier]>价值“
}
}
],
“全球配置”:{
“ServiceDiscoveryProvider”:{
“主机”:“127.0.0.1”,
“端口”:8083,
“命名空间”:“服务”,
“类型”:“KubernetesServiceDiscoveryProvider”
}
}
}
我的startup.cs ConfigureServices方法如下所示

public void配置服务(IServiceCollection服务)
{
services.AddCors(c=>
{
c、 AddPolicy(“AllowOrigin”,options=>options.WithOrigins(配置[“Cors:AllowOrigins”]))
.AllowAnyHeader()
.AllowKeyMethod().AllowCredentials());
});
#区域身份验证设置
TokenValidationParameters TokenValidationParameters=新的TokenValidationParameters
{
ValidateSuersigningKey=true,
IssuerSigningKey=new-SymmetricSecurityKey(Encoding.ASCII.GetBytes(配置[“Jwt:Key”]),
validateisuer=false,
ValidateAudience=false,
ValidateLifetime=true,
时钟偏移=时间跨度0
};
services.AddSingleton(令牌验证参数);
services.AddAuthentication(
x=>
{
x、 DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
x、 DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
}
)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,x=>
{
x、 RequireHttpsMetadata=false;
x、 SaveToken=true;
x、 TokenValidationParameters=TokenValidationParameters;
});
#端区
//还有代码吗
services.AddOcelot().AddKubernetes();
}
我的startup.cs配置方法如下所示

public void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境)
{
//还有代码吗
app.UseOcelot(配置);
}
我的program.cs CreateHostBuilder方法如下所示

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext,config)=>
{
config.AddJsonFile(“secrets/appsettings.kubernetes.json”,可选:true)
.AddJsonFile(“ocelot.json”);
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});

事实证明,我遇到的真正问题是kubernetes中的权限。ocelot文档也提到了这一点。但文档中的命令不正确(很可能已过时)

这是我使用的命令。请注意,kubernetes文档强烈反对使用此命令。但这至少是一种解决问题的方法
kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --user=admin --user=kubelet --group=system:serviceaccounts