1. 下载kubectl.exe

本人使用的下载地址:
https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/windows/amd64/kubectl.exe

将其存放某一目录下(本人路径为C:\kube\kubectl.exe),并添加环境变量:
在这里插入图片描述
在这里插入图片描述
打开命令行窗口,输入kubectl命令测试一下是否work:
在这里插入图片描述

2. 配置kubeconfig

此处所说的配置kubeconfig并不是真正对一个真是存在的kubeconfig文件进行配置。在使用kubectl这种方式从一个client(Linux,Max,Windows都可以)上访问k8s集群时,kubectl的正确运行依赖于一个配置文件,改配置文件的内容可以从k8s集群的control-plane,也就是Master节点上获取。在k8s集群的Master节点上,文件/etc/kubernetes/admin.conf和文件$HOME/.kube/config的内容相同,也正是我们需要的内容。读者可以选择使用scp指令,或者直接将文件内容拷贝到client节点的home/.kube/config文件。此处的home值读者根据自己的电脑设置来确定,可以尝试在运行kubectl config ...指令,那么系统会在相应路径下生成.kube目录(Windows10系统是这样的),而后将config文件放置其中即可。这一步做的事情也就是下面指令:

scp root@<control-plane-host>:/etc/kubernetes/admin.conf home/.kube/config
kubectl get nodes # 测试配置是否成功

可以参考官方教程:Controlling your cluster from machines other than the control-plane node
我们来测试一下:
在这里插入图片描述
这一步使用到的k8s集群,是本人在此之前搭建而成的,具体的搭建流程可以参考基于kubeadm在3台CentOS 7.6虚拟机上搭建K8s集群

3.安装go

本人下载了go1.14.4.windows-amd64.msi
直接点击安装,一路next,系统环境变量中会自动加入C:\Go

4.安装client-go工具包

本人使用的是Goland集成开发环境,如果有和本人相同选择的读者可以和按照如下办法安装client-go
在这里插入图片描述
在工程中新建一个名为go.mod的文件,在其中加入modulerequire两个内容,如图所示:
在这里插入图片描述
然后新建你的main.go文件,就可以在程序中调用clien-go工具包了。在第一次运行程序后,client-go工具包的相关组件就会被自动拽取到本地环境中。只是此后所有需要用到client-go的程序中都须加入go.mod文件。

5. 在k8s集群外读取pod资源示例

package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"path/filepath"
	"time"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	// 配置 k8s 集群外 kubeconfig 配置文件
	var kubeconfig *string
	if home := 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()

	//在 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())
	}
	for {
		// 通过实现 clientset 的 CoreV1Interface 接口列表中的 PodsGetter 接口方法 Pods(namespace string)返回 PodInterface
		// PodInterface 接口拥有操作 Pod 资源的方法,例如 Create、Update、Get、List 等方法
		// 注意:Pods() 方法中 namespace 不指定则获取 Cluster 所有 Pod 列表
		pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
		if err != nil {
			panic(err.Error())
		}
		fmt.Printf("There are %d pods in the k8s cluster\n", len(pods.Items))

		// 获取指定 namespace 中的 Pod 列表信息
		namespace := "kube-system"
		pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
		if err != nil {
			panic(err)
		}
		fmt.Printf("\nThere are %d pods in namespaces %s\n", len(pods.Items), namespace)
		for _, pod := range pods.Items {
			fmt.Printf("Name: %s, Status: %s, CreateTime: %s\n", pod.ObjectMeta.Name, pod.Status.Phase, pod.ObjectMeta.CreationTimestamp)
		}
		time.Sleep(3 * time.Second)
	}
}

func prettyPrint(maps map[string]interface{}) {
	lens := 0
	for k, _ := range maps {
		if lens <= len(k) {
			lens = len(k)
		}
	}
	for key, values := range maps {
		spaces := lens - len(key)
		v := ""
		for i := 0; i < spaces; i++ {
			v += " "
		}
		fmt.Printf("%s: %s%v\n", key, v, values)
	}
}

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}

执行结果准确:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐