Сегодня мне задали интересный вопрос: как обнаружить ситуацию, когда YAML-файл синтаксически корректен, но его содержимое некорректно для Kubernetes, и сделать это до попытки его применения в кластере?
Рассмотрим следующий пример манифеста:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp
namespace: default
spec:
ingressClassName: nginx
rules:
- host: example.127.0.0.1.nip.io
http:
paths:
- pathType: Prefix
backend:
service:
name: webapp
port:
number: 80
path: /
- host: host1.example.com
paths:
- path: /
pathType: Prefix
- host: host2.example.com
paths:
- path: /
pathType: Prefix
- host: host3.example.com
paths:
- path: /
pathType: Prefix
Обратите внимание на host3.example.com
. Идентация смещена и получается что host3 относится к host2, что не так.
Если проверить этот файл с помощью yamllint, то ошибок не будет:
yamllint ingress-invalid.yaml ; echo $?
0
Однако при попытке применить этот манифест в Kubernetes мы получим ошибку:
kubectl apply -f ingress-invalid.yaml
Error from server (BadRequest): error when creating "ingress-invalid.yaml": Ingress in version "v1" cannot be handled as a Ingress: strict decoding error: unknown field "spec.rules[1].paths", unknown field "spec.rules[2].paths"
Возникает вопрос: как проверить корректность манифеста относительно схем Kubernetes до его применения?
Я нашел отличный инструмент — kubeconform. Он позволяет выполнять валидацию манифестов Kubernetes по их JSON-схемам.
Установите kubeconform и запустите проверку:
kubeconform -strict ingress-invalid.yaml ; echo $?
ingress-invalid.yaml - Ingress webapp is invalid: problem validating schema. Check JSON formatting: jsonschema: '/spec/rules/1' does not validate with https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master-standalone-strict/ingress-networking-v1.json#/properties/spec/properties/rules/items/additionalProperties: additionalProperties 'paths' not allowed
1
Что произошло? Инструмент загрузил соответствующую JSON-схему для Ingress и проверил манифест.
Остался вопрос - а как это делать без похода по сети?
Есть ключ --schema-location
, который позволяет указать откуда брать схемы и можно скачать к себе во внутренний контур.
А так же есть поддержка CustomResourceDefinition, что позволяет выстроить проверку всех ваших манифестов.
И даже я смотрю есть helm plugin
Использование kubeconform позволяет выявлять ошибки в манифестах Kubernetes на этапе разработки, что экономит время и предотвращает возможные проблемы в продакшене. Это отличный инструмент для интеграции в процессы CI/CD и обеспечения качества конфигурации кластеров.