基于Client-go访问Kubernetes API
# 基于Client-go访问Kubernetes API
# client-go的环境
可以使用Windows操作系统,也可以使用Linux的操作系统。需要安装Go语言的环境,配置变量环境。 根据使用的Kubernetes集群版本下载相对于的client-go的包。
😶🌫️Golang官网下载地址😶🌫️ (opens new window)
😈Client-go项目地址😈 (opens new window)
# Linux环境:
1.下载安装包,解压至 usr/local
目录。
[root@k8s-master ~]# wget https://go.dev/dl/go1.18.1.linux-amd64.tar.gz
[root@k8s-master ~]# tar zxvf go1.18.1.linux-amd64.tar.gz -C /usr/local/
2.配置变量
[root@k8s-master ~]# vim /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
"/etc/profile" 78L, 1879C written
[root@k8s-master ~]# source /etc/profile
[root@k8s-master ~]# go version
go version go1.18.1 linux/amd64
# Windows环境:
这里使用Goland的IDE。
go get k8s.io/client@v0.23.6
go mod init
go mod tidy
注意: 如果有时候没有导入包需要使用该模块的时候,使用go mod tidy 再下载包。 也可以直接拉取github的client-go到本地,就不需要下载包。
# 调用 Kubernetes API
# 查看k8s资源
当前的default命名空间下面有一个test的pod在运行。
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 13h
# 使用RESTclient
这里使用restclient的接口,调用Kubernetes的接口测试查看Pod资源。
package main
import (
"context"
v1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// 查看Pod资源
func main() {
// config 读取config的配置文件,这里使用的RecommendedHomeFile 默认读取文件$HOME/.kube/config
// 如果没有得到信息就返回 err
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
panic(err)
}
// 这里配置config定义GroupVersion
// 这里配置config还需要定义API的路径
config.GroupVersion = &v1.SchemeGroupVersion
config.NegotiatedSerializer = scheme.Codecs
config.APIPath = "/api"
// client 引用一个客户端需要使用config文件 假如config是空的就会返回err
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err)
}
// get data 这里需要将pod定义到v1.Pod{}类型
pod := v1.Pod{}
// err 此处是等于按照该条件去寻找他的资源,如果有这个资源就会传进pod这个变量中,并且配置错误判断
err = restClient.Get().Namespace("default").Resource("pods").Name("test").Do(context.TODO()).Into(&pod)
if err != nil {
println(err)
} else {
println(pod.Name)
}
}
返回的结果为:
test
# 使用Clientset
使用clientset的方式访问Kubernetes的API接口,这里相当于 使用clienttest.CoreV1()
该函数。 重新定义一个新的变量,然后使用该接口的资源。
注意: 还是一样,运行报错就在当前的目录
go mod tidy
package main
import (
"context"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// 这里是配置连接文件 config
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
panic(err)
}
// 这里是配置引用config文件
clienttest, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
// 因为pod的资源是在CoreV1里面,Pod控制器的资源是在AppsV1的资源里面。
corev1 := clienttest.CoreV1()
pod, err := corev1.Pods("default").Get(context.TODO(), "test", v1.GetOptions{})
if err != nil {
println(err)
} else {
println(pod.Name)
}
}
返回的结果为:
test
上次更新: 2023/11/28, 22:03:59