3 ClientSet 使用
3.1 介绍
Clientset 是调用 Kubernetes 资源对象最常用的客户端,可以操作所有的资源对象。
前面我们说了在 staging/src/k8s.io/api
下面定义了各种类型资源的规范,然后将这些规范注册到了全局的 Scheme 中,这样就可以在 Clientset
中使用这些资源了。那么我们应该如何使用 Clientset 呢?
3.2 示例
首先我们来看下如何通过 Clientset 来获取资源对象,我们这里来创建一个 Clientset 对象,然后通过该对象来获取默认命名空间之下的 Deployments 列表
因为我们都知道要创建这些资源的时候都需要看获取到 config 配置文件,因为这个请求需要去访问到我们的 api server
client-go sdk 查看对应代码方法
1.kubectl api-resources 查看对应的 api 如 deployment 对应的 api 就是 apps.v1
2.然后 sdk 源码中找到对应的方法再点击到对应的方法或者接口
3.使用对应接口里面的方法实现创建
4.然后再我们的程序中编写代码
client-go 开发流程:
1.获取 K8S 配置文件
2.初始化配置文件
3.拿到 K8S 客户端
4.通过对于的资源类型进行编写代码
1.拷贝 config
# 这里我先将 K8S 集群中的配置文件拷贝至编写代码的服务器上
[10:32:15 root@k8s-master ~]#cd /root/.kube/
# 将配置文件拷贝至写代码的 K8S 项目中的 etc 文件中
[18:42:57 root@k8s-master .kube]#scp config 10.0.0.3:/root/project/testK8S/etc
2.编写代码如下所示:
package main
import (
"context"
"flag"
"fmt"
"os"
"path/filepath"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func homeDir() string {
// 通过 Home 变量来获取当前用户家目录
if h := os.Getenv("HOME"); h != "" {
return h
}
return os.Getenv("USERPROFILE")
}
func main() {
var err error
var config *rest.Config
var kubeconfig *string
// 本地 K8S 配置文件
localconfig := "./etc/kubeconfig"
// 如果是 K8S 集群中的使用
if home := homeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(可选) 输入 kubeconfig 的决定路径")
fmt.Println(*kubeconfig)
} else {
kubeconfig = flag.String("kubeconfig", "", "kubeconfig 文件的绝对路径")
}
flag.Parse()
// 初始化配置文件拿到 client
// 如果在 K8S 集群本地使用 ServiceAccount 创建集群配置(InCluster模式)
if config, err = rest.InClusterConfig(); err != nil {
// 使用 KubeConfig 文件创建集群配置
config, err = clientcmd.BuildConfigFromFlags("", *kubeconfig)
// 如果 err 错误就表示不在是 K8S 集群中那这个时候就需要调用本地的 ./etc/kubeconfig
if err != nil {
if config, err = clientcmd.BuildConfigFromFlags("", localconfig); err != nil {
panic(err.Error())
}
}
}
// 创建 clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// 不同的资源可以通过不同的 clientset api 获取
// deployment 对应的 api 是 appsv1
// 使用 clientsent 获取 Deployments
deployments, err := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err)
}
// Items 是一个切片,Items是列表中命名空间对象的列表。
for _, deployment := range deployments.Items {
fmt.Printf("namespace:%s deployment:%s\n", deployment.Namespace, deployment.Name)
}
}
3.执行
[17:00:19 root@go testk8s22]#go run main.go
/root/.kube/config
namespace:default deployment:blackbox
namespace:kube-system deployment:calico-kube-controllers
namespace:kube-system deployment:coredns
namespace:kube-system deployment:kube-state-metrics
namespace:kube-system deployment:metrics-server
namespace:web deployment:web-tomcat-app1-deployment
4.K8S 集群验证成功
[16:57:22 root@k8s-master ~]#kubectl get deployments.apps -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default blackbox 1/1 1 1 4d18h
kube-system calico-kube-controllers 2/2 2 2 29d
kube-system coredns 2/2 2 2 33d
kube-system kube-state-metrics 1/1 1 1 2d3h
kube-system metrics-server 1/1 1 1 28d
web web-tomcat-app1-deployment 0/1 1 0 4d18h
这是一个非常典型的访问 Kubernetes 集群资源的方式,通过 client-go 提供的 Clientset 对象来获取资源数据,主要有以下三个步骤:
- 使用 kubeconfig 文件或者 ServiceAccount(InCluster 模式)来创建访问 Kubernetes API 的 Restful 配置参数,也就是代码中的
rest.Config
对象 - 使用 rest.Config 参数创建 Clientset 对象,这一步非常简单,直接调用
kubernetes.NewForConfig(config)
即可初始化 - 然后是 Clientset 对象的方法去获取各个 Group 下面的对应资源对象进行 CRUD 操作