HAOJX

clientset中patch操作-策略性补丁之替换

字数统计: 465阅读时长: 2 min
2021/12/01 Share

这个是官方文档的说明

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//假设下面的前端提交的
import(
....
"k8s.io/apimachinery/pkg/util/json"
)

func main(){

ctx:=context.Background()

//create clientset
clientset:=config.NewK8sConfig().InitClient()

var mygo ,err = clientset.AppsV1().Deployments("default").
Get(ctx,"mygott",metav1.GetOptions{})

//假设这个是前端提交的
frontPost:= map[string]interface{}{
"spec":map[string]interface{}{
"replicas":1,
}
}

b,err:=json.Marshal(frontPost)
if err != nil {log.Fatal(err)}

_,err=clientset.AppsV1().Deployments(mygo.Namespace).
Patch(ctx,mygo.Name,types.StrategicMergePatchType,b,metav1.PatchOptions{})
}

if err !=nil {
log.Fatalln(err)
}

fmt.Println("patch success!!")

对于spec来说 下面的containers这个字段 他的默认策略是merge 以name做为key来进行合并 也就是说 当没有这个containers的时候 他会增加

删除操作

这个官网的说明

https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md

这个文档说明的很全 下面就举个简单的例子去说明下

patch的策略有下面几个

  • replace
  • merge
  • delete
  • delete from primitive list

我们用

1
$patch: delete

来更改默认的merge策略

改成delete策略

下面是个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main

import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/json"
"kube-base3/lib/kubeConfig"
"log"
)

func main() {
ctx := context.Background()
client := kubeConfig.InitClient()

mydep, err := client.AppsV1().Deployments("default").Get(ctx, "myapp-deploy", metav1.GetOptions{})
if err != nil {
log.Fatal(err)
}
//frontPost := map[string]interface{}{
// "spec": map[string]interface{}{
// "replicas": 4,
// },
//}
frontPost := map[string]interface{}{
"spec": map[string]interface{}{
"template": map[string]interface{}{
"spec": map[string]interface{}{
"containers": []map[string]interface{}{
{
"$patch": "delete",
"name": "redis",
//"image": "redis:5-alpine",
},

},
},
},
},
}
b, err := json.Marshal(frontPost)
if err != nil {
log.Fatal(err)
}
_, err = client.AppsV1().Deployments(mydep.Namespace).Patch(ctx, mydep.Name, types.StrategicMergePatchType, b, metav1.PatchOptions{})
if err != nil {
log.Fatal(err)
}
fmt.Println("patch success")
}

这样就能指定名称为redis的容器从pod中删除

CATALOG
  1. 1. 删除操作