• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    使用client-go工具调用kubernetes API接口的教程详解(v1.17版本)
    POST TIME:2021-10-18 16:59

    说明

    可以调取k8s API 接口的工具有很多,这里我就介绍下client-go

    gitlab上client-go项目地址: https://github.com/kubernetes/client-go  

    这个工具是由kubernetes官方指定维护的,大家可以放心使用

    效果

    运行完成后,可以直接获取k8s集群信息等

    实现

    1、拉取工具源码

    注意事项:https://github.com/kubernetes/client-go/blob/master/INSTALL.md

    总结:一定要拉取跟集群对应版本的工具源码,比如我这里集群是1.17版本,那我就拉取17版本

    go get k8s.io/client-go@v0.17.0

    我是1.17版本的集群,所有依赖文件放在这了,可以直接使用client-go k8s1.17 api

    2、创建目录结构

    集群的角色配置文件(默认在/root/.kube/config)
    kube/config

    查询代码实例

    查询pod信息

    查看ferry命名空间下pod的信息,pod名字、pod的IP

    vim kube-api.go

    package main
    
    import (
    	"fmt"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    
    	"k8s.io/client-go/kubernetes"
    
    	"k8s.io/client-go/tools/clientcmd"
    )
    
    func main() {
    
    	config, err := clientcmd.BuildConfigFromFlags("", "kube/config")
    	if err != nil {
    		panic(err)
    	}
    	client, _ := kubernetes.NewForConfig(config)
    	pods ,err := client.CoreV1().Pods("ferry").List(metav1.ListOptions{})
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	for _,v := range  pods.Items {
    		fmt.Printf(" 命名空间是:%v\n pod名字:%v\n IP:%v\n\n",v.Namespace,v.Name,v.Status.PodIP)
    	}
    }

    自动关联依赖

    go mod tidy

    运行结果

    $ go run kube-api.go

     命名空间是:ferry
     pod名字:ferry-backend-7949596679-h8lxb
     IP:10.42.1.14

     命名空间是:ferry
     pod名字:ferry-mysql-8db8d49f7-6psbv
     IP:10.42.1.11

    查询一个pod是否在一个命名空间下

    https://github.com/kubernetes/client-go/blob/master/examples/in-cluster-client-configuration/main.go
    每3秒检查下nginx-74959fc858-cp48w是否在default命名空间下

    package main
    
    import (
    	"context"
    	"fmt"
    	"k8s.io/apimachinery/pkg/api/errors"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/client-go/kubernetes"
    	"k8s.io/client-go/tools/clientcmd"
    	"time"
    )
    
    func main() {
    
    	config, err := clientcmd.BuildConfigFromFlags("", "kube/config")
    	if err != nil {
    		panic(err)
    	}
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		panic(err.Error())
    	}
    	for {
    		// get pods in all the namespaces by omitting namespace
    		// Or specify namespace to get pods in particular namespace
    		pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    		if err != nil {
    			panic(err.Error())
    		}
    		fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    
    		// Examples for error handling:
    		// - Use helper functions e.g. errors.IsNotFound()
    		// - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message
    		_, err = clientset.CoreV1().Pods("default").Get(context.TODO(), "nginx-74959fc858-cp48w", metav1.GetOptions{})
    		if errors.IsNotFound(err) {
    			fmt.Printf("Pod nginx-74959fc858-cp48w not found in default namespace\n")
    		} else if statusError, isStatus := err.(*errors.StatusError); isStatus {
    			fmt.Printf("Error getting pod %v\n", statusError.ErrStatus.Message)
    		} else if err != nil {
    			panic(err.Error())
    		} else {
    			fmt.Printf("Found nginx-74959fc858-cp48w pod in default namespace\n")
    		}
    
    	 time.Sleep(3 * time.Second)
    	}
    }

    运行结果

    $ go run kube-api.go
    There are 22 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 22 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 22 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 23 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 22 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 22 pods in the cluster
    Found nginx-74959fc858-cp48w pod in default namespace
    There are 21 pods in the cluster
    \\在集群种手动删除了这个pod
    Pod nginx-74959fc858-cp48w not found in default namespace
    There are 21 pods in the cluster
    Pod nginx-74959fc858-cp48w not found in default namespace

    查询deployment服务类型信息

    查询default命名空间下的deployment服务信息,服务名字、服务副本数

    package main
    
    import (
    	"fmt"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    
    	"k8s.io/client-go/kubernetes"
    
    	"k8s.io/client-go/tools/clientcmd"
    )
    
    func main() {
    
    	config, err := clientcmd.BuildConfigFromFlags("", "kube/config")
    	if err != nil {
    		panic(err)
    	}
    	client, _ := kubernetes.NewForConfig(config)
    	deploymentList, err := client.AppsV1().Deployments("default").List(metav1.ListOptions{})
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	for _,v := range deploymentList.Items {
    		fmt.Printf(" 命名空间是:%v\n deployment服务名字:%v\n 副本个数:%v\n\n",v.Namespace,v.Name,v.Status.Replicas)
    	}
    
    }

    运行结果

    $ go run kube-api.go
     命名空间是:default
     deployment服务名字:nginx
     副本个数:2

    创建deployment资源

    https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-deployment/main.go

    复制一个config文件到当前目录下

    创建一个deployment类型的nginx服务

    vim deployment-create.go

    package main
    
    import (
    	"context"
    	"flag"
    	"fmt"
    
    	"path/filepath"
    
    	appsv1 "k8s.io/api/apps/v1"
    	apiv1 "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"
    	//
    	// Uncomment to load all auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth"
    	//
    	// Or uncomment to load specific auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
    )
    
    func main() {
    	var kubeconfig *string
    	if home := homedir.HomeDir(); home != "" {
    		kubeconfig = flag.String("kubeconfig", filepath.Join("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)
    	}
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		panic(err)
    	}
    
    	deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
    
    	deployment := appsv1.Deployment{
    		ObjectMeta: metav1.ObjectMeta{
    			Name: "nginx-deployment",
    		},
    		Spec: appsv1.DeploymentSpec{
    			Replicas: int32Ptr(2),
    			Selector: metav1.LabelSelector{
    				MatchLabels: map[string]string{
    					"app": "nginx",
    				},
    			},
    			Template: apiv1.PodTemplateSpec{
    				ObjectMeta: metav1.ObjectMeta{
    					Labels: map[string]string{
    						"app": "nginx",
    					},
    				},
    				Spec: apiv1.PodSpec{
    					Containers: []apiv1.Container{
    						{
    							Name:  "web",
    							Image: "nginx:1.12",
    							Ports: []apiv1.ContainerPort{
    								{
    									Name:          "http",
    									Protocol:      apiv1.ProtocolTCP,
    									ContainerPort: 80,
    								},
    							},
    						},
    					},
    				},
    			},
    		},
    	}
    
    	// Create Deployment
    	fmt.Println("Creating deployment nginx...")
    	result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{})
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
    
    }

    运行结果

    $ go run deployment-create.go
    Creating deployment nginx...
    Created deployment "nginx-deployment".

    更新deployment类型服务

    https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-deployment/main.go
    更改服务的副本数,由上一步创建的2修改成1,并修改镜像由nginx1.12–>nginx1.13

    package main
    
    import (
    	"context"
    	"flag"
    	"fmt"
    	"path/filepath"
    
    	apiv1 "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"
    	"k8s.io/client-go/util/retry"
    	//
    	// Uncomment to load all auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth"
    	//
    	// Or uncomment to load specific auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
    )
    
    func main() {
    	var kubeconfig *string
    	if home := homedir.HomeDir(); home != "" {
    		kubeconfig = flag.String("kubeconfig", filepath.Join("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)
    	}
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		panic(err)
    	}
    
    	deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
    
    	retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
    		// Retrieve the latest version of Deployment before attempting update
    		// RetryOnConflict uses exponential backoff to avoid exhausting the apiserver
    		result, getErr := deploymentsClient.Get(context.TODO(), "nginx-deployment", metav1.GetOptions{})
    		if getErr != nil {
    			panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr))
    		}
    
    		result.Spec.Replicas = int32Ptr(1)                           // reduce replica count
    		result.Spec.Template.Spec.Containers[0].Image = "nginx:1.13" // change nginx version
    		_, updateErr := deploymentsClient.Update(context.TODO(), result, metav1.UpdateOptions{})
    		return updateErr
    	})
    	if retryErr != nil {
    		panic(fmt.Errorf("Update failed: %v", retryErr))
    	}
    	fmt.Println("Updated deployment nginx")
    
    }
    func int32Ptr(i int32) *int32 { return i }

    运行结果

    $ go run deployment-update.go
    Updated deployment nginx

    删除deployment类型服务

    删除上面创建的nginx-deployment资源,删除之前添加了确认语句

    package main
    
    import (
    	"bufio"
    	"context"
    	"flag"
    	"fmt"
    	"os"
    	"path/filepath"
    
    	apiv1 "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"
    	//
    	// Uncomment to load all auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth"
    	//
    	// Or uncomment to load specific auth plugins
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
    	// _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
    )
    
    func main() {
    	var kubeconfig *string
    	if home := homedir.HomeDir(); home != "" {
    		kubeconfig = flag.String("kubeconfig", filepath.Join( "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)
    	}
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		panic(err)
    	}
    
    	deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
    
         prompt()
    	fmt.Println("Deleting deployment nginx...")
    	deletePolicy := metav1.DeletePropagationForeground
    	if err := deploymentsClient.Delete(context.TODO(), "nginx-deployment", metav1.DeleteOptions{
    		PropagationPolicy: deletePolicy,
    	}); err != nil {
    		panic(err)
    	}
    	fmt.Println("Deleted deployment.")
    }
    
    func prompt() {
    	fmt.Printf("-> Press Return key to continue, will delete!")
    	scanner := bufio.NewScanner(os.Stdin)
    	for scanner.Scan() {
    		break
    	}
    	if err := scanner.Err(); err != nil {
    		panic(err)
    	}
    	fmt.Println()
    }
    
    func int32Ptr(i int32) *int32 { return i }

    运行结果

    $ go run deployment-delete.go
    -> Press Return key to continue, will delete! 这里点击回车后继续删除资源

    Deleting deployment nginx...
    Deleted deployment.

    到此这篇关于使用client-go工具调kubernetes API接口(v1.17版本)的文章就介绍到这了,更多相关client-go调用kubernetes API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Django mysqlclient安装和使用详解
    • golang使用http client发起get和post请求示例
    • Django单元测试工具test client使用详解
    • Golang 使用http Client下载文件的实现方法
    • PHP使用mongoclient简单操作mongodb数据库示例
    • 使用httpclient实现免费的google翻译api
    上一篇:Go语言安装和GoLand2021最全超详细安装教程
    下一篇:Go的固定时长定时器和周期性时长定时器
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信