此功能是问题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" ]
}
]
}
本文介绍如何在Ocelot中集成Kubernetes支持,包括安装NuGet包、配置服务发现提供者及设置路由,以实现对Kubernetes服务的负载均衡。
948

被折叠的 条评论
为什么被折叠?



