Kubernetes 中 kubectl 命令式命令中 --record 的使用

Usage of --record in kubectl imperative commands in Kubernetes

我试图找到有用的信息,我应该在什么时候使用 --record。我创建了 3 个命令:

谁能告诉我是否需要在这 3 个命令中使用 --record

什么时候需要用--record什么时候没用?

可以指定--record标志,将执行的命令写在资源注解kubernetes.io/change-cause中。记录的变化对未来的反省很有用。例如,查看每个 Deployment 修订中执行的命令。

kubectl rollout history deployment.v1.apps/nginx-deployment
The output is similar to this:

deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true
2           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 --record=true
3           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.161 --record=true

因此,它对于任何命令都不是强制性的,但建议用于 kubectl set image,因为如果您跳过 --record[=16,您将不会在上面的 CHANGE-CAUSE 部分中看到任何内容=]

Kubernetes 期望的状态可以是 updated/mutated 通过两个范例:

  1. 强制性 使用 kubectl adhoc 命令(k setk createk runk rollout ,..)
  2. 声明性地使用 YAML 清单和单个 k apply

声明式方式非常适合将您的 k8s 清单视为代码,然后您可以与团队共享此代码,例如通过 Git 对其进行版本控制,并利用 Git 继续跟踪其历史记录Ops 实践(分支模型、代码审查、CI/CD)。

但是,团队无法审查命令式方式,因为这些临时命令将由个人 运行 执行,其他人无法轻易找出 更改的原因 修改完成后。

为了克服命令式命令缺少审计跟踪的问题,--record 选项用于将更改的根本原因绑定为名为 kubernetes.io/change-cause 的注解,该注解的值为命令式命令本身。

(以下注释来自official doc

Note: You can specify the --record flag to write the command executed in the resource annotation kubernetes.io/change-cause. The recorded change is useful for future introspection. For example, to see the commands executed in each Deployment revision.

作为结论:

  • 理论上,--record不是强制性的
  • 实际上,这是强制性的,以确保更改留下基本的审计线索并符合 SRE 流程和 DevOps 文化。

--record 标志也有助于查看修订历史的详细信息,因此回滚到以前的版本也会更顺利。

当你不附加 --record 标志时 Change-Cause table 将只是 <none> in
kubectl rollout history

$ kubectl rollout history deployment/app
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>