【问题标题】:Kubernetes Ingress Path only works with /Kubernetes 入口路径仅适用于 /
【发布时间】:2020-06-23 23:19:27
【问题描述】:

我已经配置了一个 kubernetes 入口服务,但是它只在路径为 / 时才有效

我已经为路径尝试了各种不同的值,包括:

/*
/servicea
/servicea/
/servicea/*

这是我的入口配置(有效)

- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: boardingservice
    annotations:
      ingress.kubernetes.io/rewrite-target: /
  spec:
    rules:
    - host: my.url.com
      http:
        paths:
        - path: /
          backend:
            serviceName: servicea-nodeport
            servicePort: 80

这是我的节点端口服务

- apiVersion: v1
  kind: Service
  metadata:
    name: servicea-nodeport
  spec:
    type: NodePort
    ports:
    - port: 80
      targetPort: 8081
      nodePort: 30124
    selector:
      app: servicea

这是我的部署

- apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
    name: servicea
  spec:
    replicas: 1
    template:
      metadata:
        name: ervicea
        labels:
          app: servicea
      spec: 
        containers:
        - image: 350329402011.dkr.ecr.eu-west-2.amazonaws.com/servicea
          name: servicea
          ports: 
          - containerPort: 8080
            protocol: TCP              
        - image: 350329402011.dkr.ecr.eu-west-2.amazonaws.com/serviceb
          name: serviceab
          ports: 
          - containerPort: 8081
            protocol: TCP  

如果路径是 / 那么我可以这样做http://my.url.com/api/ping 但由于我将拥有多项服务,因此我想这样做:http://my.url.com/servicea/api/ping 但是当我将路径设置为 /servicea 时,我得到一个 404。

我在 AWS 上使用 ingress-nginx 入口控制器运行 kubernetes

有什么想法吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    您使用的不是 kubernetes Pod,因为它们是打算使用的。 A Pod

    它包含一个或多个相对紧密耦合的应用程序容器——在容器前的世界中,它们将在同一物理或虚拟机上执行。

    如果您有两个应用程序,serviceaserviceb,它们应该在不同的 Pod 上运行:一个用于 servicea,另一个用于 serviceb。这有很多好处:您可以单独部署它们,独立扩展它们等。 作为docs say

    Pod 代表一个部署单元:Kubernetes 中应用程序的单个实例,它可能由单个容器或少数紧密耦合并共享资源的容器组成。

    可以使用 Deployments 创建这些 Pod,就像您已经在做的那样。这很好,值得推荐。

    一旦Deployments 运行,您将创建一个不同的Service,以平衡给定Deployment 的所有Pods 之间的流量。

    最后,您希望根据请求 URL 访问 serviceaserviceb。这可以使用Ingress 来完成,就像您尝试的那样,但是mapping each path to different services。例如

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test
      annotations:
        ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: my.url.com
        http:
          paths:
          - path: /servicea
            backend:
              serviceName: servicea
              servicePort: 80
          - path: /serviceb
            backend:
              serviceName: serviceb
              servicePort: 80
    

    这样,使用 /servicea 路径发送到入口控制器的请求将由 servicea 服务后面的 Pod 处理。使用 /serviceb 路径发送到入口控制器的请求将由 serviceb 服务后面的 Pod 处理。

    【讨论】:

    • 感谢您的回复。你是对的,我没有以推荐的方式使用容器,但在这种情况下,容器代表一个必须一起缩放并且需要一起运行的整体。碰巧的是,我遇到的错误不是我的 Kubernetes 配置,而是我的应用程序,我花了一段时间才弄明白。
    【解决方案2】:

    对于阅读本文的任何人,我的配置都是正确的(尽管正如 fiunchinho 所指出的那样非正统),错误出现在我的 Spring Boot 应用程序中,这些应用程序在容器中运行。我需要更改上下文路径以匹配 Ingress 路径 - 当然,我可以更改 Spring Controller 中的 @GetMapping 和 @PostMapping 方法,但我选择更改上下文路径。

    【讨论】:

    • “错误出现在我的 Spring Boot 中”如果我尝试连接到不是我的应用程序怎么办?如何修改根路径?
    猜你喜欢
    • 2017-12-24
    • 2021-05-23
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2018-11-29
    相关资源
    最近更新 更多