温馨提示:本文翻译自stackoverflow.com,查看原文请点击:kubernetes - kubectl diff fails on AKS
kubectl kubernetes azure-kubernetes

kubernetes - kubectl diff在AKS上失败

发布于 2020-04-15 11:27:00

我想将Kubernetes YAML模板与实际部署的资源进行比较。这应该可以使用kubectl diff来实现但是,在Azure中的Kubernetes群集上,出现以下错误:

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

我可以在AKS上启用某些功能以使其正常工作吗,还是有其他实现差异的方法?

查看更多

提问者
dploeger
被浏览
121
mario 2020-02-12 07:47

解决方法是,可以通过diff以下方式使用标准的GNU / Linux 命令:

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

我知道这不是解决方案,而只是解决方法,但我认为它仍可以视为成熟的替代工具。

谢谢,但这对我不起作用,因为它不仅是我感兴趣的一个吊舱,而且是整个Helm发行版,其中包含部署,服务,作业等。– 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属于特定头盔版本的所有资源

如您所见,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

因此,我们不仅限于比较单个文件,而且还比较位于特定目录中的文件。只有我们不能同时使用这两个选项。

因此,diff用于将当前部署在我们的kubernetes集群上的属于特定头盔版本的所有资源来自特定目录的文件进行比较的完整命令如下所示:yaml

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