您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何使用client-go工具調用kubernetes API接口”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何使用client-go工具調用kubernetes API接口”這篇文章吧。
可以調取k8s API 接口的工具有很多,這里我就介紹下client-go
gitlab上client-go項目地址: https://github.com/kubernetes/client-go
這個工具是由kubernetes官方指定維護的,大家可以放心使用
運行完成后,可以直接獲取k8s集群信息等
注意事項:https://github.com/kubernetes/client-go/blob/master/INSTALL.md
總結:一定要拉取跟集群對應版本的工具源碼,比如我這里集群是1.17版本,那我就拉取17版本
go get k8s.io/client-go@v0.17.0
我是1.17版本的集群,所有依賴文件放在這了,可以直接使用client-go k8s1.17 api
集群的角色配置文件(默認在/root/.kube/config)
kube/config
查詢pod信息
查看ferry
命名空間下pod的信息,pod名字、pod的IP
vim kube-api.go
package main import ( "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func main() { config, err := clientcmd.BuildConfigFromFlags("", "kube/config") if err != nil { panic(err) } client, _ := kubernetes.NewForConfig(config) pods ,err := client.CoreV1().Pods("ferry").List(metav1.ListOptions{}) if err != nil { fmt.Println(err) return } for _,v := range pods.Items { fmt.Printf(" 命名空間是:%v\n pod名字:%v\n IP:%v\n\n",v.Namespace,v.Name,v.Status.PodIP) } }
自動關聯依賴
go mod tidy
運行結果
$ go run kube-api.go
命名空間是:ferry
pod名字:ferry-backend-7949596679-h8lxb
IP:10.42.1.14命名空間是:ferry
pod名字:ferry-mysql-8db8d49f7-6psbv
IP:10.42.1.11
查詢一個pod是否在一個命名空間下
https://github.com/kubernetes/client-go/blob/master/examples/in-cluster-client-configuration/main.go
每3秒檢查下nginx-74959fc858-cp48w
是否在default
命名空間下
package main import ( "context" "fmt" "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" "time" ) func main() { config, err := clientcmd.BuildConfigFromFlags("", "kube/config") if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } for { // get pods in all the namespaces by omitting namespace // Or specify namespace to get pods in particular namespace pods, err := clientset.CoreV1().Pods("").List(context.TODO(), 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 e.g. errors.IsNotFound() // - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message _, err = clientset.CoreV1().Pods("default").Get(context.TODO(), "nginx-74959fc858-cp48w", metav1.GetOptions{}) if errors.IsNotFound(err) { fmt.Printf("Pod nginx-74959fc858-cp48w not found in default namespace\n") } else if statusError, isStatus := err.(*errors.StatusError); isStatus { fmt.Printf("Error getting pod %v\n", statusError.ErrStatus.Message) } else if err != nil { panic(err.Error()) } else { fmt.Printf("Found nginx-74959fc858-cp48w pod in default namespace\n") } time.Sleep(3 * time.Second) } }
運行結果
$ go run kube-api.go
There are 22 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 22 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 22 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 23 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 22 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 22 pods in the cluster
Found nginx-74959fc858-cp48w pod in default namespace
There are 21 pods in the cluster
\\在集群種手動刪除了這個pod
Pod nginx-74959fc858-cp48w not found in default namespace
There are 21 pods in the cluster
Pod nginx-74959fc858-cp48w not found in default namespace
查詢deployment服務類型信息
查詢default
命名空間下的deployment服務信息,服務名字、服務副本數
package main import ( "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func main() { config, err := clientcmd.BuildConfigFromFlags("", "kube/config") if err != nil { panic(err) } client, _ := kubernetes.NewForConfig(config) deploymentList, err := client.AppsV1().Deployments("default").List(metav1.ListOptions{}) if err != nil { fmt.Println(err) return } for _,v := range deploymentList.Items { fmt.Printf(" 命名空間是:%v\n deployment服務名字:%v\n 副本個數:%v\n\n",v.Namespace,v.Name,v.Status.Replicas) } }
運行結果
$ go run kube-api.go
命名空間是:default
deployment服務名字:nginx
副本個數:2
https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-deployment/main.go
復制一個config文件到當前目錄下
創建一個deployment類型的nginx服務
vim deployment-create.go
package main import ( "context" "flag" "fmt" "path/filepath" appsv1 "k8s.io/api/apps/v1" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" // // Uncomment to load all auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth" // // Or uncomment to load specific auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth/azure" // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack" ) func main() { var kubeconfig *string if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", filepath.Join("config"), "(optional) absolute path to the kubeconfig file") } else { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault) deployment := &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: "nginx-deployment", }, Spec: appsv1.DeploymentSpec{ Replicas: int32Ptr(2), Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{ "app": "nginx", }, }, Template: apiv1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ "app": "nginx", }, }, Spec: apiv1.PodSpec{ Containers: []apiv1.Container{ { Name: "web", Image: "nginx:1.12", Ports: []apiv1.ContainerPort{ { Name: "http", Protocol: apiv1.ProtocolTCP, ContainerPort: 80, }, }, }, }, }, }, }, } // Create Deployment fmt.Println("Creating deployment nginx...") result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{}) if err != nil { panic(err) } fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName()) }
運行結果
$ go run deployment-create.go
Creating deployment nginx...
Created deployment "nginx-deployment".
https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-deployment/main.go
更改服務的副本數,由上一步創建的2修改成1,并修改鏡像由nginx1.12–>nginx1.13
package main import ( "context" "flag" "fmt" "path/filepath" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "k8s.io/client-go/util/retry" // // Uncomment to load all auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth" // // Or uncomment to load specific auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth/azure" // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack" ) func main() { var kubeconfig *string if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", filepath.Join("config"), "(optional) absolute path to the kubeconfig file") } else { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault) retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { // Retrieve the latest version of Deployment before attempting update // RetryOnConflict uses exponential backoff to avoid exhausting the apiserver result, getErr := deploymentsClient.Get(context.TODO(), "nginx-deployment", metav1.GetOptions{}) if getErr != nil { panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr)) } result.Spec.Replicas = int32Ptr(1) // reduce replica count result.Spec.Template.Spec.Containers[0].Image = "nginx:1.13" // change nginx version _, updateErr := deploymentsClient.Update(context.TODO(), result, metav1.UpdateOptions{}) return updateErr }) if retryErr != nil { panic(fmt.Errorf("Update failed: %v", retryErr)) } fmt.Println("Updated deployment nginx") } func int32Ptr(i int32) *int32 { return &i }
運行結果
$ go run deployment-update.go
Updated deployment nginx
刪除上面創建的nginx-deployment
資源,刪除之前添加了確認語句
package main import ( "bufio" "context" "flag" "fmt" "os" "path/filepath" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" // // Uncomment to load all auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth" // // Or uncomment to load specific auth plugins // _ "k8s.io/client-go/plugin/pkg/client/auth/azure" // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack" ) func main() { var kubeconfig *string if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", filepath.Join( "config"), "(optional) absolute path to the kubeconfig file") } else { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault) prompt() fmt.Println("Deleting deployment nginx...") deletePolicy := metav1.DeletePropagationForeground if err := deploymentsClient.Delete(context.TODO(), "nginx-deployment", metav1.DeleteOptions{ PropagationPolicy: &deletePolicy, }); err != nil { panic(err) } fmt.Println("Deleted deployment.") } func prompt() { fmt.Printf("-> Press Return key to continue, will delete!") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { break } if err := scanner.Err(); err != nil { panic(err) } fmt.Println() } func int32Ptr(i int32) *int32 { return &i }
運行結果
$ go run deployment-delete.go
-> Press Return key to continue, will delete! 這里點擊回車后繼續刪除資源Deleting deployment nginx...
Deleted deployment.
以上是“如何使用client-go工具調用kubernetes API接口”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。