使用client-go连接k8s集群

实验介绍:

使用client-go连接k8s集群,并获取default名称空间下面的Deployment的资源列表

基础环境准备:

本次实验是在ubuntu的操作系统上面安装部署了一个单节点的k8s集群,通过client-go连接集群并操作其资源

使用client-go连接k8s集群

1.使用 client-go 在 k8s 集群外操作资源,首先需要通过获取 kubeconfig 配置文件用来建立连接集群

 // 声明三个变量
var err error
var config *rest.Config
var kubeconfig *string
// 定义一个函数用来在操作系统中获取家目录路径
func homeDir() string{
    if h:=os.Getenv("HOME");h!=""{
        return h
    }
    return os.Getenv("USERPROFILE")  //windows
}

// 在k8s的环境中认证文件一般存放在用户家目录的.kube文件中

if home:=homeDir();home!=""{
        kubeconfig=flag.String("kubeconfig",filepath.Join(home,".kube","config"),"(可选)kubeconfig 文件的绝对路径")
    }else{
        kubeconfig=flag.String("kubeconfig","","kubeconfig 文件的绝对路径")   // 如果用户家目录下面没有认证文件则手动指定文件的路径
    }
    flag.Parse()

2.创建集群配置

// 如果使用 inCluster 模式(需要区配置对应的RBAC 权限,默认的sa是default-->是没有获取deployment的List权限)
    if config,err =rest.InClusterConfig();err!=nil{
        // 使用Kubeonfig文件配置集群配置Config对象
        if config,err=clientcmd.BuildConfigFromFlags("",*kubeconfig);err!=nil{
            panic(err.Error())
        }
    }

3.在获取到使用Kubeonfig文件配置的Config对象之后,创建Clientset对象,并对其进行操作

lientset,err:=kubernetes.NewForConfig(config)
    if err !=nil{
        panic(err.Error())
    }
    // 可以使用Clientset对象获取资源对象,进行增删改查
    // 获取default命令空间下面的Deployment的列表,并打印到终端
    deployment,err:=clientset.AppsV1().Deployments("default").List(metav1.ListOptions{})
    if err!=nil{
        panic(err.Error())
    }

    for idx,deploy:=range deployment.Items{
        fmt.Printf("%d-%s\n",idx,deploy.Name)
    }

4.运行代码验证功能

go run main.go
使用client-go连接k8s集群

完整代码实例如下:

package main

import (
    "os"
    "fmt"
    "flag"
    "path/filepath"

    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main(){
    var err error
    var config *rest.Config
    // inCluster(Pod).kuberconfig(kubectl)
    var kubeconfig *string

    if home:=homeDir();home!=""{
        kubeconfig=flag.String("kubeconfig",filepath.Join(home,".kube","config"),"(可选)kubeconfig 文件的绝对路径")
    }else{
        kubeconfig=flag.String("kubeconfig","","kubeconfig 文件的绝对路径")
    }
    flag.Parse()
    // 首先使用 inCluster 模式(需要区配置对应的RBAC 权限,默认的sa是default-->是没有获取deployment的List权限)
    if config,err =rest.InClusterConfig();err!=nil{
        // 使用Kubeonfig文件配置集群配置Config对象
        if config,err=clientcmd.BuildConfigFromFlags("",*kubeconfig);err!=nil{
            panic(err.Error())
        }
    }
    // 已经获得了rest.Config对象
    // 创建Clientset对象
    clientset,err:=kubernetes.NewForConfig(config)
    if err !=nil{
        panic(err.Error())
    }
    // 就可以使用Clientset对象获取资源对象,进行增删改查
    // 想要获取default命令空间下面的Deployment的列表
    deployment,err:=clientset.AppsV1().Deployments("default").List(metav1.ListOptions{})
    if err!=nil{
        panic(err.Error())
    }

    for idx,deploy:=range deployment.Items{
        fmt.Printf("%d-%s\n",idx,deploy.Name)
    }

}

func homeDir() string{
    if h:=os.Getenv("HOME");h!=""{
        return h
    }
    return os.Getenv("USERPROFILE")  //windows
}

猜你喜欢

转载自blog.51cto.com/11970509/2554387