入口规则不起作用

时间:2018-10-22 17:07:42

标签: kubernetes google-compute-engine ingres

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

1 个答案:

答案 0 :(得分:2)

您实际上可以使用相同的外部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

如果要使用externalIP,它仍然可行,但是您只需要使用具有不同入口类名称的单独入口控制器即可。例如,对于nginx ingress controller,您可以使用--ingress-class选项:

ingress class

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