kubernetes - Ingress 规则不起作用

标签 kubernetes google-compute-engine kubernetes-ingress

我使用 GCE 并尝试通过入口公开应用程序。但路径规则不起作用。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: front-ingress
    namespace: {{ .Release.Namespace }}
    annotations:
        {{ if eq .Values.env "dev" }}
        kubernetes.io/ingress.global-static-ip-name: "test-ip"
        {{ else }}
        cloud.google.com/load-balancer-type: "Internal"
        {{ end }}
spec:
    rules:
    -   host: {{ .Values.domain }}
        http:
            paths:
            -   path: /
                backend:
                    serviceName: front-service
                    servicePort: 80
            -   path: /api/
                backend:
                    serviceName: backend-service
                    servicePort: 80

当网站在浏览器中打开时 - 所有文件都返回 404。当我通过 url 打开文件时,我收到:默认后端 - 404。如果我通过注释设置默认后端 - 所有文件均已加载,但/api 请求失败 - 404 错误。

它可能是什么?

主要思想:在站点子域上测试分支。 k8s命名空间=分支名称。 Ingress 部署到规则中具有不同主机的每个命名空间。通过注释设置全局静态IP,并在GCE Cloud DNS中设置。

谢谢。

更新:

如果我使用注释kubernetes.io/ingress.class: "gce"和路径:/* 和/api/* - 站点运行完美。但由于我使用全局静态 IP,因此我无法为每个 IP 创建多个入口。如果我使用 kubernetes.io/ingress.class: "nginx" - 站点返回错误:default backend - 404

最佳答案

您实际上可以使用相同的外部 IP 地址创建多个入口。您只需确保它们位于不同的主机(或主机名规则)下,这样路径就不会相互干扰。每个主机代表一个server {}使用唯一的 server_name 阻止 nginx 配置。

入口1:

spec:
    rules:
    -   host: host1.domain1
        http:
            paths:
            -   path: /
                backend:
                    serviceName: front-service1
                    servicePort: 80
            -   path: /api/
                backend:
                    serviceName: backend-service1
                    servicePort: 80

入口2:

-   host: host2.domain2
        http:
            paths:
            -   path: /
                backend:
                    serviceName: front-service2
                    servicePort: 80
            -   path: /api/
                backend:
                    serviceName: backend-service2
                    servicePort: 80

如果您想使用外部IP,它仍然是可行的,但您只需使用具有不同入口类名称的单独入口 Controller 即可。例如,使用 nginx ingress controller您可以使用 --ingress-class选项:

ingress class

此外,如果您没有在第一个入口 Controller 中指定 --ingress-class ,您也必须配置它,否则就像选项所说的那样,第一个入口将满足所有类.

关于kubernetes - Ingress 规则不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934429/

相关文章:

kubernetes - 复制 Controller 文件中的图像标记

azure - 升级 AKS 群集需要什么授权?

elasticsearch - 在 Google Compute Engine 上使用抢占式虚拟机

google-compute-engine - 跨 Google Cloud 项目联网

kubernetes - 如何在 Openshift 中更新 Secrets(不删除和创建)?

kubernetes - 如何使用持久卷声明重新启动 Kubernetes 部署?

ssh - Google VM附加磁盘存储

websocket - GKE Ingress 在使用 https 时丢弃 websocket 连接

kubernetes - 分析kubernetes pod网络流量