K8S client-go Patch

1. client-go 安装

$ go get k8s.io/client-go/…

$ go get -u k8s.io/apimachinery/…

2. 在 k8s 集群外操作资源

func main() {

	// 配置 k8s 集群外 kubeconfig 配置文件
	var kubeconfig *string
	kubeconfig = flag.String("kubeconfig", "/Users/zhaojiahui/.kube/qz-ci.conf",
		"absolute path to the kubeconfig file")
	flag.Parse()

	//在 kubeconfig 中使用当前上下文环境,config 获取支持 url 和 path 方式
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// 根据指定的 config 创建一个新的 clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	//连接成功,然后就可以随意操作资源了!
	//如更新node标签,具体实现见下
	coreV1 := clientset.CoreV1()
	UpdateNodeLabels(coreV1,"19.177.16.24","level","red")
}

3. 在 k8s 集群内操作资源

func main() {
	
	// 通过集群内部配置创建 k8s 配置信息,通过 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT 环境变量方式获取
	// 若集群使用 TLS 认证方式,则默认读取集群内部 tokenFile 和 CAFile
	config, err := rest.InClusterConfig()
	if err != nil {
		log.Fatal(err)
	}
	
	// 根据指定的 config 创建一个新的 clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		log.Fatal(err)
	}
	//连接成功,然后就可以随意操作资源了!
	//如List所有node上的标签
	nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
	for _, node := range nodes.Items {
		log.Printf("Name: %s Labels: %s\n", node.ObjectMeta.Name,
			node.Labels)
	}
	
	if err != nil {
		log.Fatal(err)
	}
}

4. Patch更新Node

//更新node标签
func UpdateNodeLabels(coreV1 v1.CoreV1Interface, nodeName string, labelKey string, labelNewValue string) {

	ctx := context.TODO()
	node, err := coreV1.Nodes().Get(ctx, nodeName, metav1.GetOptions{})
	if err != nil {
		log.Printf("[ModifyNodeLabels] modify node %v  fail %v\n", nodeName, err)

	}
	labels := node.Labels
	labels[labelKey] = labelNewValue

	patchData := map[string]interface{}{"metadata": map[string]map[string]string{"labels": labels}}
	playLoadBytes, _ := json.Marshal(patchData)

	_, err = coreV1.Nodes().Patch(ctx, nodeName, types.StrategicMergePatchType, playLoadBytes, metav1.PatchOptions{})
	if err != nil {
		log.Printf("[ModifyNodeLabels] %v node Patch fail %v\n", nodeName, err)
		log.Printf("error:%s", err)
	}

	log.Printf("modify node %s label %s to %s", nodeName, labelKey, labelNewValue)
}
//调用方法见上第二节
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值