kubectl patch

kubectl patch 用来修改 Kubernetes API 对象的字段。可以通过 --type 参数指定三种不同类型的 patch 方式:

  • strategic:strategic merge patch
  • merge: json merge patch
  • json: json patch

实际使用情况:

  • strategic merge patch 用的比较少;大多使用 json merge patch 和 json patch
  • json merge patch 和 json patch 的具体区别可以查看这篇文章
  • json patch 相比于 json merge patch 使用起来复杂一点,但使用方法更灵活,功能更强大,副作用更少。因此更推荐使用。

strategic merge patch

这是默认的patch类型,strategic merge patch 在进行 patch 操作时,到底是进行替换还是进行合并,由 Kubernetes 源代码中字段标记中的 patchStrategy 键的值指定。

具体来说:

  • 如果你对deployment的 .spec.template.spec.containers 字段进行 strategic merge patch,那么新的 containers 中的字段值会合并到原来的字段中去,因为 PodSpec 结构体的 Containers 字段的 patchStrategymerge
  • 如果你对deployment的 .spec.template.spec.tolerations 字段进行 strategic merge patch,那么会用新的 tolerations 字段值将老的字段值直接替换。

json merge patch

有相同的字段就替换,没有相同的字段就合并。这在语义上非常容易理解,但是有以下弊端:

  • 键值无法被设置为 null,设置为 null 的字段会直接被 json merge patch 删除掉
  • 操作数组非常吃力。如果你想添加或修改数组中的元素,必须在copy原来的数组,并在其基础上进行改动。因为新的数组会覆盖原来的数组

特别是第二点,这导致只要是和数组相关的patch操作,最好使用json patch。

json patch

json patch 的格式如下:

1[
2    {
3        "op" : "",
4        "path" : "" ,
5        "value" : ""
6    }
7]

即由操作、字段路径、新值组成。具体例子查看这篇文章。可以看到这种操作方式非常灵活。

json patch 转义字符

  • “~"(波浪线)对应的是:"~0”
  • “/"(斜杠)对应的是:"~1”

具体可以查看这个issue中的讨论。