func UpdateNodeLabel(clusterID, nodeName, labelKey, labelVal string) error {
    ctx := context.TODO()
    clientSet, err := GetClientSet(clusterID)
    if err != nil {
        log.Errorf("[UpdateNodeLabel] get clientSet failed, %s", err)
        return err
    }
    node, err := clientSet.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{})
    if err != nil {
        log.Errorf("[UpdateNodeLabel] get node info failed %s", err)
        return err
    }
    labels := node.Labels
    labels[labelKey] = labelVal
    patchData := map[string]interface{}{
        "metadata": map[string]map[string]string{
            "labels": labels,
        },
    }
    playLoadBytes, err := json.Marshal(patchData)
    if err != nil {
        log.Errorf("[UpdateNodeLabel] json marshal to bytes failed %s", err)
        return err
    }
    if _, err := clientSet.CoreV1().Nodes().Patch(ctx, nodeName, types.StrategicMergePatchType, playLoadBytes, metav1.PatchOptions{}); err != nil {
        log.Errorf("[UpdateNodeLabel] update node label failed %s", err)
        return err
    }
    log.Infof("[UpdateNodeLabel] update node %s label %s to %s success!", nodeName, labelKey, labelVal)
    return nil
}