- vừa được xem lúc

Tương tác với Kubernetes sử dụng Golang

0 0 21

Người đăng: Trần Đức

Theo Viblo Asia

Giới thiệu

kugo

Link bài viết gốc trên blog của mình https://ductn.info/controller-kubernetes-with-golang/

Kubernetes cung cấp cho chúng ta một thư viện khá xịn xò tên là client-go :3. Trong bài viết này, mình sẽ sử dụng thư viện này để tạo ra một chương trình nho nhỏ để có thể tương tác tới cụm Kubernetes (Mình mới tìm hiểu về cái này thôi, anh em nào biết hoặc có sản phẩm nào hay ho thì chia sẻ mình với ???).

Mình sử dụng ngôn ngữ Golang để code và dùng minikube để tạo cụm Kubernetes. Anh em có follow theo bài viết của mình thì nhớ cài 2 cái này nhé, còn anh em nào có sẵn cụm k8s thì cài golang và múc thôi :3. OK!!! Chiến

Demo

Sau khi cài đặt xong Golang và minikube xong, tiến hành start cụm minikube

➜ list_pods git:(master) ✗ minikube start
? minikube v1.20.0 on Darwin 10.15.7
✨ Automatically selected the docker driver. Other choices: hyperkit, virtualbox, ssh
? Starting control plane node minikube in cluster minikube
? Pulling base image ...
? Creating docker container (CPUs=2, Memory=1987MB) ...
? Preparing Kubernetes v1.20.2 on Docker 20.10.6 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ...
? Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
? Enabled addons: storage-provisioner, default-storageclass
? Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Mình sẽ run command sau để liệt kê các pods đang chạy trong cụm minikube

➜ list_pods git:(master) ✗ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-74ff55c5b-8l6k6 1/1 Running 0 102m
kube-system etcd-minikube 1/1 Running 0 103m
kube-system kube-apiserver-minikube 1/1 Running 0 103m
kube-system kube-controller-manager-minikube 1/1 Running 0 103m
kube-system kube-proxy-b5qd8 1/1 Running 0 102m
kube-system kube-scheduler-minikube 1/1 Running 0 103m
kube-system storage-provisioner 1/1 Running 1 103m

Bây giờ, mình sẽ viết chương trình để tương tác tới cụm minikube và thực thi để lấy ra tên các pods đang chạy giống command trên (nhưng để đơn giản thì mình chỉ run lấy ra trường NAME thôi :3). Code thôi :3

Đầu tiên, anh em khởi tạo và cài đặt thư viện cần thiết cho chương trình

➜ list_pods go mod init list_pods
go: creating new go.mod: module list_pods
➜ list_pods go get -u k8s.io/client-go
go get: added k8s.io/client-go v0.22.0
➜ list_pods go get -u k8s.io/apimachinery
go get: added k8s.io/apimachinery v0.22.0

Sau khi cài đặt xong, anh em tạo file main.go và tiến hành code. Source code mình sẽ để tại đây

Bước 1: Import các thư viện cần thiết vào chương trình

package main import ( "context" "fmt" "os" 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"
)

Bước 2: Chúng ta code để lấy file config của Kubernetes từ thư mục của kubernetes khi cài đặt, dưới đây là code để lấy đường dẫn file config.

var kube_config_path string
home_dir := homedir.HomeDir() if _, err := os.Stat(home_dir + "/.kube/config"); err == nil { kube_config_path = home_dir + "/.kube/config"
} else { fmt.Println("Enter kubernetes config directory: ") fmt.Scanf("%s", kube_config_path)
} fmt.Println(kube_config_path)

Kết quả của chương trình trên sẽ trả về đường dẫn của file config

➜ list_pods git:(master) ✗ go run main.go
/Users/ductn/.kube/config

Note: Bước 2 anh em có thể bỏ qua bằng cách gán trực tiếp đường dẫn vào biến kube_config_path := "/Users/ductn/.kube/config", anh em dùng ubuntu thì thường file cấu hình sẽ nằm tại /home/(userid)/.kube/config, mình dùng MacOS nên file cấu hình của kubernetes nằm tại /Users/ductn/.kube/config.

Bước 3: Sau khi lấy đường dẫn file cấu hình, ta tiến hành đọc và build cấu hình cho chương trình. Mình sử dụng clientcmd API anh em nên bỏ chút time để đọc nhé ???.

// Build configuration from config file
config, err := clientcmd.BuildConfigFromFlags("", kube_config_path)
if err != nil { panic(err)
}

Bước 4: Sau đó, tạo clientset để có thể gọi APIs

// Create clientser
clientset, err := kubernetes.NewForConfig(config)
if err != nil { panic(err)
}

Bước 5: Tiếp theo, truy xuất list các pods trong cụm kubernetes. Do kubernetes được viết bằng Go nên ta có thể dùng trực tiếp API do kubernetes cung cấp ???.

// Create pods
pod, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
if err != nil { panic(err)
}

Bước 6: Cuối cùng, mình sẽ list ra tên các pods trong cụm kubernetes.

// Print list pods
for _, pod := range pod.Items { fmt.Printf("Pod name=/%s\n", pod.GetName())
}

Done!!! Cùng kiểm tra thành quả nào ???

➜ list_pods git:(master) ✗ go run main.go
/Users/ductn/.kube/config
Pod name=/coredns-74ff55c5b-8l6k6
Pod name=/etcd-minikube
Pod name=/kube-apiserver-minikube
Pod name=/kube-controller-manager-minikube
Pod name=/kube-proxy-b5qd8
Pod name=/kube-scheduler-minikube
Pod name=/storage-provisioner

He he :v vậy là xong :3. Trông cũng hịn hịn nhỷ ???. Hy vọng, bài viết này của mình sẽ giúp anh em hiểu được phần nào ứng dụng của thư viện client-go ???. Anh em cho mình xin ý kiến và có ý tưởng gì hay hay thì còm men để mình có làm thử thêm.

Cảm ơn anh em đã đọc ???.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 88

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 65

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 47

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 34

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 85

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 113