Правила входа не работают

Использую GCE и пытаюсь выставить приложение через ingress. Но правила пути не работают.

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-адресу, я получаю: backend по умолчанию - 404. Если я установил backend по умолчанию через аннотации - все файлы загружены, но запросы / api завершились неудачно - ошибка 404.

Что это может быть?

Основная идея: протестировать ветку на поддомене сайта. k8s namespace = имя ветки. Ingress развернут в каждом пространстве имен с разными хостами в правилах. Глобальный статический IP-адрес, заданный аннотацией и установленный в GCE Cloud DNS.

Спасибо.

ОБНОВИТЬ:

Если я использую аннотацию kubernetes.io/ingress.class: "gce" и путь: / * и / api / * - сайт работает отлично. Но поскольку я использую глобальный статический IP-адрес, я не могу создать более одного входа для каждого IP-адреса. Если я использую kubernetes.io/ingress.class: "nginx" - сайт возвращает ошибку: default backend - 404

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
2
0
730
1

Ответы 1

Фактически вы можете создать несколько входов, используя один и тот же внешний IP-адрес. Вам просто нужно убедиться, что они находятся под разными хостами (или правилами имен хостов), чтобы пути не мешали друг другу. Каждый хост представляет собой блок сервер {} в конфигурациях nginx с уникальным server_name.

Ingress1:

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

Ingress2:

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

Если вы хотите использовать внешний IP-адрес, это все еще возможно, но вам просто нужно использовать отдельный входной контроллер с другим именем входного класса. Например, с контроллер входящего трафика nginx вы можете использовать параметр --ingress-class:

ingress class

Кроме того, если вы не укажете --ingress-class в своем первом контроллере входящего трафика, вам также придется его настроить, иначе, как указано в опции, первый вход будет удовлетворять всем классам.

Спасибо за Ваш ответ. Но у меня проблемы с определением входа. Я хочу использовать статический ip для всех входов. Но kubernetes.io/ingress.global-static-ip-name игнорируется, если я использую ingress.class == nginx. Если я передаю статический ip в spec.loadBalancerIP, он игнорируется. Может я чего-то не понимаю. Что еще я могу сделать, чтобы развернуть каждую ветку в субдомен? Благодарю.

Serhii Koberniuk 23.10.2018 07:08

IP обычно приходит, когда вы открываете свой входной контроллер с типом службы LoadBalancer, и IP автоматически публикуется, если вы используете облачное хранилище, которое не поддерживает тип LoadBalancer, тогда вам нужно использовать NodePort.

Rico 23.10.2018 07:42

Другие вопросы по теме