APIServer空运行和Kubectl差异

作者 :Antoine Pelisse(Google云,@ apelisse)

声明式配置管理(也称为代码配置)是 Kubernetes的关键优势之一。它允许用户提交所需的状态 集群,并跟踪不同的版本,改进审核和 通过CI / CD管道实现自动化。的 申请工作组 正在努力弥补一些差距,并高兴地宣布Kubernetes 1.13 promoted server-side dry-run and kubectl diff to beta. These 这两个功能是Kubernetes声明模型的重大改进。

挑战性

为了具有无缝的声明,仍然缺少一些内容 Kubernetes的经验,我们尝试解决其中的一些问题:

  • 虽然编译器和linter可以很好地检测出请求请求中的错误 对于代码,Kubernetes配置文件缺少良好的验证。 The existing solution is to run kubectl apply --dry-run, but this runs a 本地 不与服务器对话的空运行:没有服务器 验证,并且不会通过验证准入控制器。作为一个 例如,自定义资源名称仅在服务器上验证,因此本地 dry-run won't help.
  • 可能很难知道对象将如何被对象应用。 服务器有多种原因:
    • 默认设置会将某些字段设置为潜在的意外值,
    • 更改网络钩子可能会设置字段或破坏/更改某些值。
    • 修补和合并会产生令人惊讶的效果,并导致意外 对象。例如,可能很难知道列表将如何 ordered once merged.

工作组已尝试解决这些问题。

APIServer空运行

APIServer空运行 为解决以下两个问题而实施:

  • 它允许将对apiserver的单个请求标记为“空运行”,
  • apiserver保证空运行请求不会被持久存储到存储中,
  • 该请求仍作为典型请求处理: 默认,对象被验证,它通过验证接纳 链,并通过变异的进入链,最后的对象是 照常返回给用户,而不会持久化。

虽然动态准入控制器不应在以下方面产生副作用 每个请求,仅当所有准入控制器都在处理空运行请求 明确宣布他们没有任何空运行的副作用。

如何启用

通过功能门启用服务器端空运行。现在该功能是 1.13中的Beta版,应默认启用,但仍可以启用/禁用 using kube-apiserver --feature-gates DryRun=true.

如果您有动态准入控制器,则可能必须将它们修复为:

  • 在webhook请求中指定了dry-run参数后,消除所有副作用,
  • 在中指定 sideEffects field of the admissionregistration.k8s.io/v1beta1.Webhook object to indicate that the object doesn't have side-effects on dry-run (or at all).

如何使用它

You can trigger the feature from kubectl by using kubectl apply --server-dry-run, which will decorate the request with the dryRun flag 并按原样返回对象,否则返回错误 have failed.

杜鹃花

空运行APIServer很方便,因为它可以让您查看对象的状态 已处理,但是如果对象是 big. kubectl diff does exactly what you want by showing the differences between 当前的“活动”对象和新的“空运行”对象。它非常 方便仅关注对对象所做的更改 服务器已经合并了这些内容以及变异的Webhooks如何影响输出。

如何使用它

kubectl diff is meant to be as similar as possible to kubectl apply: kubectl diff -f some-resources.yaml 将显示yaml文件中资源的差异。甚至可以通过使用KUBECTL_EXTERNAL_DIFF环境变量来使用他们选择的diff程序,例如:

KUBECTL_EXTERNAL_DIFF=meld kubectl diff -f some-resources.yaml

下一步是什么

工作组仍在努力改善以下方面:

  • 服务器端应用正在尝试通过添加所有者来改善应用场景 字段的语义!它还将改善对CRD和工会的支持!
  • diff中缺少一些kubectl apply功能,这些功能可能非常有用,例如功能 按标签过滤或显示修剪的资源。
  • 最终,kubectl diff将使用服务器端应用!
注意: The flag kubectl apply --server-dry-run is deprecated in v1.18. Use the flag --dry-run=server for using server-side dry-run in kubectl apply 和其他子命令。