Ошибка при создании ресурса Kubernetes Ingress (нет совпадений для типа “Ingress”)

Вопрос или проблема

В кластере Kubernetes у меня установлен Traefik v3.2.1 и CertManager 1.16.1 и программа, которую я тестирую. Когда я пытаюсь применить этот файл: 022-red-ing.yml, я получаю эту ошибку:

ошибка: ошибка проверки "022-red-ing.yml": ошибка проверки данных: [apiVersion не установлен, kind не установлен]; если вы решите игнорировать эти ошибки, отключите проверку с помощью --validate=false

Я хотел бы правильно определить файл, но мне не хватает информации, так как в документации, откуда я его скопировал, не указаны apiVersion и kind.

Файл в данный момент выглядит так:

cat 022-red-ing.yml

   apiVersion: networking.k8s.io/v1
    kind: Ingress
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - program.example.domain
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          credentialName: tls-program-ingress-http
          mode: SIMPLE
      - hosts:
        - program.example.domain
        port:
          name: program-frontend
          number: 80
          protocol: HTTP
        tls:
          httpsRedirect: true
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP

Какой apiVersion и kind я должен установить? Если я добавлю этот код:

apiVersion: extensions/v1beta1
kind: Ingress

Я получаю другую ошибку. Прямо сейчас, когда я выполняю:

kubectl apply -f 022-red-ing.yml

Я получаю

ошибка: ошибка при получении текущей конфигурации:
Ресурс: "networking.k8s.io/v1, Ресурс=ingresses", GroupVersionKind: "networking.k8s.io/v1, Kind=Ingress"
Имя: "", Пространство имен: "default"
с сервера для: "022-red-ing.yml": имя ресурса не может быть пустым

Я делаю что-то не так.

Файл в данный момент выглядит так…

Я почти уверен, что это не так, потому что этот файл не является действительным манифестом Kubernetes (не хватает секций apiVersion, kind и metadata).

Судя по сообщению об ошибке (No matches for kind "Ingress" in version "extensions/v1beta1"), похоже, что вы используете неверный apiVersion в манифесте. Вместо:

apiVersion: extensions/v1beta1

Вам нужно:

apiVersion: networking.k8s.io/v1

Это прямо из официальной документации; непонятно, почему вы используете неверное значение, но это говорит о том, что вы, возможно, читаете устаревший материал.

Ответ или решение

Ошибка, с которой вы столкнулись при создании ресурса Ingress в кластере Kubernetes, связана с неправильной конфигурацией вашего манифеста. Рассмотрим детально, как исправить данную проблему и правильно описать ресурс.

Проблема

  1. Отсутствуют ключевые поля: В первоначальном файле отсутствуют секции apiVersion, kind и metadata. Это основные поля, необходимые для идентификации Kubernetes-ресурса.

  2. Неверная версия API: Вы упомянули использование extensions/v1beta1, что является устаревшей версией. На сегодняшний день рекомендуется использовать networking.k8s.io/v1 для ресурса Ingress.

  3. Пустое имя ресурса: Сообщение об ошибке resource name may not be empty указывает на то, что вы не указали имя для вашего объекта Ingress в секции metadata.

Правильная структура манифеста

Ваш файл 022-red-ing.yml должен содержать следующие ключевые секции:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress  # Укажите имя вашего Ingress ресурса
  labels:
    app: my-app     # Аналогично, можно указать метки(опционально)
spec:
  rules:            # В этой секции мы корректно указываем правила маршрутизации
  - host: program.example.domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service  # Имя вашего сервиса
            port:
              number: 443      # Порт сервиса
  - host: '*'
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-default-service  # Задайте дефолтный сервис
            port:
              number: 80

Разбор секций

  • apiVersion: Указывает на то, что вы используете версию networking.k8s.io/v1, которая актуальна для ресурса Ingress.

  • kind: Указывает тип ресурса, в этом случае — Ingress.

  • metadata: Необходимо указать уникальное имя (name) для вашего Ingress. Это позволит вам управлять ресурсом через kubectl.

  • spec: Указывает правила маршрутизации. В каждом правиле должно быть указано, какой хост обрабатывается, какие пути (если применимо) и соответствующий сервис.

Итог

После структурирования файла в соответствии с указанным выше форматом, вы сможете применить манифест без дальнейших ошибок. Используйте команду:

kubectl apply -f 022-red-ing.yml

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

  • Убедитесь, что ваш кластер Kubernetes правильно настроен и работает.
  • Проверьте, что сервисы, на которые ссылается Ingress, также существуют.
  • Убедитесь, что установленный вами контроллер Ingress (в данном случае Traefik) управляет созданием ресурсов Ingress правильно.

Справившись с этими шагами, вы сможете корректно настроить ресурс Ingress и интегрировать его в вашу архитектуру.

Оцените материал
Добавить комментарий

Капча загружается...