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

Giới thiệu Link bài viết gốc trên blog của mình https://ductn.info/controller-kubernetes-with-golang/ Anh em theo dõi phần 2 tại đây nha ^^ 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

Giới thiệu

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

kugo

Anh em theo dõi phần 2 tại đây nha ^^

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=/%sn", 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 😄😄😄.

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,