clinet-go 操作deployment

项目地址: https://github.com/zhang19523zhao/zhgolang

写了一些常用的用法、分别为对deployment的创建、删除、更新、获取信息的操作,下面直接上代码。

zhanghao@zhanghaodeMacBook-Air Demo2 % tree
.
├── client
│   └── clientsetInit.go
├── deployments
│   ├── CreateDeploymentYaml.go   
│   ├── DeleteDeployment.go
│   ├── ListDeploymentInfo.go
│   └── UpdateDeployment.go
├── etc
│   └── kube.conf
├── go.mod
├── go.sum
├── main.go
└── yamls
    └── nginx.yaml

Client

clientsetInit.go

package client

import (
	"fmt"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"log"
)

// 定义全局变量输K8sClientset
var K8sClientset *kubernetes.Clientset

func init() {
	configPath := "etc/kube.conf"
	config, err := clientcmd.BuildConfigFromFlags("", configPath)
	if err != nil {
		fmt.Println(err)
	}

	K8sClientset, err = kubernetes.NewForConfig(config)
	if err != nil {
		log.Fatal(err)
	}

}

deployments

CreateDeploymentYaml.go

package deployments

import (
	"context"
	"encoding/json"
	appv1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"os"
	"sigs.k8s.io/yaml"
)

type CreateDplForYaml struct {
	clientset *kubernetes.Clientset
}

func (this *CreateDplForYaml) CreateDep(yamlPath string) error {
	ctx := context.Background()
	Dep := &appv1.Deployment{}

	// 读取yaml内容
	b, err := os.ReadFile(yamlPath)
	if err != nil {
		return err
	}

	// 将yaml 转化成 josn
	depJson, err := yaml.YAMLToJSON(b)
	if err != nil {
		return err
	}

	// 将json 绑定到Dep上
	if err := json.Unmarshal(depJson, Dep); err != nil {
		return err
	}

	if _, err := this.clientset.AppsV1().Deployments("default").Create(ctx, Dep, metav1.CreateOptions{}); err != nil {
		return err
	}

	return nil
}

func NewCreateDplForYaml(clientset *kubernetes.Clientset) *CreateDplForYaml {
	return &CreateDplForYaml{
		clientset: clientset,
	}
}

DeleteDeployment.go

package deployments

import (
	"context"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)

type DeleteDep struct {
	clientset *kubernetes.Clientset
}

func NewDeleteDep(clientset *kubernetes.Clientset) *DeleteDep {
	return &DeleteDep{
		clientset: clientset,
	}
}

// 删除Deployment
func (this *DeleteDep) Delete(dploymentName string) error {
	return this.clientset.AppsV1().Deployments("default").Delete(context.Background(), dploymentName, metav1.DeleteOptions{})
}

ListDeploymentInfo.go

package deployments

import (
	"context"
	"fmt"
	appv1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)

type ListDplInfo struct {
	clientset *kubernetes.Clientset
}

func NewListDplInfo(clientset *kubernetes.Clientset) *ListDplInfo {
	return &ListDplInfo{
		clientset: clientset,
	}
}

func (this *ListDplInfo) GetDep() *appv1.DeploymentList {
	ctx := context.Background()
	listopt := metav1.ListOptions{}
	deploymentList, err := this.clientset.AppsV1().Deployments("default").List(ctx, listopt)
	if err != nil {
		fmt.Println(err)
	}
	return deploymentList
}

// 打印出deployment 名字
func (this *ListDplInfo) Name() {
	depList := this.GetDep()
	// 遍历获取deployment 名字
	for _, deployment := range depList.Items {
		fmt.Println(deployment.Name)
	}
}

// 打印出 deployment 副本数
func (this *ListDplInfo) Replicas() {
	depList := this.GetDep()
	// 遍历获取deployment 名字
	for _, deployment := range depList.Items {
		fmt.Println(deployment.Name,
			deployment.Status.Replicas,            // 总副本数
			deployment.Status.AvailableReplicas,   // 可用副本数
			deployment.Status.UnavailableReplicas, // 不可用副本数
		)
	}
}

UpdateDeployment.go

package deployments

import (
	"context"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)

type UpdateDep struct {
	clientset *kubernetes.Clientset
}

func NewUpdateDep(clientset *kubernetes.Clientset) *UpdateDep {
	return &UpdateDep{
		clientset: clientset,
	}
}

// 这里修改Replicas 副本数为例
func (this *UpdateDep) UpdateReplicas(depName string, num int32) error {
	ctx := context.Background()
	dep, err := this.clientset.AppsV1().Deployments("default").Get(ctx, depName, metav1.GetOptions{})
	if err != nil {
		return err
	}
	// 修改副本数
	dep.Spec.Replicas = &num
	_, err = this.clientset.AppsV1().Deployments("default").Update(ctx, dep, metav1.UpdateOptions{})

	return err
}

main.go

package main

import (
	"Demo2/client"
	"Demo2/deployments"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main() {
	clientset := client.K8sClientset

	deplist := deployments.NewListDplInfo(clientset)
	//获取 deployment 名字
	deplist.Name()
	//打印deployment 副本数
	deplist.Replicas()

	// 根据yaml创建deployment
	depcreate := deployments.NewCreateDplForYaml(clientset)
	fmt.Println(depcreate.CreateDep("yamls/nginx.yaml"))

	fmt.Println(clientset.AppsV1().Deployments("default").Delete(context.Background(), "web1", metav1.DeleteOptions{}))

	// 更新deployment的副本数
	deployments.NewUpdateDep(clientset).UpdateReplicas("web1", 3)
	deplist.Replicas()
	ployments.NewCreateDplForYaml(clientset)
	fmt.Println(depcreate.CreateDep("yamls/nginx.yaml"))

	fmt.Println(clientset.AppsV1().Deployments("default").Delete(context.Background(), "web1", metav1.DeleteOptions{}))

	// 更新deployment的副本数
	deployments.NewUpdateDep(clientset).UpdateReplicas("web1", 3)
	deplist.Replic
}

视频演示