kubernetes - 具有多个后端服务的 GKE Ingress 返回 404

标签 kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress

我正在尝试创建一个基于路径指向两个不同后端服务的 GKE Ingress。我看过一些帖子解释说这只能通过 nginx Ingress 实现,因为 gke ingress 不支持 rewrite-target。然而,这个谷歌文档,GKE Ingresss - Multiple backend services , 似乎暗示并非如此。我已经按照文档中的步骤进行操作,但没有取得任何成功。只返回路径前缀为/ 的可用服务。任何其他路径前缀,如 /v2,返回 404 Not found。

我的设置详情如下。这里是否存在明显的错误——Google 文档是否不正确,这只能使用 nginx ingress?

-- Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: app-static-ip
    networking.gke.io/managed-certificates: app-managed-cert
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: api-2-service
            port:
              number: 8080

-- Service 1
apiVersion: v1
kind: Service
metadata:
  name: api-service
  labels:
    app: api
spec:
  type: NodePort
  selector:
    app: api
  ports:
  - port: 80
    targetPort: 5000

-- Service 2
apiVersion: v1
kind: Service
metadata:
  name: api-2-service
  labels:
    app: api-2
spec:
  type: NodePort
  selector:
    app: api-2
  ports:
  - port: 8080
    targetPort: 5000

最佳答案

GCP Ingress 支持多路径。这在 Setting up HTTP(S) Load Balancing with Ingress 中也有详细描述。 .在我的测试中,我同时使用了 Hello-world v1 和 v2。

有 3 个可能的问题。

  • 问题在于打开的容器端口。您可以使用 netstat 检查它:
$ kk exec -ti first-55bb869fb8-76nvq -c container -- bin/sh
/ # netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 :::8080                 :::*                    LISTEN      1/hello-app
  • 问题也可能是由防火墙 配置引起的。确保您有正确的设置。 (一般来说,在新集群中我不需要添加任何东西,但如果你有更多东西并且有特定的防火墙配置,它可能会阻止)。

  • portcontainerPorttargetPort 之间配置错误。

下面是我的例子:

第一次部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: first
  labels:
    app: api
spec:
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: container
          image: gcr.io/google-samples/hello-app:1.0
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: api-service
  labels:
    app: api
spec:
  type: NodePort
  selector:
    app: api
  ports:
  - port: 5000
    targetPort: 8080

第二次部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: second
  labels:
    app: api-2
spec:
  selector:
    matchLabels:
      app: api-2
  template:
    metadata:
      labels:
        app: api-2
    spec:
      containers:
        - name: container
          image: gcr.io/google-samples/hello-app:2.0
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: api-2-service
  labels:
    app: api-2
spec:
  type: NodePort
  selector:
    app: api-2
  ports:
  - port: 6000
    targetPort: 8080

入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 5000
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: api-2-service
            port:
              number: 6000

输出:

$ curl 35.190.XX.249
Hello, world!
Version: 1.0.0
Hostname: first-55bb869fb8-76nvq
$ curl 35.190.XX.249/v2
Hello, world!
Version: 2.0.0
Hostname: second-d7d87c6d8-zv9jr

请记住,您还可以通过添加特定注释在 GKE 上使用 Nginx Ingress

kubernetes.io/ingress.class: "nginx" 

人们在 GKE 上使用 nginx ingress 的主要原因是使用 rewrite 注释和使用 ClusterIP 的可能性NodePort 作为 serviceType,其中 GCP ingress 仅允许 NodePort serviceType。

您可以在 GKE Ingress for HTTP(S) Load Balancing 中找到更多信息

关于kubernetes - 具有多个后端服务的 GKE Ingress 返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71257667/

相关文章:

json - Kubernetes (kubectl) 获取正在运行的 Pod

kubernetes - 我的 kubernetes 集群没有缩小

azure - 按部署名称或标签选择器过滤 Kubernetes 事件

google-kubernetes-engine - 具有抢占式节点池的 gke 集群

kubernetes - 将 kubernetes 部署缩减至 0 并缩减至原始副本集数量

google-kubernetes-engine - Google Kubernetes Engine 上的 kubectl 命令超时

kubernetes - K8S入口是否随端口一起提供任何后端目标路径?

google-compute-engine - Google容器集群VS托管实例组

kubernetes - 如何使用带有route53 DNS的nginx-ingress和cert-manager在EKS上启用HTTPS?

javascript - ExpressJS 路由无法解析