client-go连接kubernetes集群-update相关操作

27 篇文章 3 订阅
15 篇文章 0 订阅

背景:

紧接client-go连接kubernetes集群-connect and listclient-go连接kubernetes集群-create相关操作。实例都是拿namespacedeployment两个为代表进行展开延伸的(个人环境中deployment还是具有代表性的),前面创建了namespace deployment,正常的流程下一步就是修改namespace and deployment 了!

client-go连接kubernetes集群-update相关操作

1. namespace的update

参照create
image.png
先看一眼&corev1.Namespace metav1.ObjectMeta中都有哪些配置可以修改,metav1.ObjectMeta{}填充一下所有字段:
image.png
Name还是默认的zhangpeng namespace了,我添加一个labels?
image.png
image.png
image.png
main.go

package main

import (
	"context"
	"flag"
	"fmt"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
	"path/filepath"
)

func main() {
	var kubeconfig *string
	if home := homedir.HomeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	namespace := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name:                       "zhangpeng",
			GenerateName:               "",
			Namespace:                  "",
			SelfLink:                   "",
			UID:                        "",
			ResourceVersion:            "",
			Generation:                 0,
			CreationTimestamp:          metav1.Time{},
			DeletionTimestamp:          nil,
			DeletionGracePeriodSeconds: nil,
			Labels: map[string]string{
				"dev": "test",
			},
			Annotations:     nil,
			OwnerReferences: nil,
			Finalizers:      nil,
			ClusterName:     "",
			ManagedFields:   nil,
		},
	}
	result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
	fmt.Println(result)
}

运行main.go
image.png
image.png
登录某云后台确认生成label!这里正好看到了自愿配额与限制?正巧最近在看文章的时候看到一个这样的例子:基于client-go操作namespace资源配额设计

2. 扩展一下resourcequotas

main.go

package main

import (
	"context"
	"flag"
	"fmt"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
	"path/filepath"
)

func main() {
	var kubeconfig *string
	if home := homedir.HomeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	namespace := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name:                       "zhangpeng",
			GenerateName:               "",
			Namespace:                  "",
			SelfLink:                   "",
			UID:                        "",
			ResourceVersion:            "",
			Generation:                 0,
			CreationTimestamp:          metav1.Time{},
			DeletionTimestamp:          nil,
			DeletionGracePeriodSeconds: nil,
			Labels: map[string]string{
				"dev": "test",
			},
			Annotations:     nil,
			OwnerReferences: nil,
			Finalizers:      nil,
			ClusterName:     "",
			ManagedFields:   nil,
		},
	}
	result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
	fmt.Println(result)
	quotaTest := clientset.CoreV1().ResourceQuotas("zhangpeng")
	quota := &corev1.ResourceQuota{
		ObjectMeta: metav1.ObjectMeta{
			Name: "quota-namespace",
		},
		Spec: corev1.ResourceQuotaSpec{
			Hard: map[corev1.ResourceName]resource.Quantity{
				corev1.ResourceLimitsCPU:      resource.MustParse("200m"),
				corev1.ResourceLimitsMemory:   resource.MustParse("200M"),
				corev1.ResourceRequestsCPU:    resource.MustParse("1000m"),
				corev1.ResourceRequestsMemory: resource.MustParse("1Gi"),
			},
		},
	}

	result1, err := quotaTest.Create(context.TODO(), quota, metav1.CreateOptions{})
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(result1)
	}
}

image.png

kubectl get resourcequotas -n zhangpeng

image.png

3. update deployment

参照:client-go连接kubernetes集群-create相关操作生成yaml读取文件流的方式
修改nginx镜像tag为1.16
src/yamls/nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
        - image: nginx:1.16
          name: nginx
          resources: {}
status: {}

image.png
现在如果直接运行肯定是already exists的!
image.png
修改main.go如下:

package main

import (
	"context"
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	v1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/yaml"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
	"path/filepath"
)

func main() {
	var kubeconfig *string
	if home := homedir.HomeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	b, err := ioutil.ReadFile("src/yamls/nginx.yaml")
	nginxDep := &v1.Deployment{}
	nginxJson, _ := yaml.ToJSON(b)
	if err = json.Unmarshal(nginxJson, nginxDep); err != nil {
		return
	}
	if _, err = clientset.AppsV1().Deployments("zhangpeng").Update(context.Background(), nginxDep, metav1.UpdateOptions{}); err != nil {
		fmt.Println(err)
		return
	}
}

运行main.go
image.png

kubectl get deployments -n zhangpeng -o yaml

image.png

强调:

  1. context.Background() context.TODO()还是有点懵 分不清什么时候用…
  2. 执行结果的返回没有一致格式化输出,以及一下错误的处理?
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对你无可奈何2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值