kubectl 用--patch动态修改k8s的资源

用diff格式修改

kubectl 命令中使用 --patch 参数是一种对 Kubernetes 资源进行部分更新的便捷方法。当你想要动态地修改资源(例如自定义资源定义 CRD 实例)的某些字段而无需获取和编辑整个资源定义时,这个方法尤其有用。

下面是使用 kubectl patch 命令来更新 CRD 实例的 spec 的一个示例:

假设你有一个名为 "my-crd" 的自定义资源定义,它定义了种类 "MyResource",且你想要修改或者添加一个名为 "example" 的实例,特定地,更新 spec 下的某个字段,你可以使用以下命令:

sh 复制代码
kubectl patch myresource example --type=merge --patch='
{
  "spec": {
    "newField": "newValue"
  }
}'

在这个命令中:

  • myresource 是 CRD 的资源类型(不是 CRD 的绝对名称)。在实际场景中,请使用你具体的资源类型。
  • example 是 CRD 实例的名字。
  • --type=merge 指定更新策略,merge 是通常用来更新 map 或者 struct 类型字段的策略。
  • --patch 后面跟着一段 JSON 字符串,说明了要做的变更。这里,我们将 spec 下的 newField 字段的值设为了 "newValue"。如果字段已经存在,它的值将被这个新的值覆盖;如果字段不存在,它将被添加进去。

确保你使用的 patch 中的 JSON 格式与你的 CRD 中的 spec 部分结构是相匹配的。如果字段结构有嵌套,请使用嵌套的 JSON 对象来表达这些变更。

你还可以使用 YAML 格式进行 patch 操作,以下是使用 YAML 的等价命令:

sh 复制代码
kubectl patch myresource example --type=merge --patch='
spec:
  newField: newValue
'

请确保这个命令在一个 shell 中作为单行运行,或者正确处理多行输入。不同的 shell 环境可能需要不同的语法来处理换行。

在实践中请把 MyResourceexamplenewFieldnewValue 替换为你实际的 CRD 名称、CRD 实例名称以及你希望添加或修改的字段名称和值。

用JSON格式修改

当在 kubectl patch 命令中使用 --type=json 时,这表示你正在采用 JSON Patch 的方式来更新资源。JSON Patch 是一种类似于 diff 的格式,它描述了如何修改 JSON 文档的一系列操作。JSON Patch 允许你执行的操作不仅仅局限于替换操作(如 merge 类型),它还可以执行添加、删除、移动、复制和测试操作。

以下是如何使用 JSON Patch (--type=json) 来为 Kubernetes 资源的 spec 添加新值的示例:

sh 复制代码
kubectl patch myresource example --type=json --patch='
[
  {
    "op": "add",
    "path": "/spec/newField",
    "value": "newValue"
  }
]'

在这个例子中:

  • myresource 是你的自定义资源的类型。
  • example 是你想要修改的资源的名字。
  • --type=json 指定我们正在使用 JSON Patch。
  • --patch 后面是一个 JSON 数组,每个元素都是一个操作对象。
  • op 表示操作类型,比如 addremovereplace 等。
  • path 是资源中要操作的 JSON 路径。请注意,所有层级之间必须以 / 分隔,并且路径中不能有空格。如果字段或数组的名称包含斜杠字符 /,则使用 ~1 替换。
  • value 是你想要添加或设置的新值。

关于 op 的其他常用操作类型有:

  • replace:替换现有字段的值。如果使用 replace 操作,路径应该是已存在的字段的完整路径。
  • remove:删除一个字段。路径是要移除的字段的完整路径。
  • add:添加一个新字段。如果字段已经存在,则 op 应为 replace

请注意,JSON Patch 是一个强大但相对复杂的工具,尤其是当处理复杂的资源或需要执行多步操作时。在使用前确保你完全理解每个操作的含义和潜在的影响。提供给 --patch 的 JSON 要被包含在单引号 '`' 内,并确保 JSON 本身的结构和语法是正确的。

给数组增加新的item

如果要使用 kubectl patch 来给 CRD 中的数组添加一个新元素,你需要使用 JSON Patch 格式并指定数组操作。以下是一个如何使用 kubectl 并采用 --type=json 参数向数组添加新项的示例:

sh 复制代码
kubectl patch myresource example --type=json --patch='
[
  {
    "op": "add",
    "path": "/spec/myArray/-",
    "value": "newValue"
  }
]'

在这个示例中:

  • myresource 是 CRD 的资源类型。
  • example 是 CRD 实例的名称。
  • --type=json 指明我们使用 JSON Patch 做修改。
  • --patch 参数提供 JSON 格式的修改指令。
  • /spec/myArray/- 是 JSON Patch 路径,其中 /spec/myArray 指向数组所在的位置,- 是一个特殊的符号,表示追加元素到数组的末尾。
  • "op": "add" 指定操作类型为添加。
  • "value": "newValue" 是你想要添加到数组中的新元素的值。

需要注意,如果你想要添加到数组的特定位置,可以在 path 中使用一个整数来表示数组的索引,如 /spec/myArray/1 会将新元素添加到数组的第二个位置(索引从0开始)。

如果 myArray 中的元素是复杂对象,你的 "value" 也应该是一个相应的 JSON 对象,如下所示:

sh 复制代码
kubectl patch myresource example --type=json --patch='
[
  {
    "op": "add",
    "path": "/spec/myArray/-",
    "value": { "field1": "value1", "field2": "value2" }
  }
]'

在这个修改中,我们添加了一个新的对象到 myArray 中,该对象拥有 field1field2 两个字段。

请务必确保 --patch 参数中的 JSON 字符串正确无误,并且正确反映了你的 CRD 结构。特别是在使用 shell 脚本或在命令行中,要注意 JSON 字符串的适当引用,以防止解析问题或意外的 shell 行为。

相关推荐
LQ深蹲不写BUG43 分钟前
微服务事务管理利器:Seata 核心原理与实践指南
微服务·云原生·架构
nathan05292 小时前
Kubernetes 实战练习指南
云原生·容器·kubernetes
無名之輩2 小时前
Nvidia Device Plugin入门二之envvar策略
kubernetes
云和数据.ChenGuang4 小时前
微服务技术栈
微服务·云原生·架构
syty20204 小时前
K8s是什么
容器·kubernetes·dubbo
江团1io05 小时前
微服务雪崩问题与系统性防御方案
微服务·云原生·架构
Evan Wang6 小时前
使用Terraform管理阿里云基础设施
阿里云·云原生·terraform
向上的车轮6 小时前
基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
开发语言·云原生·golang
灵犀物润7 小时前
Kubernetes 配置检查与发布安全清单
安全·容器·kubernetes
360智汇云8 小时前
k8s交互桥梁:走进Client-Go
golang·kubernetes·交互