Вопрос или проблема
В кластере 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, связана с неправильной конфигурацией вашего манифеста. Рассмотрим детально, как исправить данную проблему и правильно описать ресурс.
Проблема
-
Отсутствуют ключевые поля: В первоначальном файле отсутствуют секции
apiVersion
,kind
иmetadata
. Это основные поля, необходимые для идентификации Kubernetes-ресурса. -
Неверная версия API: Вы упомянули использование
extensions/v1beta1
, что является устаревшей версией. На сегодняшний день рекомендуется использоватьnetworking.k8s.io/v1
для ресурса Ingress. -
Пустое имя ресурса: Сообщение об ошибке
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 и интегрировать его в вашу архитектуру.