安裝go client調用Kubernetes API


雖然Kubernetes是用go語言編寫的,但是安裝go client比安裝python client復雜很多。python只需要在PyCharm中安裝一個kubernetes包即可,而go則需要很復雜的一系列步驟。

主要按照https://github.com/kubernetes/client-go/blob/master/INSTALL.md的操作進行。默認已經正確安裝了go並且正確配置了GOPATH。

最好保證電腦能順暢地連接外網,否則有些包下載會特別慢。

一、下載go-client包

$ go get -u -v k8s.io/client-go/...

因為不能科學上網,這一步我足足等待了一個小時。為了確認下載的確在進行,加上了-u和-v,可以看見具體下載的過程。

下載完成后,對照官方GitHub中go-client和執行下面的操作:

$ cd $GOPATH/src/k8s.io/client-go
$ git checkout v9.0.0 #這里要根據版本對照表,找出和自己的Kubernetes集群對應的版本

注意:我測試時使用v7.0.0以下的版本時出現了依賴包不匹配的問題,導致編譯錯誤。換成v8.0.0就正常了。所以:

盡量使用v8.0.0以上的版本!盡量使用v8.0.0以上的版本!盡量使用v8.0.0以上的版本!

二、安裝godep

$ go get github.com/tools/godep

三、使用godep下載依賴包

godep是golang中管理依賴包的工具。在GOPATH/src/k8s.io/client-go目錄下執行下面的命令后,godep會從Godeps/Godeps.json文件中下載依賴包並安裝:

$ godep restore ./...

這一步同樣等待了很長很長時間,耐心很重要。。。。。。

四、手動下載報錯的包

執行godep restore時,會出現諸如:godep: error downloading dep (cloud.google.com/go/internal): unrecognized import path "cloud.google.com/go/internal"之類的錯誤,這是由於下載包的url路徑與import的路徑不一致,導致下載失敗。這時只能手動下載報錯的包。

網上搜索報錯的包的url位置,用git clone命令下載。

cloud.google.com/go的位置在https://github.com/GoogleCloudPlatform/google-cloud-go。在$GOPATH/src下創建cloud.google.com目錄后,在新目錄下執行:

$ git clone https://github.com/GoogleCloudPlatform/google-cloud-go

之后,把google-cloud-go文件夾重命名為go。

golang.org/x/下的包都位於 https://github.com/golang/下。在$GOPATH/src下創建golang.org/x/目錄后,針對所有golang.org/x/下報錯的包,在新目錄下依次執行:

$ git clone https://github.com/golang/xxx.git xxx   #xxx為報錯的包

下載完所有的包后,可以用Goland嘗試import一下報錯的目錄,看看是否能夠正常導入。

五、運行測試代碼

創建一個工程,編寫main.go如下:

package main

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

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

func main() {
	var kubeconfig *string
	if home := homeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, "src", "go-kubernetes", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()

	// use the current context in kubeconfig
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	for {
		pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})
		if err != nil {
			panic(err.Error())
		}
		fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))

		// Examples for error handling:
		// - Use helper functions like e.g. errors.IsNotFound()
		// - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message
		namespace := ""
		pod := "example-xxxxx"
		_, err = clientset.CoreV1().Pods(namespace).Get(pod, metav1.GetOptions{})
		if errors.IsNotFound(err) {
			fmt.Printf("Pod %s in namespace %s not found\n", pod, namespace)
		} else if statusError, isStatus := err.(*errors.StatusError); isStatus {
			fmt.Printf("Error getting pod %s in namespace %s: %v\n",
				pod, namespace, statusError.ErrStatus.Message)
		} else if err != nil {
			panic(err.Error())
		} else {
			fmt.Printf("Found pod %s in namespace %s\n", pod, namespace)
		}

		time.Sleep(10 * time.Second)
	}
}

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

首先在集群中任意節點的~/.kube目錄下找到config文件,將config文件拷貝到go運行的機器上,具體目錄可以通過自定義的homeDir函數和flag.String指定,我這里設置在工程的根目錄下。

運行程序,如果能正確顯示出pod的數量,說明配置成功!  

最后,個人感覺go的client真心不如python的client好用。且不說安裝的復雜程度,client-go是沒有官方文檔的,對新手極不友好,而python client的文檔非常詳細,簡單易用。

此外,python的yaml包支持用load方法將寫好的yaml文件直接讀入並解析,而go的yaml包則相對復雜,這導致在golang中通過yaml文件操作Kubernetes資源遠比python中麻煩。一種可行的操作是將yaml文件的各個字段直接編碼到代碼中,通過dynamic、unstructure等包進行解析,比直接修改yaml文件更加靈活。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM