我正在使用Spring Cloud Kubernetes Spring Cloud Gateway(SCG),在GKE上部署我的应用程序时遇到了一些麻烦。SCG找不到k8s服务,我仍然收到此错误:
There was an unexpected error (type=Service Unavailable, status=503).
Unable to find instance for uiservice
uiservice
是Angular应用程序。
当我看一下<代码>/执行器/网关/路由我得到以下结果:
[
{
"route_id": "CompositeDiscoveryClient_gateway",
"route_definition": {
"id": "CompositeDiscoveryClient_gateway",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/gateway/**"
}
}
],
"filters": [
{
"name": "RewritePath",
"args": {
"regexp": "/gateway/(?<remaining>.*)",
"replacement": "/${remaining}"
}
}
],
"uri": "lb://gateway",
"order": 0
},
"order": 0
},
{
"route_id": "CompositeDiscoveryClient_uiservice",
"route_definition": {
"id": "CompositeDiscoveryClient_uiservice",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/uiservice/**"
}
}
],
"filters": [
{
"name": "RewritePath",
"args": {
"regexp": "/uiservice/(?<remaining>.*)",
"replacement": "/${remaining}"
}
}
],
"uri": "lb://uiservice",
"order": 0
},
"order": 0
},
{
"route_id": "uiservice_route",
"route_definition": {
"id": "uiservice_route",
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/*"
}
}
],
"filters": [],
"uri": "lb://uiservice",
"order": 0
},
"order": 0
},
....
]
请注意,服务被很好地发现,因为:"route_id":"CompositeDiscoveryClient_gateway"
和"route_id":"CompositeDiscoveryClient_uiservice"
,这些路线不是我的(我没有定义它们)。
我看了这篇文章:如何设置Spring云网关应用程序,以便它可以使用Spring云Kubernetes的服务发现?没有成功。
我的配置:
spring:
profiles:
active: prod
cloud:
kubernetes:
reload:
enabled: true
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: uiservice
allowedMethods: "*"
allowCredentials: true
maxAge: 7200
allowedHeaders: "*"
exposedHeaders:
- "Access-Control-Allow-Origin"
- "Access-Control-Allow-Methods"
- "Access-Control-Max-Age"
- "Access-Control-Allow-Headers"
- "Cache-Control"
- "Authorization"
- "Content-Type"
routes:
#======UISERVICE========
- id: uiservice_route
uri: lb://uiservice
predicates:
- Path=/* #default route
- id: uiservice_route_assets
uri: lb://uiservice
predicates:
- Path=/assets/**
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
restart:
enabled: true
另外,如何禁用网关自动发现?我不想要"route_id":"CompositeDiscoveryClient_gateway"
依赖项:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-all</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
多谢你的帮忙
应该是这样的:
spring:
application.name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
url-expression: "'http://'+serviceId+':'+getPort()"
lower-case-service-id: true
调用时<代码>http://gateway/my-service-name/api/etc,然后如果kubernetes中存在服务,则将调用我的服务名称/api/etc
所以你需要确保有这样的服务:
apiVersion: v1
kind: Service
metadata:
name: my-service-name
namespace: default
labels:
app: my-service-name
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30080
selector:
app: my-service-name
设置以下属性
spring:
cloud:
gateway:
discovery:
locator:
enabled: false
在失去一个下午后,我终于找到了解决办法。我认为在使用Ribbon时存在服务发现问题。我使用k8s dns服务发现,而不是依赖Ribbon,因此我的新配置是:
routes:
- id: uiservice_route
uri: http://uiservice:4200 # switch 'lb://' to 'http://'
predicates:
- Path=/*
K8s uiservice配置:
apiVersion: v1
kind: Service
metadata:
name: uiservice
spec:
sessionAffinity: ClientIP
selector:
app: uiservice
ports:
- name: http
port: 4200
targetPort: ui-port
出现了一个新的问题:既然k8s服务本身就是这样做的,为什么要使用Ribbon来负载平衡请求?
我是Kubernetes平台的新手,尝试启用部署在Kubernetes平台上的tomcat web app的HTTPS安全连接。我对舱单感到困惑。与部署、服务和入口控制器相关的yml。 那么,我是否也必须在部署(在端口:-containerPort:8080)服务(如端口:-端口:80 targetPort:8080协议:TCP名称:http)和入口(在后端:serviceName:tomcat
我在aws上创建了一个简单的EKS集群,如https://github.com/terraform-providers/terraform-provider-aws/tree/master/examples/eks-getting-started.所述 我在这个集群中创建了一个nginx部署和一个Loadbalancer类型的服务,如下所述。该配置在minikube上本地工作。 在AWS上,我可以
我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url
我在windows 10中创建了两个在我的minikube环境中运行的POD。一个POD带有Spring boot应用程序容器,另一个POD带有mysql容器。对于Spring boot应用程序,服务类型为nodePort,对于MYSQL pod,服务类型为club sterIP。这意味着Mysql pod只需要在集群内部进行通信。但是对于Spring boot应用程序,需要从浏览器访问,所以我配
最近,我用Nginx Ingres控制器在k8s集群中构建了几个微服务,它们工作正常。 在处理微服务之间的通信时,我尝试了gRPC并成功了。然后我发现当微服务A- 后来,我对istio产生了兴趣。我已成功将其部署到群集。但是,我观察到它总是创建自己的负载均衡器,这与现有的Nginx入口控制器不匹配。 此外,我尝试了prometheus和grafana以及k9s。这些工具让我对pod的cpu和内存使
我希望能够使用 Jenkins 执行的 Helm 图表(作为构建周期的一部分)自动部署到我的 Kubernetes 集群。詹金斯机器位于与 Kubernetes 集群不同的网络上(而不是许多博客中记录的它的一部分)。 我有一个托管在私人GitHub帐户中的图表存储库。我遵循以下过程:https://hackernoon.com/using-a-private-github-repo-as-helm