【问题标题】:Ingress rules not works入口规则不起作用
【发布时间】:2019-03-26 19:53:16
【问题描述】:

我使用 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

【问题讨论】:

    标签: kubernetes google-compute-engine ingres


    【解决方案1】:

    您实际上可以使用相同的外部 IP 地址创建多个入口。您只需要确保它们在不同的主机(或主机名规则)下,因此路径不会相互干扰。每个主机在 nginx 配置中代表一个 server {} 块,具有唯一的 server_name

    入口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,它仍然可行,但您只需使用具有不同入口类名称的单独入口控制器。例如,对于nginx ingress controller,您可以使用--ingress-class 选项:

    此外,如果您没有在第一个入口控制器中指定 --ingress-class,您也必须对其进行配置,否则就像选项所说的那样,第一个入口将满足所有类。

    【讨论】:

    • 感谢您的回答。但是我对入口定义有一些问题。我想对所有入口使用静态 ip。但是如果我使用 ingress.class== nginx,kubernetes.io/ingress.global-static-ip-name 会被忽略。如果我将静态 ip 传递给 spec.loadBalancerIP,它会被忽略。也许我有些不明白。我还能做些什么来发布将每个分支部署到子域?谢谢。
    • IP 通常在您使用服务类型LoadBalancer 公开入口控制器并且 IP 自动发布时出现,如果您使用不支持 LoadBalancer 类型的云服务,那么您需要使用 NodePort
    猜你喜欢
    • 2018-04-24
    • 2022-06-30
    • 2019-07-24
    • 2022-01-13
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多