Clientset 访问 k8s 集群资源对象
Client-go 是一个调用 k8s 集群资源对象 API 的客户端,及通过 Client-go 实现对资源对象的增删改查(CRUD).四类客户端:RestClient, ClientSet, DynamicClient, DiscoveryClient(此处只介绍 ClientSet 的用法)。
一,Clientset —— out of cluster
通过 config 文件让集群外部的应用可以访问到集群内部的资源对象 。
1, 配置 config 文件(把 master 上的配置文件复制到本地)
// 在本地执行
$ scp -r centos@10.20.9.60:/home/centos/.kube /home/ldsdsy/
// 此时 ~ 目录下会多一个 .kube 文件夹,里面包含 config 文件
2, 编写代码
package main
import (
"context"
"flag"
"fmt"
"path/filepath"
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"
)
func main() {
var kubeconfig *string
// 默认会从 ~/.kube/config 路径下获取配置文件
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absulute path to the kubeconfig file")
}
// 把用户传递的命令行参数解析为对应变量的值
flag.Parse()
// 使用 k8s.io/client-go/tools/clientcmd 生成 config 的对象
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// 使用 k8s.io/client-go/kubernetes 生成一个 ClientSet 的客户端
// 客户端生成后,就可以使用这个客户端与 k8s API server 进行交互了,进行 CRUD 操作。
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// get pod
pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
for _, pod := range pods.Items {
fmt.Printf("pod.name:%v\n", pod.Name)
}
}
3, 运行
$ go run main.go
pod.name:nfs-client-provisioner-6d9b86b854-pcb9v
pod.name:coredns-545d6fc579-2kn79
pod.name:coredns-545d6fc579-mpzqg
pod.name:etcd-ml-k8s-1.novalocal
pod.name:fabric-node-2gnjf
pod.name:fabric-node-s92ds
···