client-go:4 ClientSet 使用

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 对象来获取资源数据,主要有以下三个步骤:

  1. 使用 kubeconfig 文件或者 ServiceAccount(InCluster 模式)来创建访问 Kubernetes API 的 Restful 配置参数,也就是代码中的 rest.Config 对象
  2. 使用 rest.Config 参数创建 Clientset 对象,这一步非常简单,直接调用 kubernetes.NewForConfig(config) 即可初始化
  3. 然后是 Clientset 对象的方法去获取各个 Group 下面的对应资源对象进行 CRUD 操作
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇