Skip to content

Instantly share code, notes, and snippets.

@azalio
Last active October 21, 2024 13:42
Show Gist options
  • Save azalio/f2e2859258c5d1768131623775ad369c to your computer and use it in GitHub Desktop.
Save azalio/f2e2859258c5d1768131623775ad369c to your computer and use it in GitHub Desktop.
Как проверить валидность Kubernetes-манифеста до его применения.

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

@azalio_tech

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment