我想将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上启用某些功能以使其正常工作吗,还是有其他实现差异的方法?
解决方法是,可以通过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/
谢谢,但这对我不起作用,因为它不仅是我感兴趣的一个吊舱,而且是一个完整的Helm版本,其中包含部署,服务,作业等。
如果我正确理解的话,
kubectl diff
会将给定YAML文件的内容与已经部署的资源进行比较。我的YAML文件包含许多不同的资源类型,因此手动测试每个资源都不可行。我知道,我可以通过分析YAML文件然后获取资源并进行比较来编写自己的脚本,但是我想了解其他可能性。但到目前为止,谢谢!我了解,逐一比较资源是一项非常繁琐的任务,您可能宁愿避免这样做。您还可以使用
kubectl get all -l "app.kubernetes.io/instance=<helm_release_name>" -o yaml
来获取yamls
属于特定头盔版本的所有资源。好主意啊。您可以将其用于答案吗?那我想接受。
当然可以,我只是做到了。