2

我们有下面的 Ingress 代码,“/demo”应用程序运行良好,使用 REST API 获取调用响应。但是“/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
4

1 回答 1

1

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

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

Nginx 入口控制器

GCP 入口控制器

如果你想使用 GCP Ingress,你的 Services 必须是NodePorttype。

在服务清单中,请注意类型是 NodePort。这是用于配置 HTTP(S) 负载平衡器的 Ingress 所需的类型。更详细的信息可以在这里找到。

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

我已经提到了差异以及在这个 SO 答案中应该如何设置。

假设,在你提到的关于 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 文档为外部负载平衡配置 Ingress。您可以在此处找到更多示例和说明如何使用多个后端。这篇文章也很有用。

此配置仅适用于 path/hello/nginx,但是您始终可以检查默认后端选项。

如果您仍然有 404,请验证您是否设置了正确的port,targetPortservicePort.

于 2020-06-15T19:03:22.747 回答