Windows10系统上基于Goland开发环境使用client-go
文章目录1. 下载kubectl.exe2. 配置kubeconfig3.安装go4.安装client-go工具包5. 在k8s集群外读取pod资源示例1. 下载kubectl.exe本人使用的下载地址:https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/windows/amd64/kubectl.exe将其存
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
的文件,在其中加入module
和require
两个内容,如图所示:
然后新建你的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
}
执行结果准确:
更多推荐
所有评论(0)