Kubernetes GKE上具有入口的服务路由

Kubernetes GKE上具有入口的服务路由,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我们正在GKE(Google Kubernetes引擎)上的Kubernetes集群中运行多个服务,在配置入口路由时遇到问题 假设我们有auth服务和user服务,并且希望通过以下URL访问它们:http://www.example.com/auth和http://www.example.com/user。对这些URL的所有请求都应重定向到正确的服务,并在内部路由(http://www.example.com/user/people->http://user-service/people) 以下

我们正在GKE(Google Kubernetes引擎)上的Kubernetes集群中运行多个服务,在配置入口路由时遇到问题

假设我们有
auth服务
user服务
,并且希望通过以下URL访问它们:
http://www.example.com/auth
http://www.example.com/user
。对这些URL的所有请求都应重定向到正确的服务,并在内部路由(
http://www.example.com/user/people
->
http://user-service/people

以下是我们对身份验证服务的配置:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: api-auth
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: api-auth
        tier: backend
        track: stable
    spec:
      containers:
        - name: api-auth
          image: "<our-image>"
          ports:
            - name: http
              containerPort: 9000
          livenessProbe:
            httpGet:
              path: /health
              port: 9000
            initialDelaySeconds: 180
            timeoutSeconds: 5
          readinessProbe:
            httpGet:
              path: /health
              port: 9000
            initialDelaySeconds: 180
            timeoutSeconds: 5
---
kind: Service
apiVersion: v1
metadata:
  name: auth-service
  labels:
    app: api-auth
spec:
  type: NodePort
  selector:
    app: api-auth
    tier: backend
  ports:
  - port: 80
    targetPort: 9000
apiVersion:apps/v1beta1 种类:部署 元数据: 名称:api auth 规格: 副本:1份 模板: 元数据: 标签: 应用程序:api验证 层:后端 赛道:稳定 规格: 容器: -名称:api auth 图像:“ 端口: -名称:http 集装箱港口:9000 livenessProbe: httpGet: 路径:/health 港口:9000 初始延迟秒数:180 timeoutSeconds:5 readinessProbe: httpGet: 路径:/health 港口:9000 初始延迟秒数:180 timeoutSeconds:5 --- 种类:服务 版本:v1 元数据: 名称:身份验证服务 标签: 应用程序:api验证 规格: 类型:节点端口 选择器: 应用程序:api验证 层:后端 端口: -港口:80 目标港:9000 在内部,服务在端口9000上的Tomcat上运行,这部分工作正常

问题在于我们的入口配置:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: auth-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: <our-static-api>
    kubernetes.io/ingress.class: "gce"
  labels:
    app: api-auth
spec:
  rules:
  - http:
      paths:
      - path: /auth
        backend:
          serviceName: auth-service
          servicePort: 80
      - path: /auth/*
        backend:
          serviceName: auth-service
          servicePort: 80
      - path: /user
        backend:
          serviceName: user-service
          servicePort: 80
      - path: /user/*
        backend:
          serviceName: user-service
          servicePort: 80
种类:入口
apiVersion:extensions/v1beta1
元数据:
名称:auth ingress
注释:
kubernetes.io/ingres.global-static-ip-name:
kubernetes.io/ingres.class:“gce”
标签:
应用程序:api验证
规格:
规则:
-http:
路径:
-路径:/auth
后端:
serviceName:auth服务
服务端口:80
-路径:/auth/*
后端:
serviceName:auth服务
服务端口:80
-路径:/user
后端:
服务名称:用户服务
服务端口:80
-路径:/user/*
后端:
服务名称:用户服务
服务端口:80
每当我以以下方式访问我们的静态api时(现在我们称之为
example.com
):
http://www.example.com/auth
,我得到502-坏网关。运行
kubectl Descripte ingress
表示,我们的服务健康状况
未知


我在想是什么导致了这种奇怪的行为。有人能告诉我正确的方向吗?

你在Slack上提到的服务是Spring Boot应用程序。这可能与此无关,但您需要确保入口路径与Spring Boot应用程序的上下文匹配,即。E如果入口路径为
/user
,则必须使用
服务器配置应用程序上下文。上下文路径=/user
。然后在
http://user-service/user

您在Slack上提到的服务是Spring Boot应用程序。这可能与此无关,但您需要确保入口路径与Spring Boot应用程序的上下文匹配,即。E如果入口路径为
/user
,则必须使用
服务器配置应用程序上下文。上下文路径=/user
。然后在
http://user-service/user

您的健康检查将生效。运行状况检查需要使用节点端口,因为请求来自负载平衡器。如果运行状况检查的目标是端口9000,则请求将无法通过,因为节点上的该端口未处于活动状态

确保LB运行状况检查的目标端口正确(在30000范围内),并且目标路径将响应200,否则您的运行状况检查将继续失败,并且您将继续收到502个错误。运行状况检查需要使用节点端口,因为请求来自负载平衡器。如果运行状况检查的目标是端口9000,则请求将无法通过,因为节点上的该端口未处于活动状态


确保LB运行状况检查的目标端口正确(在30000范围内),并且目标路径将响应200,否则您的运行状况检查将继续失败,您将继续收到502个错误

我们已尝试添加上下文路径,但它没有做任何事。难道没有一种方法可以在不关心目标服务中的上下文路径的情况下路由请求吗?我认为没有。我们完全按照我所描述的那样做,而且很有效。我们已经尝试添加上下文路径,但它没有做任何事情。难道没有一种方法可以在不关心目标服务中的上下文路径的情况下路由请求吗?我认为没有。我们完全按照我所描述的那样做,它可以工作。您确定/health path返回200状态代码吗?
kubectl get pods
表示它们已经准备好了您确定/health path返回200状态代码吗?
kubectl get pods
表示它们已经准备好了部署,所以豆荚很好。查询
kubectl get pods
会产生健康的结果。服务是否应该有其他特殊的活跃度/就绪度设置?您不需要准备,但GCP将根据就绪度检查为LB创建健康检查。转到网络服务>负载平衡,您将看到基于入口创建的L7LB(默认名称约定为k8s um-[NAMESPACE]-[ingress#u name]-[ingress############)。展开它并查找“健康检查”。单击链接,确保“端口”字段与您的节点端口匹配。我不确定端口和NodePort是否必须匹配(端口公开集群中的服务,NodePort用于ou)