kubectl diff терпит неудачу на AKS - PullRequest
2 голосов
/ 03 февраля 2020

Я бы хотел сравнить шаблон YAML в Kubernetes с фактическими развернутыми ресурсами. Это должно быть возможно при использовании kubectl diff . Однако в моем кластере Kubernetes в Azure я получаю следующую ошибку:

Error from server (InternalError): Internal error occurred: admission webhook "aks-webhook-admission-controller.azmk8s.io" does not support dry run

Есть ли что-то, что я могу включить в AKS, чтобы разрешить эту работу, или есть какой-то другой способ достижения различий?

1 Ответ

1 голос
/ 03 февраля 2020

В качестве обходного пути вы можете использовать стандартную команду GNU / Linux diff следующим образом:

diff -uN <(kubectl get pods nginx-pod -o yaml) example_pod.yaml

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

Спасибо, но это не работает для меня, потому что мне интересен не один модуль, а целый релиз Helm с развертыванием , услуги, рабочие места и др. c. - dploeger

Но в любом случае вы не сможете сравнить все сразу, не так ли?

Вы можете использовать его для любого ресурса, который вам нравится, а не только для Pods. Просто замените Pod любым другим ресурсом, который вам нравится.

В любом случае, под капотом kubectl diff использует diff command

В kubectl diff --help вы можете прочитать:

Переменная окружения KUBECTL_EXTERNAL_DIFF может использоваться для выбора вашей собственной команды diff. По умолчанию команда «diff», доступная в вашем пути, будет запускаться с опциями «-u» (унифицированный diff) и «-N» (обрабатывать отсутствующие файлы как пустые).


Настоящая проблема в вашем случае заключается в том, что вы не можете по какой-то причине использовать --dry-run в своем кластере AKS, что является вопросом для пользователей / экспертов AKS. Может быть, это можно как-то включить, но, к сожалению, я понятия не имею, как.

В основном kubectl diff сравнивает уже развернутый ресурс, который мы можем получить:

kubectl get resource-type resource-name -o yaml

с результатом:

kubectl apply -f nginx.yaml --dry-run --output yaml

и не с фактическим содержимым вашего файла yaml (для этой цели подойдет простой cat nginx.yaml).


Вы можете дополнительно использовать:

kubectl get all -l "app.kubernetes.io/instance=<helm_release_name>" -o yaml 

для получения yamls всех ресурсов, относящихся к указанному c релизу руля .

Как вы можете прочитать в man diff, у него есть следующие опции:

   --from-file=FILE1
          compare FILE1 to all operands; FILE1 can be a directory

   --to-file=FILE2
          compare all operands to FILE2; FILE2 can be a directory

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

Таким образом, полная команда diff для сравнения всех ресурсов, относящихся к указанному c релизу руля , в настоящее время развернута на наших kubernetes кластер с yaml файлами из указанного каталога c может выглядеть следующим образом:

diff -uN <(kubectl get all -l "app.kubernetes.io/instance=<helm_release_name>" -o yaml) --to-file=directory_containing_yamls/
...