Kubernetes 學習筆記 --- 訪問集群

Kubernetes 學習筆記 --- 訪問集群

官方文檔

我這里分享的是通過編程的方式去訪問k8s集群姿搜,之所以分享這種方式距帅,是因為我們可能有需要對k8s進行擴展,或者二次開發(fā)的需求,而我在學習時,苦于沒有簡單明了的文檔來幫助我學習,以至于走了很多彎路攻走,所以我把我的學習歷程記錄了下來饺著,分享給大家宾抓,有什么不對的地方,還請大家指正树叽。

前提

  • 你需要有一個k8s集群
  • 將k8s集群的admin.conf文件拷貝到你訪問的地方
  • 保護好你的admin.conf不要泄露-它擁有完全的k8s控制權限

如果你沒有k8s集群舆蝴,可以參考這篇文檔,搭建一個自己的集群

獲取客戶端

k8s官方給我們提供幾種獲取k8s客戶端方式菱皆,他們都被封裝 client-go 這個package里

1: RESTClient

RESTClint是k8s官方提供的最基礎的客戶端须误,它將常見的 Kubernetes API 約定封裝在一起。
它提供的Kubernetes API有:

  • GetRateLimiter() flowcontrol.RateLimiter:用于獲取限速器
  • Verb(verb string) *Request :用于設置請求的操作
  • Post() *Request :用于創(chuàng)建資源
  • Put() *Request :用于更新資源
  • Patch(pt types.PatchType) *Request :用于更新資源仇轻,與PUT有一定不同
  • Get() *Request :用于獲取資源
  • Delete() *Request :用于刪除資源
  • APIVersion() schema.GroupVersion :用于獲取GroupVersion
package main

import (
    "context"
    "fmt"
    v1 "k8s.io/api/core/v1"
    v12 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/kubernetes/scheme"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
)

var nameSpace = "kube-system"
var podName = "coredns-64897985d-cmmk9"

func main() {
    // 獲取k8s集群的admin.conf 并轉換為*rest.Config
    config := getConfig()
    config.GroupVersion = &v1.SchemeGroupVersion
    config.NegotiatedSerializer = scheme.Codecs
    config.APIPath = "/api"
    // 獲取RESTClient
    client, err := rest.RESTClientFor(config)
    if err != nil {
        panic(err)
    }
    // 獲取POD
    var pod v1.Pod
    // 下面這行代碼相當于在拼接URL 
    req := client.Get().Namespace(nameSpace).Resource("pods").Name(podName)
    fmt.Println(req.URL()) // https://ip:prot/api/v1/namespaces/kube-system/pods/coredns-64897985d-cmmk9
    err = req.Do(context.TODO()).Into(&pod)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(pod.Name)
    }
}
func getConfig() *rest.Config {
    config, err := clientcmd.BuildConfigFromFlags("", "./admin.conf")
    if err != nil {
        panic(err)
    }
    return config
}

2: DynamicCli

動態(tài)客戶端 通常用于查詢自定義CRD或者本身服務里沒有的資源,他解析出來的對象是一個map[string]interface{}

func dynamicCli() {
    resource := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
    config := getConfig()
    cli, err := dynamic.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    cluster, err := cli.Resource(resource).List(context.TODO(), v12.ListOptions{})
    if err != nil {
        fmt.Println(err)
    } else {
        for _, item := range cluster.Items {
            fmt.Println(item.GetName())
        }
    }
}
func getConfig() *rest.Config {
    config, err := clientcmd.BuildConfigFromFlags("", "/Users/zhousong/admin.conf")
    if err != nil {
        panic(err)
    }
return config
}

3: ClientSet

ClientSet是k8s官方提供的官方資源的客戶端,如奶甘,pods篷店,nodes,role...等等
同時臭家,我們自定義的CRD也可以生成client代碼
ClientSet本質是在RESTClient上的一層針對特定資源的封裝

//這段代碼就是 clientSet.CoreV1().Pods 的源碼 疲陕,我們可以看出pod的client,其實就是RESTClient
type pods struct {
    client rest.Interface
    ns     string
}

// newPods returns a Pods
func newPods(c *CoreV1Client, namespace string) *pods {
    return &pods{
        client: c.RESTClient(),
        ns:     namespace,
    }
}
func clientCmd() {
    config := getConfig()
    clientSet, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    pod, err := clientSet.CoreV1().Pods(nameSpace).Get(context.TODO(), podName, v12.GetOptions{})
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(pod.Name)
    }
    pods, err := clientSet.CoreV1().Pods(nameSpace).List(context.TODO(), v12.ListOptions{})
    if err != nil {
        fmt.Println(err)
    } else {
        for _, item := range pods.Items {
            fmt.Println(item.Name)
        }
    }
    res, err := clientSet.ServerPreferredNamespacedResources()
    if err != nil {
        fmt.Println(err)
    } else {
        for _, re := range res {
            fmt.Println(re.GroupVersionKind().String(), re.GroupVersion)
        }
    }
}

func getConfig() *rest.Config {
    config, err := clientcmd.BuildConfigFromFlags("", "/Users/zhousong/admin.conf")
    if err != nil {
        panic(err)
    }
    return config
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钉赁,一起剝皮案震驚了整個濱河市蹄殃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌你踩,老刑警劉巖诅岩,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讳苦,死亡現(xiàn)場離奇詭異,居然都是意外死亡吩谦,警方通過查閱死者的電腦和手機鸳谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來式廷,“玉大人咐扭,你說我怎么就攤上這事』希” “怎么了蝗肪?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蠕趁。 經(jīng)常有香客問我穗慕,道長,這世上最難降的妖魔是什么妻导? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任逛绵,我火速辦了婚禮,結果婚禮上倔韭,老公的妹妹穿的比我還像新娘术浪。我一直安慰自己,他們只是感情好寿酌,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布胰苏。 她就那樣靜靜地躺著,像睡著了一般醇疼。 火紅的嫁衣襯著肌膚如雪硕并。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天秧荆,我揣著相機與錄音倔毙,去河邊找鬼。 笑死乙濒,一個胖子當著我的面吹牛陕赃,可吹牛的內容都是我干的。 我是一名探鬼主播颁股,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼么库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甘有?” 一聲冷哼從身側響起诉儒,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亏掀,沒想到半個月后忱反,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泛释,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年缭受,在試婚紗的時候發(fā)現(xiàn)自己被綠了胁澳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡米者,死狀恐怖韭畸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蔓搞,我是刑警寧澤胰丁,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站喂分,受9級特大地震影響锦庸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蒲祈,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一甘萧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆掸,春花似錦扬卷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卑硫,卻和暖如春徒恋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欢伏。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工入挣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颜懊。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓财岔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親河爹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容