K8s的patch命令随记:修订间差异

来自三线的随记
无编辑摘要
无编辑摘要
 
(未显示同一用户的7个中间版本)
第1行: 第1行:
__TOC__
__TOC__


初接触k8s patch感觉是用起来较为繁琐的一个命令,遂开启本文随记一下一些常见用途
Official doc: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/


初接触k8s patch感觉是用起来较为繁琐的一个命令,遂开启本文随记一下一些常见用途




===Prerequisite Notes - 前提说明===
===Prerequisite Notes - 前提说明===
kubectl patch 其实是有三种行为表现的,分别是 [json merge strategic]
kubectl patch 其实是有合并策略,分别是 [json merge strategic]
 
其中json指的是[https://datatracker.ietf.org/doc/html/rfc6902 JSON Patch, RFC 6902],最明显的特征是json类型字符串,并且带有关键字 "op" 和 "path"
 
merge指的是[https://datatracker.ietf.org/doc/html/rfc7386 JSON Merge Patch, RFC 7386],这种传递的参数也是json类型字符串,但是个人感觉这种合并策略属于是一种约定好的实现规范,直接看参数不能很好地猜出实际产生效果
 
strategic是kubectl patch默认的合并策略,行为表现是由kubernetes 定义的,具体合并策略效果可以从kubernetes api reference doc<sub>(<nowiki>https://kubernetes.io/docs/reference/generated/kubernetes-api/${k8s-version}</nowiki>)</sub>中查阅(patch strategy / patch merge key)


参数为 <code>--type='strategic': The type of patch being provided; one of [json merge strategic]</code>
参数为 <code>--type='strategic': The type of patch being provided; one of [json merge strategic]</code>
第13行: 第21行:


For a comparison of JSON patch and JSON merge patch, see [rfc:7386 JSON Patch and JSON Merge Patch.]
For a comparison of JSON patch and JSON merge patch, see [rfc:7386 JSON Patch and JSON Merge Patch.]
另外一种叫做「策略性合并patch」的行为表现是由kubernetes 定义的,由 <code>patchStrategy</code> 字段决定(在api文档可以找到此字段) 例如 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podspec-v1-core


<u>'''而利用 json patch 可以实现更为强大的增加/修改/删除行为'''</u>
<u>'''而利用 json patch 可以实现更为强大的增加/修改/删除行为'''</u>
<br />
<br />
 
===简要记录===
===记录===
==== 利用 kubectl patch 批量修改Deployment update strategy ====
==== 利用 kubectl patch 批量修改deployment strategy ====
*表现行为: replace
*表现行为: replace
  spec:
  spec:
第28行: 第31行:
     type: Recreate
     type: Recreate
     rollingUpdate: null
     rollingUpdate: null
====利用 kubectl patch 修改 service labels====
====利用 kubectl patch 修改 service labels====
  <nowiki>kubectl patch -n demo svc demo-svc --patch '{"metadata": {"labels":{"app": "demo-app"}}}'</nowiki>
  <nowiki>kubectl patch -n demo svc demo-svc --patch '{"metadata": {"labels":{"app": "demo-app"}}}'</nowiki>


*表现行为为: append
*表现行为: append
 
<br />


====利用 kubectl patch 和 cat 修改 deployment labels====
====利用 kubectl patch 和 cat 修改 deployment labels====


*表现行为为: append
*表现行为: append


  [root@master44 yamls]# cat patch-labels.yaml
  [root@master44 yamls]# cat patch-labels.yaml
第47行: 第46行:


  [root@master44 yamls]# kubectl patch -n demo deployments.apps demo-app --patch "$(cat patch-labels.yaml)"
  [root@master44 yamls]# kubectl patch -n demo deployments.apps demo-app --patch "$(cat patch-labels.yaml)"
=== Json patch ===
json patch虽然语法功能较为灵活强大,但是配合kubectl使用的时候如果出现错误,不会得到具体的错误信息,较为难以快速定位排查(至少kubectl 1.18是这样)
小坑也会比较多,有一定的语法上手成本
例如用Json patch修改有多个container下的deployment的时候,(应该)不能根据container name定向修改某个container的参数,只能通过序号0 / 1 / 2等定向修改
利用Json patch修改容器的livenessProbe/readinessProbe下的failureThreshold等参数的时候,在json中该参数值必须只可以是数字型数字,不能是字符型数值(即不要用双引号扩起来),
否则同样会有"<code>The request is invalid: patch: Invalid value: xxxxx v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.LivenessProbe: v1.Probe.FailureThreshold: readUint32: unexpected character: , error found in #10 byte of</code>" 报错


====利用 json patch 移除 deployment labels====
====利用 json patch 移除 deployment labels====
第61行: 第71行:
  ]
  ]


==== 利用 json patch 移除 deployment tolertions ====
⚠️ 注意利用remove进行移除元素,如果被patch的对象本身就没有tolerations的话,kubectl patch会提示The request is invalid错误
[root@node dir]# cat patch.json
[
    {
        "op": "remove",
        "path": "/spec/template/spec/tolerations"
    }
]
[root@node dir]# kubectl patch -n demo deployments.apps test-deployment --type=json -p="$(cat patch.json)" --dry-run=server
deployment.apps/test-deployment patched
==== 修改容器镜像地址 ====
[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/image",
    "value": "docker.io/dmp-system/test-1:2.5.4.1"
  },
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/1/image",
    "value": "docker.io/dmp-system/test-2:2.5.4"
  },
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/image",
    "value": "docker.io/dmp-system/test-3:2.5.4"
  }
]
[[分类:K8s]]
[[分类:K8s]]
[[分类:Todo]]
[[分类:Todo]]
__无编辑段落__
__无编辑段落__

2023年5月10日 (三) 14:53的最新版本

初接触k8s patch感觉是用起来较为繁琐的一个命令,遂开启本文随记一下一些常见用途

Official doc: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/


Prerequisite Notes - 前提说明

kubectl patch 其实是有合并策略,分别是 [json merge strategic]

其中json指的是JSON Patch, RFC 6902,最明显的特征是json类型字符串,并且带有关键字 "op" 和 "path"

merge指的是JSON Merge Patch, RFC 7386,这种传递的参数也是json类型字符串,但是个人感觉这种合并策略属于是一种约定好的实现规范,直接看参数不能很好地猜出实际产生效果

strategic是kubectl patch默认的合并策略,行为表现是由kubernetes 定义的,具体合并策略效果可以从kubernetes api reference doc(https://kubernetes.io/docs/reference/generated/kubernetes-api/${k8s-version})中查阅(patch strategy / patch merge key)

参数为 --type='strategic': The type of patch being provided; one of [json merge strategic]

官方指引文档中有引用一篇文章描述 json patch 和 json merge的区别,虽然看得很让我迷惑

For a comparison of JSON patch and JSON merge patch, see [rfc:7386 JSON Patch and JSON Merge Patch.]

而利用 json patch 可以实现更为强大的增加/修改/删除行为

简要记录

利用 kubectl patch 批量修改Deployment update strategy

  • 表现行为: replace
spec:
  strategy:
    type: Recreate
    rollingUpdate: null

利用 kubectl patch 修改 service labels

kubectl patch -n demo svc demo-svc --patch '{"metadata": {"labels":{"app": "demo-app"}}}'
  • 表现行为: append

利用 kubectl patch 和 cat 修改 deployment labels

  • 表现行为: append
[root@master44 yamls]# cat patch-labels.yaml
metadata:
 labels:
   app: demo-app
[root@master44 yamls]# kubectl patch -n demo deployments.apps demo-app --patch "$(cat patch-labels.yaml)"

Json patch

json patch虽然语法功能较为灵活强大,但是配合kubectl使用的时候如果出现错误,不会得到具体的错误信息,较为难以快速定位排查(至少kubectl 1.18是这样)

小坑也会比较多,有一定的语法上手成本

例如用Json patch修改有多个container下的deployment的时候,(应该)不能根据container name定向修改某个container的参数,只能通过序号0 / 1 / 2等定向修改

利用Json patch修改容器的livenessProbe/readinessProbe下的failureThreshold等参数的时候,在json中该参数值必须只可以是数字型数字,不能是字符型数值(即不要用双引号扩起来),

否则同样会有"The request is invalid: patch: Invalid value: xxxxx v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.LivenessProbe: v1.Probe.FailureThreshold: readUint32: unexpected character: , error found in #10 byte of" 报错

利用 json patch 移除 deployment labels

https://erosb.github.io/post/json-patch-vs-merge-patch/

[
   {
       "op": "remove",
       "path": "/metadata/labels/test.label.com"
   },
   {
       "op": "remove",
       "path": "/spec/template/metadata/labels/test.label.com"
   }
]

利用 json patch 移除 deployment tolertions

⚠️ 注意利用remove进行移除元素,如果被patch的对象本身就没有tolerations的话,kubectl patch会提示The request is invalid错误

[root@node dir]# cat patch.json
[
   {
       "op": "remove",
       "path": "/spec/template/spec/tolerations"
   }
]
[root@node dir]# kubectl patch -n demo deployments.apps test-deployment --type=json -p="$(cat patch.json)" --dry-run=server
deployment.apps/test-deployment patched

修改容器镜像地址

[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/image",
    "value": "docker.io/dmp-system/test-1:2.5.4.1"
  },
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/1/image",
    "value": "docker.io/dmp-system/test-2:2.5.4"
  },
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/image",
    "value": "docker.io/dmp-system/test-3:2.5.4"
  }
]