欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過client-go來操作K8S集群的操作方法

 更新時(shí)間:2024年11月07日 10:25:05   作者:景天科技苑  
本文詳細(xì)介紹了client-go的安裝、配置和使用方法,并通過示例代碼展示了如何進(jìn)行常見的Kubernetes操作,希望這些內(nèi)容能幫助大家更好地理解和使用client-go,從而提高你的Kubernetes開發(fā)效率,感興趣的朋友一起看看吧

client-go

一、client-go介紹

1. 什么是client-go?

client-go是Kubernetes官方提供的,用于操作kubernetes資源的Go語言客戶端庫(kù),通過它,開發(fā)者可以非常方便地在Go項(xiàng)目中與Kubernetes集群進(jìn)行交互,實(shí)現(xiàn)對(duì)Kubernetes資源以及自定義CRD的增刪改查和事件監(jiān)聽等操作。
同時(shí),可以通過client-go實(shí)現(xiàn)kubernetes的二次開發(fā)。自定義資源開發(fā)。

源碼:
github下載地址:https://github.com/kubernetes/client-go

如果是其他語言的客戶端工具,可以通過https://github.com/kubernetes-client 來查看

我們看下client-go幾個(gè)比較重要的目錄

2. client-go版本的演變

左邊是client-go的版本。右邊是k8s的版本
在client-go 1.17版本之前,client-go的版本與k8s版本保持一致,1.17之后,client-go的版本多了一個(gè)v的tag。是由于go語言的包是帶v的版本

建議:client-go我們直接用最新版本

3. client-go客戶端分類

restclient: 一般我們不會(huì)使用restclient,因?yàn)樗枰颜麄€(gè)資源的yaml文件或json數(shù)據(jù)都傳過去,顯得比較臃腫,一般我們不用這個(gè)
discoverclient: 比如我們創(chuàng)建deployment時(shí)的apiversion: apps/v1    apps就是資源組Group   v1就是資源版本Version   資源信息 就是kind 。我們一般也不會(huì)用這個(gè)客戶端工具
ClientSet: 只能針對(duì)K8S內(nèi)置的資源進(jìn)行操作,不能操作自定義的資源
DyanmicClient: 我們經(jīng)常使用這個(gè)客戶端,但是對(duì)于內(nèi)置資源,我們還是習(xí)慣使用ClientSet,因?yàn)樗糜?,自定義資源我們使用DyanmicClient。

我們可以通過命令 kubectl api-resources 查看每種資源的資源組

4. client-go客戶端工具依賴關(guān)系

5. 安裝client-go

client-go是一個(gè)Go模塊,可以通過Go Module的方式進(jìn)行安裝。在你的Go項(xiàng)目中,執(zhí)行以下命令:

go get k8s.io/client-go@latest

這將安裝最新版本的client-go。此外,你還需要安裝一些相關(guān)的依賴庫(kù),例如apimachinery,用于處理Kubernetes API對(duì)象。

go get k8s.io/apimachinery@latest

安裝完還需要運(yùn)行g(shù)o mod tidy 加載依賴包

二、使用client-go進(jìn)行基本操作

創(chuàng)建Kubernetes客戶端
在使用client-go之前,首先需要?jiǎng)?chuàng)建一個(gè)Kubernetes客戶端。client-go提供了兩種創(chuàng)建客戶端的方式:in-cluster配置和out-of-cluster配置。

我們根據(jù)我們之前寫好的腳手架,改個(gè)名字,在此基礎(chǔ)上開發(fā)我們的項(xiàng)目

并不是說在此改了就可以了,因?yàn)楹芏喟玫倪€是原來的名字,

我們可以批量替換
在Goland IDE中想要替換某一段特定的字符串,可以使用Find and Replace 功能來實(shí)現(xiàn)。這是一種全局性的操作,將會(huì)在你的整個(gè)項(xiàng)目或指定的文件/文件夾中進(jìn)行。

使用Ctrl + Shift + R 打開Find and Repalce對(duì)話框

我們測(cè)試client-go,要用到k8s集群,得有~/.kube/config 這個(gè)文件
里面是加載集群的配置信息

將這個(gè)文件復(fù)制到我們的項(xiàng)目中

2.1 in-cluster配置

在Kubernetes 集群內(nèi)部運(yùn)行時(shí),可以使用in-cluster配置。這種方式不需要手動(dòng)指定kubeconfig文件路徑,client-go會(huì)自動(dòng)使用集群中的服務(wù)賬戶進(jìn)行身份驗(yàn)證。

2.2 out-of-cluster配置

測(cè)試client-go,我們使用out-of-cluster方式來測(cè)試,發(fā)布項(xiàng)目的時(shí)候,我們使用in-cluster方式配置
在本地電腦開發(fā)環(huán)境或其他非Kubernetes集群中運(yùn)行時(shí),可以使用out-of-cluster配置。這需要指定kubeconfig文件的路徑。kubeconfig文件通常位于$HOME/.kube/config,它包含了訪問Kubernetes集群所需的配置信息。

這是github上面看用法舉例

package main
import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    //1. 初始化config實(shí)例
    //var kubeconfig *string
    // 通過家目錄找到kubeconfig文件。我們的路徑是已知的,所以不用此項(xiàng)配置
    //if home := homedir.HomeDir(); home != "" {
    //    kubeconfig = flag.String("meta.kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    //} else {
    //    kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    //}
    //flag.Parse()
    // 1. 初始化config實(shí)例
    // 因?yàn)槲覀兊穆窂绞且阎?,所以不用上面的配置。use the current context in kubeconfig
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此時(shí)報(bào)錯(cuò)的話,不應(yīng)該是panic了,但是這里官方用的還是panic。后期需要優(yōu)化,我么可以返回個(gè)錯(cuò)誤信息
    if err != nil {
        panic(err.Error())
    }
    //打印pod的數(shù)量
    fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    // 獲取指定名稱空間下的pod數(shù)量,如果namespace不傳值,默認(rèn)查的是所有命名空間下的pod
    namespace := "h5-web"
    pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    //打印pod的數(shù)量
    fmt.Printf("%s namespce has %d pods in the cluster\n", namespace, len(pods.Items))
    //看下返回的pod是什么
    fmt.Println("pods是什么:", pods)
}

2.3 client-go 查詢列表功能使用

我們看下List方法的參數(shù),包含兩個(gè),一個(gè)context,一個(gè)是ListOptions。

這個(gè)ListOptions就可以在里面做些篩選條件,比如傳json串,標(biāo)簽等

我們看下List的返回值

所以我們要查詢具體的pod里面的信息,可以在Items字段中獲取到所有的pod
跟我們通過在k8s集群中通過kubectl … -ojson的得到的信息是一樣的

如果要取其中某個(gè)pod,可以通過下標(biāo)來獲取

如果忘記pod的層級(jí)關(guān)系,可以使用k8s命令的-ojson 查看一下

完整代碼:

package main
import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此時(shí)報(bào)錯(cuò)的話,不應(yīng)該是panic了,但是這里官方用的還是panic。后期需要優(yōu)化,我么可以返回個(gè)錯(cuò)誤信息
    if err != nil {
        panic(err.Error())
    }
    //打印pod的數(shù)量
    fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    // 獲取指定名稱空間下的pod數(shù)量,如果namespace不傳值,默認(rèn)查的是所有命名空間下的pod
    namespace := "h5-web"
    pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    //打印pod的數(shù)量
    fmt.Printf("%s namespce has %d pods in the cluster\n", namespace, len(pods.Items))
    //看下返回的pod是什么
    fmt.Println("pods是什么:", pods)
    //獲取到某個(gè)pod
    fmt.Println(pods.Items[0].Spec.NodeName)
    //獲取到某個(gè)容器的鏡像
    fmt.Println(pods.Items[0].Spec.Containers[0].Image)
}

下面,我們探討下,我們?cè)趺粗牢覀円僮鞯馁Y源是屬于CoreV1()或者是其他什么組呢?
之前,我們說過,在K8S集群中,可以通過命令 kubectl api-resources查看

deployment 的apiversion是 apps/v1 對(duì)應(yīng)的client-go里面的方法就是 clientset.AppsV1()
crontabs 的apiversion是batch/v1 對(duì)應(yīng)的client-go里面的方法就是clientset.BatchV1()
ingresses的apiversion是networking.k8s.io/v1 對(duì)應(yīng)client-go里面的方法就是clientset.NetworkingV1()

以此類推,由此我們就知道了個(gè)匯總資源對(duì)應(yīng)的操作方法
這種V1的apiversion的資源,對(duì)應(yīng)的就是clientset.CoreV1()

如果不想通過K8S命令來查,也可以在代碼中查看
點(diǎn)進(jìn)來

這里可看看到個(gè)各種方法,不過我們用的時(shí)候要把首字母大寫

比如查詢deployment

//查詢deployment列表,用法與pod類似
deploy, _ := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
//查看所有名稱空間下deploy的數(shù)量
fmt.Println("deployment的數(shù)量", len(deploy.Items))
//打印deploy名稱,由于是多個(gè),我們循環(huán)打印
for _, i := range deploy.Items {
    fmt.Printf("當(dāng)前資源的名稱空間: %s, deployment名稱是: %s\n", i.Namespace, i.Name)
}
//查詢沒有名稱空間限制的資源,比如名稱空間,工作節(jié)點(diǎn),clusterrole,clusterrolebinding等
//查的都是集群的資源
//比如我們查詢集群有多少個(gè)名稱空間
ns, _ := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
fmt.Printf("There are %d namespaces in the cluster\n", len(ns.Items))

完整代碼:

package main
import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此時(shí)報(bào)錯(cuò)的話,不應(yīng)該是panic了,但是這里官方用的還是panic。后期需要優(yōu)化,我么可以返回個(gè)錯(cuò)誤信息
    if err != nil {
        panic(err.Error())
    }
    //打印pod的數(shù)量
    fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    // 獲取指定名稱空間下的pod數(shù)量,如果namespace不傳值,默認(rèn)查的是所有命名空間下的pod
    //namespace := "h5-web"
    //pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    //if err != nil {
    //    panic(err.Error())
    //}
    打印pod的數(shù)量
    //fmt.Printf("%s namespce has %d pods in the cluster\n", namespace, len(pods.Items))
    看下返回的pod是什么
    //fmt.Println("pods是什么:", pods)
    //
    獲取到某個(gè)pod
    //fmt.Println(pods.Items[0].Spec.NodeName)
    獲取到某個(gè)容器的鏡像
    //fmt.Println(pods.Items[0].Spec.Containers[0].Image)
    //查詢deployment列表,用法與pod類似
    deploy, _ := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
    //查看所有名稱空間下deploy的數(shù)量
    fmt.Println("deployment的數(shù)量", len(deploy.Items))
    //打印deploy名稱,由于是多個(gè),我們循環(huán)打印
    for _, i := range deploy.Items {
        fmt.Printf("當(dāng)前資源的名稱空間: %s, deployment名稱是: %s\n", i.Namespace, i.Name)
    }
    //查詢沒有名稱空間限制的資源,比如名稱空間,工作節(jié)點(diǎn),clusterrole,clusterrolebinding等
    //查的都是集群的資源
    //比如我們查詢集群有多少個(gè)名稱空間
    ns, _ := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
    fmt.Printf("There are %d namespaces in the cluster\n", len(ns.Items))
}

2.4 client-go查詢資源詳情

Get()方法,可以獲取單個(gè)資源的詳情,獲取詳情之后,我們可以傳給前端展示,或者根據(jù)查詢出來的數(shù)據(jù)進(jìn)行更改
比如說,我們對(duì)K8S集群中h5-web名稱空間下的 pods 查詢?cè)斍?/p>

// 查詢資源詳情 Get()方法
// Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Pod, error)
poddetail, _ := clientset.CoreV1().Pods("h5-web").Get(context.TODO(), "web-864f4c6988-95sw4", metav1.GetOptions{})
//fmt.Println("pod詳情:", poddetail)
//打印pod的鏡像名稱
fmt.Println("pod第一個(gè)容器的鏡像名稱", poddetail.Spec.Containers[0].Image)
//獲取名稱空間的詳情
namespace, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), "h5-web", metav1.GetOptions{})
fmt.Println("名稱空間詳情:", namespace)

完整代碼

package main
import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    // 查詢資源詳情 Get()方法
    // Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Pod, error)
    poddetail, _ := clientset.CoreV1().Pods("h5-web").Get(context.TODO(), "web-864f4c6988-95sw4", metav1.GetOptions{})
    //fmt.Println("pod詳情:", poddetail)
    //打印pod的鏡像名稱
    fmt.Println("pod第一個(gè)容器的鏡像名稱", poddetail.Spec.Containers[0].Image)
    //獲取名稱空間的詳情
    namespace, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), "h5-web", metav1.GetOptions{})
    fmt.Println("名稱空間詳情:", namespace)
}

其他資源查詢方式類似,感興趣的朋友可以嘗試下

2.5 client-go更新資源功能

更新的前提是該字段是可更改的
比如這種can’t be updated的字段,就不能被修改

注意:如果修改的字段在資源中不存在,比如labels 。修改時(shí)會(huì)報(bào)空指針錯(cuò)誤,此時(shí)就要初始化下才能修改

//更新資源操作  Update()
//先獲取資源詳情,再修改
//比如,我們修改service的暴露的端口號(hào)
service, _ := clientset.CoreV1().Services("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
fmt.Printf("service對(duì)外的端口號(hào)是 %d\n", service.Spec.Ports[0].NodePort)
// 修改端口號(hào)
// service-node-port-range 默認(rèn)可以設(shè)置的范圍 30000-32767
service.Spec.Ports[0].NodePort = 32050
// 修改暴露的端口號(hào)
// Update(ctx context.Context, service *v1.Service, opts metav1.UpdateOptions) (*v1.Service, error)
_, err = clientset.CoreV1().Services("h5-web").Update(context.TODO(), service, metav1.UpdateOptions{})
if err != nil {
    panic(err.Error())
}
fmt.Printf("修改后service對(duì)外的端口號(hào)是 %d\n", service.Spec.Ports[0].NodePort)
//修改deploy的副本數(shù)
deploy, _ := clientset.AppsV1().Deployments("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
//查看當(dāng)前deploy的副本數(shù)
fmt.Println("當(dāng)前deploy的副本數(shù)是:", *deploy.Spec.Replicas)
//修改副本數(shù)
replacs := int32(3)
//注意Replicas 是int32的指針類型
deploy.Spec.Replicas = &replacs
_, err = clientset.AppsV1().Deployments("h5-web").Update(context.TODO(), deploy, metav1.UpdateOptions{})
//查看修改后deploy的副本數(shù)
fmt.Println("修改后deploy的副本數(shù)是:", *deploy.Spec.Replicas)

完整代碼:

package main
import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    //更新資源操作  Update()
    //先獲取資源詳情,再修改
    //比如,我們修改service的暴露的端口號(hào)
    service, _ := clientset.CoreV1().Services("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
    fmt.Printf("service對(duì)外的端口號(hào)是 %d\n", service.Spec.Ports[0].NodePort)
    // 修改端口號(hào)
    // service-node-port-range 默認(rèn)可以設(shè)置的范圍 30000-32767
    service.Spec.Ports[0].NodePort = 32050
    // 修改暴露的端口號(hào)
    // Update(ctx context.Context, service *v1.Service, opts metav1.UpdateOptions) (*v1.Service, error)
    _, err = clientset.CoreV1().Services("h5-web").Update(context.TODO(), service, metav1.UpdateOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("修改后service對(duì)外的端口號(hào)是 %d\n", service.Spec.Ports[0].NodePort)
    //修改deploy的副本數(shù)
    deploy, _ := clientset.AppsV1().Deployments("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
    //查看當(dāng)前deploy的副本數(shù)
    fmt.Println("當(dāng)前deploy的副本數(shù)是:", *deploy.Spec.Replicas)
    //修改副本數(shù)
    replacs := int32(3)
    //注意Replicas 是int32的指針類型
    deploy.Spec.Replicas = &replacs
    _, err = clientset.AppsV1().Deployments("h5-web").Update(context.TODO(), deploy, metav1.UpdateOptions{})
    //查看修改后deploy的副本數(shù)
    fmt.Println("修改后deploy的副本數(shù)是:", *deploy.Spec.Replicas)
}

2.6 client-go刪除資源

刪除pod,比如我們將下列的pod刪除

//刪除資源 Delete()
//刪除pod
err = clientset.CoreV1().Pods("h5-web").Delete(context.TODO(), "web-864f4c6988-r456g", metav1.DeleteOptions{})
if err != nil {
    panic(err.Error())

可見pod已被刪除

2.7 client-go創(chuàng)建資源

創(chuàng)建namespace

//創(chuàng)建名稱空間
var namespace corev1.Namespace
//創(chuàng)建namespace只需要傳個(gè)名字就可以了
namespace.Name = "test1"
// Create(ctx context.Context, namespace *v1.Namespace, opts metav1.CreateOptions) (*v1.Namespace, error)
//傳的是指針
_, err = clientset.CoreV1().Namespaces().Create(context.TODO(), &namespace, metav1.CreateOptions{})
if err != nil {
    panic(err.Error())
}

注意,這個(gè)corev1的導(dǎo)包,我們要根據(jù)Create()這個(gè)方法里面的導(dǎo)包,導(dǎo)過來,不要導(dǎo)錯(cuò)了,因?yàn)楹芏鄓1的包

創(chuàng)建deployment
注意,這個(gè)deployment的v1,

導(dǎo)包的時(shí)候,不要導(dǎo)錯(cuò)

傳參時(shí),要把必須得參數(shù)都傳進(jìn)去

可以通過這個(gè)命令來查看哪些是必須傳的參數(shù)

kubectl create deployment mynginx --image="nginx" --dry-run=client -oyaml

它會(huì)導(dǎo)出一份yaml文件

package main
import (
    "context"
    "fmt"
    deployv1 "k8s.io/api/apps/v1"
    corev1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    //創(chuàng)建deployment
    var deploy deployv1.Deployment
    //給deployment傳參,要把必須傳的參數(shù)都傳進(jìn)去,不然創(chuàng)建會(huì)報(bào)錯(cuò)
    deploy.Name = "mydeploy"
    deploy.Namespace = "test1"
    //副本數(shù)
    replicas := int32(1)
    deploy.Spec.Replicas = &replicas
    //mathlabels
    labels := make(map[string]string)
    labels["app"] = "nginx"
    //Selector 是個(gè)指針類型,需要先初始化
    //Selector *metav1.LabelSelector `json:"selector" protobuf:"bytes,2,opt,name=selector"`
    deploy.Spec.Selector = &metav1.LabelSelector{}
    deploy.Spec.Selector.MatchLabels = labels
    //deployment label   metadata會(huì)將里面的資源發(fā)布出去,metadata可以省略掉
    deploy.Labels = labels
    // 創(chuàng)建template 這個(gè)template模版就是pod的模板
    // Template v1.PodTemplateSpec `json:"template" protobuf:"bytes,3,opt,name=template"`
    // 此時(shí)的labels要和selector的labels一樣,否則deployment就無法管理到pod
    deploy.Spec.Template.ObjectMeta.Labels = labels
    //創(chuàng)建容器,容器是個(gè)切片,可以創(chuàng)建多個(gè)容器
    var containers []corev1.Container
    var container corev1.Container
    container.Name = "nginx"
    container.Image = "nginx:1.7.9"
    containers = append(containers, container)
    container.Name = "redis"
    container.Image = "redis:6-alpine"
    containers = append(containers, container)
    deploy.Spec.Template.Spec.Containers = containers
    _, err = clientset.AppsV1().Deployments("test1").Create(context.TODO(), &deploy, metav1.CreateOptions{})
}

查看創(chuàng)建的deploy

查看yaml文件,兩個(gè)容器都創(chuàng)建成功

[root@master01 svc ]#kubectl get deploy -n test1 -oyaml
apiVersion: v1
items:
- apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      deployment.kubernetes.io/revision: "1"
    creationTimestamp: "2024-11-05T09:58:43Z"
    generation: 1
    labels:
      app: nginx
    name: mydeploy
    namespace: test1
    resourceVersion: "1079640"
    uid: 8df3654a-71c6-45d5-888d-6329ed81dad7
  spec:
    progressDeadlineSeconds: 600
    replicas: 1
    revisionHistoryLimit: 10
    selector:
      matchLabels:
        app: nginx
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
      type: RollingUpdate
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: nginx
      spec:
        containers:
        - image: nginx:1.7.9
          imagePullPolicy: IfNotPresent
          name: nginx
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        - image: redis:6-alpine
          imagePullPolicy: IfNotPresent
          name: redis
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        terminationGracePeriodSeconds: 30
  status:
    conditions:
    - lastTransitionTime: "2024-11-05T09:58:43Z"
      lastUpdateTime: "2024-11-05T09:58:43Z"
      message: Deployment does not have minimum availability.
      reason: MinimumReplicasUnavailable
      status: "False"
      type: Available
    - lastTransitionTime: "2024-11-05T09:58:43Z"
      lastUpdateTime: "2024-11-05T09:58:43Z"
      message: ReplicaSet "mydeploy-68dcc7d46d" is progressing.
      reason: ReplicaSetUpdated
      status: "True"
      type: Progressing
    observedGeneration: 1
    replicas: 1
    unavailableReplicas: 1
    updatedReplicas: 1
kind: List
metadata:
  resourceVersion: ""

2.8 client-go使用json串創(chuàng)建資源

上面使用手動(dòng)填值的方式創(chuàng)建,還是比較麻煩的,稍微有不注意的地方還容易犯錯(cuò),因此,在前后端分離的項(xiàng)目中,在web頁面,一般我們不悔通過手動(dòng)填值進(jìn)行創(chuàng)建資源。
一般我們會(huì)根據(jù)json串來創(chuàng)建資源
首先我們通過先通過kubectl命令導(dǎo)出json串

–dry-run 選項(xiàng)只能為 “none”、“server”、"client"三者中的一個(gè),默認(rèn)是none;當(dāng)不加該參數(shù),或者為none的時(shí)候,該操作后資源會(huì)生效 ,請(qǐng)求會(huì)被發(fā)送到kube-apiserver并做實(shí)際更改;
當(dāng)該參數(shù)為client的時(shí)候,只打印該對(duì)象并不會(huì)發(fā)送請(qǐng)求且并不會(huì)實(shí)際創(chuàng)建該對(duì)象;
當(dāng)該參數(shù)為server的時(shí)候,會(huì)發(fā)送請(qǐng)求到服務(wù)端,但是并不會(huì)實(shí)際創(chuàng)建該對(duì)象。
比如我們拿到一個(gè)創(chuàng)建deploy的json串

kubectl create deployment myredis --image="redis" --dry-run=client -ojson

我們將json串拿出來

{
    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "myredis",
        "creationTimestamp": null,
        "labels": {
            "app": "myredis"
        }
    },
    "spec": {
        "replicas": 1,
        "selector": {
            "matchLabels": {
                "app": "myredis"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "app": "myredis"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "redis",
                        "image": "redis",
                        "resources": {}
                    }
                ]
            }
        },
        "strategy": {}
    },
    "status": {}
}

使用json創(chuàng)建deploy完整代碼:

package main
import (
    "context"
    "encoding/json"
    "fmt"
    deployv1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
func main() {
    // 1. 初始化config實(shí)例
    // masterUrl就是離我們主節(jié)點(diǎn)的ip地址和端口號(hào),我們?cè)趉ubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常應(yīng)用我們的服務(wù),必須能夠?qū)嵗晒ubeconfig,要不然后面所有的功能都無法使用,所以這里直接報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    // 2. 創(chuàng)建客戶端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //這個(gè)客戶端工具如果生成失敗的話,后面的操作也無法完成,所以這里也報(bào)panic即可
    if err != nil {
        panic(err.Error())
    }
    //3. 操作集群
    //通過json串創(chuàng)建k8s資源,注意多行字符串用反引號(hào)包裹
    deployJson := `{
    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "myredis",
        "creationTimestamp": null,
        "labels": {
            "app": "myredis"
        }
    },
    "spec": {
        "replicas": 1,
        "selector": {
            "matchLabels": {
                "app": "myredis"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "app": "myredis"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "redis",
                        "image": "redis",
                        "resources": {}
                    }
                ]
            }
        },
        "strategy": {}
    },
    "status": {}
}`
    //我們需要將json串轉(zhuǎn)換成deployv1類型的資源
    var redisdeploy deployv1.Deployment
    //將json轉(zhuǎn)換成struct
    // func Unmarshal(data []byte, v any) error
    err = json.Unmarshal([]byte(deployJson), &redisdeploy)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("將json轉(zhuǎn)換成的struct:", redisdeploy)
    //創(chuàng)建deploy
    _, err = clientset.AppsV1().Deployments("default").Create(context.TODO(), &redisdeploy, metav1.CreateOptions{})
    if err != nil {
        panic(err.Error())
    }
}

在K8S集群查看下,創(chuàng)建成功

三、總結(jié)

client-go是Kubernetes官方提供的Go客戶端庫(kù),它封裝了與Kubernetes API服務(wù)器的交互,提供了便捷的方式進(jìn)行各種資源的管理。通過創(chuàng)建客戶端并使用相應(yīng)的API客戶端進(jìn)行操作,你可以輕松地進(jìn)行Pod、Deployment、Service等資源的增刪改查。

本文詳細(xì)介紹了client-go的安裝、配置和使用方法,并通過示例代碼展示了如何進(jìn)行常見的Kubernetes操作。希望這些內(nèi)容能幫助大家更好地理解和使用client-go,從而提高你的Kubernetes開發(fā)效率。

到此這篇關(guān)于通過client-go來操作K8S集群的文章就介紹到這了,更多相關(guān)client-go操作K8S集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用工具自動(dòng)監(jiān)測(cè)SSL證書有效期并發(fā)送提醒郵件

    如何使用工具自動(dòng)監(jiān)測(cè)SSL證書有效期并發(fā)送提醒郵件

    本文介紹了如何開發(fā)一個(gè)工具,用于每日檢測(cè)SSL證書剩余有效天數(shù)并通過郵件發(fā)送提醒,工具基于命令行,通過SMTP協(xié)議發(fā)送郵件,需配置SMTP連接信息,本文還提供了配置文件樣例及代碼實(shí)現(xiàn),幫助用戶輕松部署和使用該工具
    2024-10-10
  • Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作

    Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作

    這篇文章主要為大家詳細(xì)介紹了Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下
    2025-03-03
  • 深入理解go slice結(jié)構(gòu)

    深入理解go slice結(jié)構(gòu)

    這篇文章主要介紹了go slice結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • 使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作

    使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作

    這篇文章主要介紹了使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • golang 熔斷限流降級(jí)實(shí)踐

    golang 熔斷限流降級(jí)實(shí)踐

    本文主要介紹了golang 熔斷限流降級(jí)實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • golang int 轉(zhuǎn)float 強(qiáng)轉(zhuǎn)和高精度轉(zhuǎn)操作

    golang int 轉(zhuǎn)float 強(qiáng)轉(zhuǎn)和高精度轉(zhuǎn)操作

    這篇文章主要介紹了golang int 轉(zhuǎn)float 強(qiáng)轉(zhuǎn)和高精度轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Go語言的計(jì)時(shí)器

    詳解Go語言的計(jì)時(shí)器

    Go語言的標(biāo)準(zhǔn)庫(kù)里提供兩種類型的計(jì)時(shí)器Timer和Ticker。這篇文章主要介紹了Go語言的計(jì)時(shí)器的相關(guān)知識(shí),需要的朋友可以參考下
    2020-05-05
  • Go語言pointer及switch?fallthrough實(shí)戰(zhàn)詳解

    Go語言pointer及switch?fallthrough實(shí)戰(zhàn)詳解

    這篇文章主要為大家介紹了Go語言pointer及switch?fallthrough實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一篇文章學(xué)會(huì)GO語言中的變量

    一篇文章學(xué)會(huì)GO語言中的變量

    Go語言是靜態(tài)類型語言,因此變量有明確類型的,編譯器也會(huì)檢查變量類型的正確性,下面這篇文章主要給大家介紹了關(guān)于GO語言中變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Go語言基礎(chǔ)switch條件語句基本用法及示例詳解

    Go語言基礎(chǔ)switch條件語句基本用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)switch條件語句基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11

最新評(píng)論