记一次client-go接口使用问题:动态修改PVC的存储大小
在k8s集群中如何通过client-go的接口来动态修改PVC的存储大小呢?笔者开始时调用了其update接口,但是发现日志中会出现错误信息:PVC的spec是不可修改的;后面将接口换成patch,但是在调用patch接口时需要指定PatchType,PatchType分为四种:JSONPatchType、MergePatchType、StrategicMergePatchType和Apply
·
在k8s集群中如何通过client-go的接口来动态修改PVC的存储大小呢?笔者开始时调用了其update接口,但是发现日志中会出现错误信息:PVC的spec是不可修改的;后面将接口换成patch,但是在调用patch接口时需要指定PatchType,PatchType分为四种:JSONPatchType、MergePatchType、StrategicMergePatchType和ApplyPatchType。MergePatchType和StrategicMergePatchType对于修改PVC的存储大小是不起作用的,ApplyPatchType需要执行FieldManager,最终选择了JSONPatchType。这里JSONPatchType还需要注意以下几点:
- 使用JSONPatchType,那么数据的格式必须按照[{“op”:“XXX”,“path”:“xxx”,“value”:“xxx”}]格式来拼接,其中op的值分为三种:add、remove、replace,path表示待修改的数据的属性的路径,value表示修改后的值
- 数据是一个数组的形式
- 在拼接数据时可以使用fmt.Sprintf([{“op”:“XXX”,“path”:“xxx”,“value”:“xxx”}]),但是这样需要注意双引号等格式问题,稍不注意程序就会收到不能将数据映射为jsonpatch.patch的go数据类型
下面给出测试成功的示例:
这里还需要注意一点PVC只能扩容不能缩容
found := &v1.PersistentVolumeClaim{}
err := c.Get(context.TODO(), types.NamespacedName{Name: pvc.Name, Namespace: pvc.Namespace}, found)
if err != nil {
...
}
type PatchValue struct {
Op string `json:"op"`
Path string `json:"path"`
Value interface{} `json:"value"`
}
var patchDatas []interface{}
patchData := PatchValue{
Op: "replace",
Path: "/spec/resources/requests/storage"
Value: "10Gi"
}
patchDatas = append(patchDatas, patchData)
data, err := json.Marshal(patchDatas)
err := c.Patch(context.Background(), found.DeepCopy(), client.RawPatch(type.JSONPatchType, data))
更多推荐
已为社区贡献2条内容
所有评论(0)