Kubernetes Ingress Path仅适用于/

时间:2018-01-16 14:25:23

标签: kubernetes

我已经配置了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

这是我的nodeport服务

- 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

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

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

  

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

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

  

Pod表示部署单位:Kubernetes中的单个应用程序实例,可能包含单个容器或少量紧密耦合且共享资源的容器。

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

运行Deployments后,您需要创建一个不同的Service来平衡给定Pod的所有Deployment之间的流量。< / p>

最后,您要点击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提供。

答案 1 :(得分:4)

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