此功能是问题345的一部分。 添加对kubernetes提供商的支持。

Ocelot将在给定的命名空间中调用k8s端点API,以获取pod的所有端点,然后在它们之间进行负载平衡。 Ocelot曾经使用服务api将请求发送到k8s服务,但是在PR 1134中对此进行了更改,因为该服务未达到预期的负载平衡。

您需要做的第一件事是安装在Ocelot中提供kubernetes支持的NuGet软件包。

Install-Package Ocelot.Provider.Kubernetes

然后将以下内容添加到您的ConfigureServices方法中。

s.AddOcelot()
 .AddKubernetes();

如果您在kubernetes中部署了服务,则通常将使用命名服务来访问它们。 默认usePodServiceAccount = True,这意味着使用Pod来访问k8s集群服务的ServiceAccount必须是基于RBAC授权的ServiceAccount

您可以复制许可的。 使用RBAC角色绑定。 许可的RBAC权限k8s api服务器和令牌将从pod中读取。

kubectl create clusterrolebinding permissive-binding –clusterrole=cluster-admin –user=admin –user=kubelet –group=system:serviceaccounts

以下示例显示了如何设置将在kubernetes中运行的路由。 最重要的是ServiceName,它由kubernetes服务名称组成。 我们还需要在GlobalConfiguration中设置ServiceDiscoveryProvider。 此处的示例显示了典型配置。
假设kubernetes api服务器在192.168.0.13上运行,并且api服务在端口443上。

  {
"ReRoutes": [
  {
    "DownstreamPathTemplate": "/api/values",
    "DownstreamScheme": "http",
    "UpstreamPathTemplate": "/values",
    "ServiceName": "downstreamservice",
    "UpstreamHttpMethod": [ "Get" ]
  }
],
"GlobalConfiguration": {
  "ServiceDiscoveryProvider": {
    "Host": "192.168.0.13",
    "Port": 443,
    "Token": "txpc696iUhbVoudg164r93CxDTrKRVWG",
    "Namespace": "dev",
    "Type": "kube"
  }
}
}

Namespace Dev中部署服务,ServiceDiscoveryProvider类型为kube,也可以设置pollkube ServiceDiscoveryProvider类型。
注意:主机,端口和令牌已不再使用。

您可以使用Ocelot轮询kubernetes以获得最新的服务信息,而不是根据每个请求。 如果要轮询kubernetes的最新服务而不是按请求轮询(默认行为),则需要设置以下配置。

“ServiceDiscoveryProvider”: {
“Host”:192.168.0.13,
“Port”: 443, 
“Token”: “txpc696iUhbVoudg164r93CxDTrKRVWG”, 
“Namespace”: “dev”, 
“Type”: “pollkube”, 
“PollingInterval”: 100
}

轮询间隔以毫秒为单位,告诉Ocelot多久调用一次kubernetes来更改服务配置。

请注意,这里需要权衡。 如果对kubernetes进行轮询,则Ocelot可能会根据轮询间隔不知道服务是否关闭,并且与每个请求获得最新服务相比,您可能会遇到更多错误。 这实际上取决于您的服务的不稳定程度。 我怀疑这对大多数人来说是否重要,而轮询可能会比按请求调用kubernetes带来微小的性能提升。 Ocelot无法为您解决这些问题。

如果下游服务位于其他名称空间中,则可以通过指定ServiceNamespace在路由级别覆盖全局设置。

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/values",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/values",
      "ServiceName": "downstreamservice",
      "ServiceNamespace": "downstream-namespace",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ]
}
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐