google-kubernetes-engine - 为什么 GKE Ingress Controller 会出现 404 错误

标签 google-kubernetes-engine google-anthos

我们有以下 Ingress 代码,并且“/demo”应用程序通过 REST API Get 调用响应运行良好。但是“/um”无法打开并且给出 404 错误。 UM 是一个用 Angular 6 构建的前端应用程序,它应该打开一个索引页面。

当我们将此应用程序公开为外部 IP(即类型:LoadBalancer)时,应用程序可以正常工作。当尝试从 Ingress 设置时遇到 404 也是如此。

不确定是什么导致了这个问题。以下是我们的示例 Ingress 部署文件。请通过一些见解来解决该问题。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  rules:
   - http:
      paths:
      - path: /um
        backend:
          serviceName: usermanager-frontend
          servicePort: 8973
      - path: /demoapp
        backend:
          serviceName: springboot-demo
          servicePort: 7070

在我们重写之前,我们在阅读一些帖子后将其删除,因为今天的 GKE 不支持这一点。

metadata:
  name: usermanagement-ui
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /um

最佳答案

YAML 文件,我的意思是部署和服务配置。您随时可以使用这些信息编辑您的问题。

在 GKE 上,您可以运行 2 种类型的入口。

Nginx Ingress Controller

GCP Ingress Controller

如果您想使用 GCP Ingress,您的服务必须是 NodePort 类型。

In the Service manifest, notice that the type is NodePort. This is the required type for an Ingress that is used to configure an HTTP(S) load balancer. More detailed information can be found here.

如果您想使用 Nginx Controller ,则需要部署它(最佳实践是使用 HELM)。您需要在 Ingress 中使用特殊注释来强制执行它,例如: 注释:kubernetes.io/ingress.class:nginx

我已经在this SO answer中提到了差异以及应该如何设置。 .

假设您在标题中提到了有关 GKE 入口的内容,我将为您提供工作示例。为此,我将使用 2 个部署、2 个 svc(hellov1 和 hellov2)和 Ingress。

此外,我不确定这是否是复制/粘贴中的错误,但在您的 YAML 入口定义中缺少一些空格。它应该看起来像:

spec:
  rules:
    - http:
        paths:

YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-v2
spec:
  selector:
    matchLabels:
      app: hello-v2
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-v2
    spec:
      containers:
      - name: hellov2
        image: "gcr.io/google-samples/hello-app:2.0"
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hello-v2-svc
  labels: 
    app: hello-v2
spec:
  type: NodePort 
  selector:
    app: hello-v2
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
---
apiVersion: apps/v1
kind:  Deployment
metadata:
  name: hello
  labels:
    app: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
        - name: nginx
          image: gcr.io/google-samples/hello-app:1.0
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hello-svc
  labels: 
    app: hello
spec:
  type: NodePort 
  selector:
    app: hello
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP  
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  rules:
    - http:
        paths:
        - path: /hello
          backend:
            serviceName: hello-svc
            servicePort: 8080
        - path: /hello-v2
          backend:
            serviceName: hello-v2-svc
            servicePort: 8080

$ kubectl get po,svc,ing
NAME                            READY   STATUS    RESTARTS   AGE
pod/hello-59c5c6ff8d-vdk8d      1/1     Running   0          8m16s
pod/hello-v2-6875bf9bc4-gtzpz   1/1     Running   0          8m16s

NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
service/hello-svc      NodePort    10.8.9.67    <none>        8080:30232/TCP   8m15s
service/hello-v2-svc   NodePort    10.8.3.15    <none>        8080:30501/TCP   8m16s
service/kubernetes     ClusterIP   10.8.0.1     <none>        443/TCP          7h

NAME                           HOSTS   ADDRESS         PORTS   AGE
ingress.extensions/myingress   *       34.120.142.85   80      8m15s

部署 Ingress 后,GKE 需要大约 5 分钟才能开始正常工作。

user@cloudshell:~ (k8s-tests-XXX)$ curl 34.120.142.85/hello
Hello, world!
Version: 1.0.0
Hostname: hello-59c5c6ff8d-vdk8d
user@cloudshell:~ (k8s-tests-XXX)$ curl 34.120.142.85/hello-v2
Hello, world!
Version: 2.0.0
Hostname: hello-v2-6875bf9bc4-gtzpz

我鼓励您阅读 GKE 文档 Configuring Ingress for external load balancing 。您可以在那里找到更多示例和解释如何使用多个后端。也有用的可能是 this article .

此配置仅适用于路径 /hello/nginx,但是您始终可以检查 default backend选项。

如果仍然出现 404,请验证您是否设置了正确的 porttargetPortservicePort

关于google-kubernetes-engine - 为什么 GKE Ingress Controller 会出现 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62296942/

相关文章:

go - Google Anthos实现-PAAS

google-cloud-platform - GCP 连接到 Cloud Run Anthos Nodejs 服务的 SQL

google-app-engine - 文档和索引/Memcache - 如何从 GCE 或 GKE 使用?

ssl - 如何在运行 Go 的 Busybox Docker 容器中进行 HTTPS 调用?

c# - 使用 GCP 的数据存储时如何区分代码是在模拟器中运行还是在 GKE 中运行

kubernetes - GKE 是在 Anthos 解决方案中默认构建的吗?获取 Anthos 指标

docker - 不再支持 Google Cloud Run UDP 端口?

google-anthos - Anthos on VMWare 部署跷跷板,运行状况检查出现错误 403 Forbidden

google-compute-engine - 预期的 Google 计算运行状况检查间隔

kubernetes - GCP负载均衡器后端状态未知