Spring boot Kubernetes Ingress gce公开了两个基本的Sping引导服务
我正在尝试部署两个非常基本的服务(Spring Boot),其入口必须根据路径重定向流量。非常基本的Ingress使用示例,但我无法理解为什么这个配置在几个小时之后无法工作 第一个控制器,暴露于端口8095:Spring boot Kubernetes Ingress gce公开了两个基本的Sping引导服务,spring-boot,kubernetes,google-kubernetes-engine,gke-networking,Spring Boot,Kubernetes,Google Kubernetes Engine,Gke Networking,我正在尝试部署两个非常基本的服务(Spring Boot),其入口必须根据路径重定向流量。非常基本的Ingress使用示例,但我无法理解为什么这个配置在几个小时之后无法工作 第一个控制器,暴露于端口8095: @RestController public class MainController { private Logger logger = LoggerFactory.getLogger(MainController.class); @GetMapping({"
@RestController
public class MainController {
private Logger logger = LoggerFactory.getLogger(MainController.class);
@GetMapping({"/", ""})
public String getDefault(HttpServletRequest request) {
logger.debug("URL: ", makeUrl(request));
return "Root reached: " + makeUrl(request);
}
@GetMapping("/foo")
public String getSubPath(HttpServletRequest request){
logger.debug("URL: ", makeUrl(request));
return "First sub path reached: " + makeUrl(request);
}
@GetMapping("/foo/test")
public String getSubSubPath(HttpServletRequest request){
logger.debug("URL: ", makeUrl(request));
return "First sub sub path reached: " + makeUrl(request);
}
@GetMapping("/foo/health/check")
public String getHealthCheck(HttpServletRequest request) {
return "Health check passed: " + makeUrl(request);
}
private String makeUrl(HttpServletRequest request) {
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
}
第二个控制器,暴露于端口8080:
@RestController
public class MainController {
private Logger logger = LoggerFactory.getLogger(MainController.class);
@GetMapping({"/bar/", "/bar"})
public String getDefault(HttpServletRequest request) {
logger.debug("URL: ", makeUrl(request));
return "Root reached: " + makeUrl(request);
}
@GetMapping("/bar/test")
public String getSubPath(HttpServletRequest request){
logger.debug("URL: ", makeUrl(request));
return "First sub path reached: " + makeUrl(request);
}
@GetMapping("/bar/test/subsubpath")
public String getSubSubPath(HttpServletRequest request){
logger.debug("URL: ", makeUrl(request));
return "First sub sub path reached: " + makeUrl(request);
}
@GetMapping("/bar/health/check")
public String getHealthCheck(HttpServletRequest request) {
return "Health check 2 passed: " + makeUrl(request);
}
private String makeUrl(HttpServletRequest request) {
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
}
正如我们所看到的,控制器的端点只是打印一些消息和URL,只是为了知道它们是从存在入口的集群外部到达的
kubernetes的部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: prova1-deployment
spec:
selector:
matchLabels:
app: deploy1
replicas: 1
template:
metadata:
labels:
app: deploy1
spec:
imagePullSecrets:
- name: gitlab-registry-prova
containers:
- name: prova1-deploy
image: "registry.gitlab.com/giuxg97/reep/test1-deploy"
ports:
- containerPort: 8095
---
apiVersion: v1
kind: Service
metadata:
name: prova1-service
spec:
selector:
app: deploy1
ports:
- protocol: TCP
port: 60000
targetPort: 8095
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prova2-deployment
spec:
selector:
matchLabels:
app: deploy2
replicas: 1
template:
metadata:
labels:
app: deploy2
spec:
imagePullSecrets:
- name: gitlab-registry-prova
containers:
- name: prova2-deploy
image: "registry.gitlab.com/giuxg97/reep/test2-deploy"
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: prova2-service
spec:
selector:
app: deploy2
ports:
- protocol: TCP
port: 8090
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
# If the class annotation is not specified it defaults to "gce".
kubernetes.io/ingress.class: "gce"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prova1-service
port:
number: 60000
- path: /bar
pathType: Prefix
backend:
service:
name: prova2-service
port:
number: 8090
这些图像是从我在gitlab上的私有容器注册表中获取的,它们的工作方式与我在部署后从pod的日志中看到的一样
现在的情况是:
- 如果我转到IP_INGRESS/它会将我重定向到正确的页面,并显示“Root已到达:…”,但如果我转到IP_INGRESS/foo,我会收到错误“response 404(backend NotFound),路径的服务规则不存在”,这似乎是入口找不到路径时抛出的错误消息(即,如果我转到IP_入口/test1234,我会得到相同的错误)
- 如果我转到IP_入口/bar,我会收到另一条错误消息“error:Server error 服务器遇到临时错误,无法完成您的请求。 请在30秒后重试。”并且pod没有新日志
希望您能帮助我!提前谢谢您,欢迎来到Stackoverflow 第一期- 入口定义创建了从{path}到{backend.serviceName}{path}的代理流量规则。 找不到路径的一个可能原因是/foo被代理到app service:60000/foo,但您打算在“/”根目录上提供流量 尝试将此批注添加到入口资源:
nginx.ingress.kubernetes.io/rewrite-target: /
资料来源:
如果这不能解决问题,那么问题很可能出现在spring框架中“/foo”和其他子路径的处理程序方法中
第二期-
使用Curl命令(Curl-D--s-o/dev/null)
检查您是否能够在内部(不通过入口)使用后端上的节点ip访问特定的URL(在那里您得到错误的响应)
如果您无法在内部访问URL,那么问题应该再次在于spring框架中的映射配置
如果您能够在内部访问URL,请检查在部署文件中为kubernetes创建的服务。
您还可以尝试更改问题部署的部署端口和服务端口
有关GKE部署文件配置的详细说明,请参阅此处-