在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))
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐