此功能是问题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" ]
}
]
}