Как включить default-http-backend в Kubernetes, чтобы Ingress работал?

У меня есть экземпляр Kubernetes с одним узлом от microk8s. Он установлен на Ubuntu Server 20.20, работающем на Raspberry Pi 4.

Я пытаюсь настроить входящий ресурс, который не может работать.

Когда я запускаю kubectl describe ingress my-ingress, я получаю этот результат

Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)

Судя по тому, что я нашел в Интернете, default-http-backend - это то, что должно было быть там по умолчанию, но когда я запускаю kubectl get pods -n kube-system, я этого не вижу.

Вопрос: Как включить default-http-backend в mikrok8s? Или, в более общем плане, как мне заставить работать ingress?

Примечание: дополнения Ingress и DNS включены.


person Sasha Shpota    schedule 22.09.2020    source источник
comment
Как вы создали свои deployment и service? С помощью селекторов или headless? Не могли бы вы поделиться своими YAML (развертывание, svc, вход)?   -  person PjoterS    schedule 22.09.2020
comment
@PjoterS моя конфигурация выглядит точно так же (заполнены только заполнители): raw.githubusercontent.com/Shpota/cde/master/k8s/resources.yml   -  person Sasha Shpota    schedule 22.09.2020
comment
Кажется, вы используете selectors, однако вы также используете nginx.ingress.kubernetes.io/rewrite-target: /, который поддерживается только при использовании Nginx Ingress. Также я не уверен, поддерживается ли rewrite на MicroK8s. Вы пытались удалить эту аннотацию и использовать пример из документации?   -  person PjoterS    schedule 22.09.2020
comment
@PjoterS спасибо. Конфигурация 100% рабочая (минимум 6 месяцев назад). Тогда я тестировал его на mikrok8s, установленном на ноутбуке с Ubuntu. На этот раз я пытаюсь запустить его на Raspberry Pi. Наверняка версия mikrok8s, наверное, сейчас другая, но теоретически она должна работать так же. Странно то, что конфигурация из документа показывает ту же ошибку , но работает хорошо. Не понимаю почему. В то же время, если я пытаюсь указать путь к чему-то еще, кроме корневого, он дает мне 404 (я проверяю с помощью curl 127.0.0.1:80/new-path). Любые идеи?   -  person Sasha Shpota    schedule 22.09.2020
comment
@PjoterS Думаю, проблема заключалась в использовании версии API v1beta1. После того, как я изменил конфигурацию Ingress на эту это сработало. Хотя я не могу понять, почему то, что работало полгода назад, сейчас не работает.   -  person Sasha Shpota    schedule 23.09.2020


Ответы (2)


Я протестировал это поведение на своем кластере. Когда я попробовал конфигурацию, предоставленную вами, я получил Warning:

@microk8s:~$ microk8s kubectl get ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

Также, если вы опишете это, вы получите тот же Warning.

@microk8s:~$ kk describe ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             hello-ing
Namespace:        default
Address:          
    Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /hello   hello-svc:80   10.1.128.202:8080)

В отношении этой ошибки есть аналогичный вопрос Github.

Вывод, который вы видите, является стандартным для случаев, когда нет серверной части по умолчанию https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/kubectl/pkg/describe/describe.go#L2393

Однако он работает нормально.

$ curl 127.0.0.1/hello
Hello, world!
Version: 1.0.0
Hostname: hello-647c466dbc-99rml

Если вы добавите бэкэнд по умолчанию, вы получите следующий результат: :

Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             ingress
Namespace:        default
Address:          127.0.0.1
Default backend:  test2:80   10.1.128.205:80)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /hello   hello-svc:80   10.1.128.204:8080)

и Ingress выглядит так:

spec:
  backend:
    serviceName: test2
    servicePort: 80
  rules:
  - http:
      paths:
      - path: /hello
        backend:
          serviceName: hello-svc
          servicePort: 80

Хотя я не могу понять, почему то, что работало полгода назад, не работает сейчас.

Поскольку новый apiVersion немного изменяет синтаксис, добавляя некоторые функции, параметры и т. Д., Может возникнуть ситуация, когда после обновления / обновления некоторые ресурсы больше не могут быть проверены Kubernetes. Как указано в этой статье.

Для определения объекта в Kubernetes требуется поле apiVersion. Когда у Kubernetes есть выпуск, который обновляет то, что вам доступно, что-то меняет в его API, создается новая версия apiVersion. Однако в официальной документации Kubernetes мало указаний по apiVersion. Это руководство дает вам шпаргалку о том, какую версию использовать, объясняет каждую версию и дает вам график выпусков.

Если вы измените только apiVersion в своем YAML, вы получите ошибку:

error: error validating "ingress.yaml": error validating data: [ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "serviceName" in io.k8s.api.networking.v1.IngressBackend, ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "servicePort" in io.k8s.api.networking.v1.IngressBackend]; if you choose to ignore these errors, turn validation off with --validate=false

Подводя итог, вы получили это <error: endpoints "default-http-backend" not found>, поскольку default backend не было настроено.

Дополнительные сведения можно найти в Kubernetes Api Docs.

person PjoterS    schedule 24.09.2020

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

apiVersion: networking.k8s.io/v1

spec:
  defaultBackend:
    service:
      name: tea-svc
      port:
        number: 80

Вот полный пример с использованием v1

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  defaultBackend:
    service:
      name: tea-svc
      port:
        number: 80
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80

apiVersion: networking.k8s.io/v1beta1

В зависимости от apiVersion вашего yaml-файла серверная часть по умолчанию указывается в другом формате. Похоже, вы используете бета-формат.

spec:
    backend:
        serviceName: tea-svc
        servicePort: 80

Контроллер NGINX Ingress жалуется на v1beta1, пока он работает в kubernetes 1.21.2, но, как сказано в предупреждении, не скоро:

networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
person Robert    schedule 06.07.2021