【问题标题】:Service routing with Ingress on GKE在 GKE 上使用 Ingress 进行服务路由
【发布时间】:2018-02-14 02:04:59
【问题描述】:

我们在 GKE (Google Kubernetes Engine) 上的 Kubernetes 集群中运行多项服务,但在使用 Ingress 配置路由时遇到问题。

假设我们有auth-serviceuser-service,并希望通过以下网址访问它们:http://www.example.com/authhttp://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

在内部,服务在 Tomcat 的 9000 端口上运行,这部分工作正常。

问题在于我们的 Ingress 配置:

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

每当我通过以下方式访问我们的静态 api(我们现在称之为 example.com)时:http://www.example.com/auth,我得到 502 - Bad gateway。运行kubectl describe ingress 表示,我们服务的健康状况是unknown

我正在研究可能导致这种奇怪行为的想法。有人能指出我正确的方向吗?

【问题讨论】:

  • 您确定 /health 路径返回 200 状态码吗?
  • kubectl get pods 表示准备好了

标签: kubernetes google-kubernetes-engine


【解决方案1】:

您在 Slack 上提到服务是 Spring Boot 应用程序。它可能与此无关,但您需要确保入口路径与您的 Spring Boot 应用程序的上下文相匹配,即。 e.如果您的入口路径是/user,则您的应用上下文必须配置为server.context-path=/user。然后可以通过http://user-service/user 访问该服务。

【讨论】:

  • 我们已经尝试添加上下文路径,但它没有做任何事情。有没有办法在不需要关心目标服务中的上下文路径的情况下路由请求?
  • 我认为没有。我们完全按照我的描述进行操作,而且效果很好。
【解决方案2】:

您的健康检查将reflect your readiness probes。运行状况检查需要使用您的 nodePort 端口,因为请求来自负载均衡器。如果您的运行状况检查针对端口 9000,则请求将无法通过,因为节点上的该端口未处于活动状态。

确保您的 LB 健康检查针对正确的端口(在 30000 范围内)并且目标路径将以 200 响应,否则您的健康检查将继续失败,您将继续收到 502 错误

【讨论】:

  • 准备就绪/活跃度是为了部署,所以 Pods AFAIK。查询kubectl get pods 会产生健康的结果。服务是否应该有其他特殊的活动/就绪设置?
  • 你不需要准备一个,但是 GCP 会根据就绪检查为 LB 创建一个健康检查。转到网络服务 > 负载平衡,您将看到基于您的入口创建的 L7LB(默认命名约定是 k8s-um-[NAMESPACE]-[INGRESS_NAME]--#############) .展开它并寻找“健康检查”。单击链接并确保“端口”字段与您的节点端口匹配
  • 嗯,很有趣。我不确定 Port 和 NodePort 必须匹配(Port 将服务与集群一起公开,NodePort 用于外部用户 - 正如文档所说)。如果不匹配会有什么影响?现在一切似乎都正常了 - 正如 Reinhard 指出的那样,问题是 Spring Boot 中的 contextPath 设置和控制台中的标志是绿色的。
  • 服务配置中的端口和节点端口不必匹配。我指的是需要配置到正确端口的 L7LB 健康检查。健康检查没有明确配置,GCP 在你的 Ingress 创建 L7LB 时会做一个,如果端口配置关闭,健康检查会失败,导致 502 错误。
猜你喜欢
  • 2021-07-09
  • 2021-12-03
  • 2019-06-16
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多