官网:https://github.com/kubernetes-client/go/tree/master/kubernetes

https://github.com/kubernetes/client-go
https://github.com/kubernetes/client-go/tree/v0.21.0
https://pkg.go.dev/k8s.io/client-go/kubernetes

go mod init k8sclient

go get k8s.io/client-go/kubernetes@v0.21.0
go get k8s.io/client-go@v0.21.0


kubectl api-resources

代码展示

package main

import (
    "context"
    "fmt"
    appsV1 "k8s.io/api/apps/v1"
    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"
    "log"
    "reflect"
)

func Createdeployment(clientset *kubernetes.Clientset)  {
    var replicas int32 =1
    namespace := "enos"
    deployment := &appsV1.Deployment{
        ObjectMeta: metaV1.ObjectMeta{
            Name: "nginx",
            Labels: map[string]string{
                "app":"nginx",
                "env":"dev",
            },
        },
        Spec: appsV1.DeploymentSpec{
            Replicas: &replicas,
            Selector: &metaV1.LabelSelector{
                MatchLabels: map[string]string{
                    "app":"nginx",
                    "env":"dev",
                },
            },
            Template: coreV1.PodTemplateSpec{
                ObjectMeta: metaV1.ObjectMeta{
                    Name: "nginx",
                    Labels: map[string]string{
                        "app": "nginx",
                        "env": "dev",
                    },
                },
                Spec: coreV1.PodSpec{
                    Containers: []coreV1.Container{
                        {
                            Name: "nginx",
                            Image: "nginx:1.16.1",
                            Ports: []coreV1.ContainerPort{
                                {
                                    Name: "http",
                                    Protocol: coreV1.ProtocolTCP,
                                    ContainerPort: 80,
                                },
                            },
                        },
                    },
                },
            },
        },
    }
    deployment1,err := clientset.AppsV1().Deployments(namespace).Create(context.TODO(),deployment,metaV1.CreateOptions{})
    fmt.Println(err,deployment1)
}

func CreateService(clientset *kubernetes.Clientset)  {
    namespace := "default"
    service := &coreV1.Service{
        ObjectMeta: metaV1.ObjectMeta{
            Name: "nginx-service",
            Labels: map[string]string{
                "env":"env",
            },
        },
        Spec: coreV1.ServiceSpec{
            Type: coreV1.ServiceTypeNodePort,
            Selector: map[string]string{
                "env":"dev",
                "app":"nginx",
            },
            Ports: []coreV1.ServicePort{
                {
                    Name: "http",
                    Port: 80,
                    Protocol: coreV1.ProtocolTCP,
                },
            },
        },
    }
    service1,err := clientset.CoreV1().Services(namespace).Create(context.TODO(),service,metaV1.CreateOptions{})
    fmt.Println(service1,err)
}

func editdeployment(clientset *kubernetes.Clientset)  {
    name :="nginx"
    namespace:="enos"
    var replicas int32 =2

    deployment,err := clientset.AppsV1().Deployments(namespace).Get(context.TODO(),name,metaV1.GetOptions{})
    deployment.Spec.Replicas = &replicas
    deployment.Spec.Template.Spec.Containers[0].Image = "nginx:1.14"
    deployment,err = clientset.AppsV1().Deployments(namespace).Update(context.TODO(),deployment,metaV1.UpdateOptions{})
    fmt.Println(err,deployment)
}

func editscaledeployment(clientset *kubernetes.Clientset) {
    name :="nginx"
    namespace:="enos"
    scale,_ := clientset.AppsV1().Deployments(namespace).GetScale(context.TODO(),name,metaV1.GetOptions{})
    //fmt.Println(err)
    scale.Spec.Replicas = 1
    scale,_ = clientset.AppsV1().Deployments(namespace).UpdateScale(context.TODO(),name,scale,metaV1.UpdateOptions{})
}

func deleteDeployment(clientset *kubernetes.Clientset)  {
    name :="nginx"
    namespace:="enos"
    clientset.AppsV1().Deployments(namespace).Delete(context.TODO(),name,metaV1.DeleteOptions{})
}

func deleteService(clientset *kubernetes.Clientset)  {
    namespace := "default"
    servicename:= "nginx-service"
    clientset.CoreV1().Services(namespace).Delete(context.TODO(),servicename,metaV1.DeleteOptions{})
}

func main()  {
    configPath := "conf/kube.conf"
    config,err := clientcmd.BuildConfigFromFlags("",configPath)
    if err != nil {
        log.Fatal(err)
    }
    clientset,err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatal(err)
    }
    nodeList,err := clientset.CoreV1().Nodes().List(context.TODO(),metaV1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }
    for _,node := range nodeList.Items{
        fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
            node.Name,
            node.Status.Phase,
            node.Status.Addresses,
            node.Status.NodeInfo.OSImage,
            node.Status.NodeInfo.KubeletVersion,
            node.Status.NodeInfo.OperatingSystem,
            node.Status.NodeInfo.Architecture,
            node.CreationTimestamp,
            )
    }

    fmt.Println("=====Namespaces==============")
    namespaceList,_ := clientset.CoreV1().Namespaces().List(context.TODO(),metaV1.ListOptions{})
    for _,namespace := range namespaceList.Items {
        fmt.Println(namespace.Name,namespace.CreationTimestamp,namespace.Status.Phase)
    }
    fmt.Println("=====Service==============")
    // 名称空间传空,默认所以
     servicesList,_ := clientset.CoreV1().Services("").List(context.TODO(),metaV1.ListOptions{})

    for _,service := range servicesList.Items {
        fmt.Println(service.Name,service.Spec.Type,service.CreationTimestamp,service.Spec.ClusterIP,service.Spec.Ports)
    }
    fmt.Println("=====deployments==============")
    deploymentList,_ := clientset.AppsV1().Deployments("").List(context.TODO(),metaV1.ListOptions{})
    for _,deployment := range deploymentList.Items {
        fmt.Println(deployment.Namespace,deployment.Name,deployment.Spec.Selector.MatchLabels,deployment.Status.Replicas,deployment.Status.AvailableReplicas)
    }

    fmt.Println("zifu 的数据类型是:",reflect.TypeOf(clientset))

    //    create deployment
    // Createdeployment(clientset)

    // create service
    //CreateService(clientset)

    // editdeployment
    //editdeployment(clientset)
    //editscaledeployment(clientset)

    // deleteDeployment
    //deleteDeployment(clientset)
    deleteService(clientset)

    //扩展 ingress
    //clientset.ExtensionsV1beta1().Ingresses()
}

 获取链接的另一种

package main

import (
    "context"
    "flag"
    "fmt"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "k8s.io/klog"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    "path/filepath"
)

func main()  {
    var kubeConfig *string
    ctx := context.Background()
    if home := homedir.HomeDir(); home != "" {
        kubeConfig = flag.String("kubeConfig",filepath.Join(home,".kube","config"),"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 {
        klog.Fatal(err)
        return
    }
    clientSet,err := kubernetes.NewForConfig(config)
    if err != nil {
        klog.Fatal(err)
        return
    }
    namespaceList,err:=clientSet.CoreV1().Namespaces().List(ctx,metav1.ListOptions{})
    if err != nil {
        return
    }
    namespaces := namespaceList.Items
    for _,ns := range namespaces {
        fmt.Println(ns.Name)
    }
}
View Code

 

监听事件(Informers)

依赖

module Informers

go 1.16

require (
    k8s.io/api v0.23.4 // indirect
    k8s.io/apimachinery v0.23.4 // indirect
    k8s.io/client-go v0.22.0 // indirect
    k8s.io/klog v1.0.0 // indirect
)

代码

package main

import (
    "fmt"
    "k8s.io/client-go/informers"
    "k8s.io/api/apps/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/cache"
    "k8s.io/apimachinery/pkg/labels"
    "k8s.io/klog"

    "time"
)

func main()  {
    conf := ""
    clientSet,err := kubernetes.NewForConfig(conf)
    if err != nil {
        panic(err)
        return
    }
    informerFactory := informers.NewSharedInformerFactory(clientSet,30*time.Second)
    deployInformer := informerFactory.Apps().V1().Deployments()
    informer := deployInformer.Informer()
    deployLister:= deployInformer.Lister()
    informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: onAdd,
        UpdateFunc: onUpdate,
        DeleteFunc: onDelete,

    })
    stopper := make(chan struct{})
    defer close(stopper)
    //启动Informer List & Watch
    informerFactory.Start(stopper)
    // 等待所有的Informer缓存同步
    informerFactory.WaitForCacheSync(stopper)
    deployments,err:=deployLister.Deployments("default").List(labels.Everything())
    for index,deploy := range deployments {
        fmt.Printf("%d -> %s\n",index,deploy)
    }
    <-stopper
}

func onAdd(obj interface{})  {
    deploy := obj.(*v1.Deployment)
    klog.Infoln("add a deploy: ",deploy.Name)
}

func onUpdate(old,new interface{})  {
    oldDeploy:= old.(*v1.Deployment)
    newDeploy:= old.(*v1.Deployment)
    klog.Infoln("update deploy: ",oldDeploy.Spec.Replicas,newDeploy.Spec.Replicas)
}

func onDelete(obj interface{})  {
    deploy := obj.(*v1.Deployment)
    klog.Infoln("delete a deploy: ",deploy.Name)
}
View Code

 

posted on 2022-03-15 22:47  可口_可乐  阅读(1536)  评论(0)    收藏  举报