Kubernetes入口路径仅适用于/

SME*_*SME 4 kubernetes

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

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

/*
/servicea
/servicea/
/servicea/*
Run Code Online (Sandbox Code Playgroud)

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

- 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
Run Code Online (Sandbox Code Playgroud)

这是我的节点端口服务

- apiVersion: v1
  kind: Service
  metadata:
    name: servicea-nodeport
  spec:
    type: NodePort
    ports:
    - port: 80
      targetPort: 8081
      nodePort: 30124
    selector:
      app: servicea
Run Code Online (Sandbox Code Playgroud)

这是我的部署

- 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  
Run Code Online (Sandbox Code Playgroud)

如果路径为/,那么我可以执行此操作http://my.url.com/api/ping, 但由于我将有多种服务,因此我想执行以下操作:http : //my.url.com/servicea/api/ ping,但是当我将路径设置为/ servicea时,我得到了404。

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

任何的想法?

Jos*_*sto 6

您使用的不是 kubernetes Pod,因为它们是要使用的。一个豆荚

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

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

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

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

一旦你的Deployments跑步,你会创建一个不同的Service,将所有的之间平衡流量Pod■对于给定的Deployment

最后,您要命中serviceaserviceb取决于请求 URL。这可以用 来完成Ingress,就像您尝试的那样,但是将每个路径映射到不同的服务。例如

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
Run Code Online (Sandbox Code Playgroud)

这样,使用 /servicea 路径进入入口控制器的请求将由服务背后的 Pod 提供servicea服务。使用 /serviceb 路径进入入口控制器的请求将由serviceb服务背后的 Pod 提供服务。


SME*_*SME 5

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