天天看點

使用client-go連接配接k8s叢集

實驗介紹:

使用client-go連接配接k8s叢集,并擷取default名稱空間下面的Deployment的資源清單

基礎環境準備:

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.運作代碼驗證功能

完整代碼執行個體如下:

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
}           

繼續閱讀