kubectl apply --dry-run=server -f apps/image-updater.yamlkubectl diff -f apps/image-updater.yamlkubectl apply --server-side=true -f apps/Разница принципиальная. --dry-run=client проверяет только синтаксис локально: опечатка в имени поля пройдёт незамеченной, потому что клиент не знает схему ресурса. --dry-run=server отправляет манифест на кластер, где его валидирует API — с той же схемой, теми же admission-вебхуками и теми же CRD, но без записи.
Что ловится только серверной проверкой: неизвестные и переименованные поля, отсутствующий CRD (манифест ссылается на ресурс, которого в кластере нет), отказ admission-вебхука, нарушение квоты неймспейса.
kubectl diff полезнее, когда манифест точно валиден, а вопрос в другом — что именно поменяется. Он показывает построчную разницу с тем, что сейчас в кластере, и хорошо вылавливает случайные откаты: локальный файл отстал от того, что кто-то поправил руками.
--server-side=true — не про проверку, а про способ применения: владение полями отслеживает сервер, и два разных инструмента могут управлять разными частями одного объекта, не затирая друг друга. Для манифестов, которые параллельно правит контроллер вроде ArgoCD или image updater, это снимает бесконечные перезаписи.