Làm thế nào để tôi có thể test (kiểm tra) code của tôi trên cụm cluster của Kubernetes là mục tiêu của bài viết này. Trong bài viết này tôi đề cập đến trường hợp multi-node với kubeadm. Với mô hình all-in-one (https://github.com/kubernetes/kubernetes) thì apply code trực tiếp vào $GOPATH/src/k8s.io/kubernetes và ./hack/local-up-cluster.sh là ok.

Golang

1. Các bước chuẩn bị

  • Mô hình cụm kubernetes 3 nodes (3 VM) hoặc nhiều hơn: 1 master và 2 worker nodes. Link
  • Setup $GOPATH, $GOROOT và $PATH Link

Check status của các Nodes và POD

Thông tin 3 Nodes của cụm Kubernetes K8s Items

Thông tin các POD & services của Kubernetes K8s Items

2. Các giải pháp để test code trên Kubernetes

Hiện tại, mình mới tìm ra được 2 giải pháp để hỗ trợ cho việc test code cho mô hình multi-nodes với kubeadm, gồm:

  • Solution 1: Thực hiện trực tiếp trên POD chạy services của Kubernetes
  • Solution 2: Crash POD chạy services mình muốn và chạy trực tiếp service đó trên Node

Trong bài này, mình lấy ví dụ với service Scheduler để thực hiện. Như mọi người đã biết, Kubernetes hỗ trợ Self-hosting. Vì vậy chúng ta sẽ thấy các services sẽ chạy dưới dạng POD. Vì vậy các container sẽ run và lưu logs trên mỗi container riêng biệt.

Để thực hiện việc re-test code trên k8s, thì các developer cần clone Kubernetes thông qua lệnh go get -d k8s.io/kubernetes để lưu vào $GOPATH. Tiến hành chỉnh sửa, lưu lại và compile lại code.

$ go get -d k8s.io/kubernetes
$ cd $GOPATH/src/kubernetes
$ make # Perform compile all of services and write into _output folder
$ cd _output/ # To check all compiled components.

K8s Items

Solution 1: Thực hiện trực tiếp trên POD chạy services của Kubernetes

Để thực hiện được giải pháp này, chúng ta cần truy cập và container và đẩy code mới vào trong container chứa service cần thay đổi.

Liệt kê các POD của Scheduler services trong Master Node

$ docker ps | grep Scheduler # List out all POD of scheduler services

K8s Items

Compile soure-code mới nhất của Scheduler

$ cd $GOPATH/src/k8s.io/kubernetes
$ make WHAT=cmd/kube-scheduler

Kiểm tra nguồn kube-schedule binary bên trong POD scheduler

$ docker exec -it <name_of_pod> sh

K8s Items

Copy source-code đã compile của scheduler vào POD scheduler qua docker và restart lại POD

$ docker cp <?> <?>
$ docker restart <docker_id>

Solution 2: Crash POD chạy services mình muốn và chạy trực tiếp service đó trên Node

Đây là cách tiếp cận của mình và nó sẽ giúp cho việc Debug bằng GoLand. Với giải pháp này thì mình sẽ break POD của scheduler và chạy trực tiếp service đó trên Host. Như vậy, sẽ giúp mình check logs dễ dàng hơn.

Break POD của scheduler #Hiện mình chưa tìm được giải pháp để xóa POD trên kube-system. Chỉnh sửa thông tin của kube-scheduler.yaml, như host hoặc port để làm break Scheduler POD.

$ vim /etc/kubernetes/manifests/kube-scheduler.yaml

K8s Items

Check logs của scheduler sau khi chỉnh sủa trong manifests

$ kubectl --v=8 logs kube-scheduler-masternode -n kube-system

K8s Items

$ Kubectl get pod –all-namespaces

K8s Items

Tiến hành compile lại source-code mới nhất của Scheduler

$ cd $GOPATH/src/k8s.io/kubernetes
$ make WHAT=cmd/kube-scheduler

Bật Scheduler service trên Host

$ cd $GOPATH/kubernetes/_output/bin
$ sudo ./kube-scheduler --address=127.0.0.1 --kubeconfig=/etc/kubernets/scheduler.conf --leader-elect=true -v=4

Check trạng thái của Scheduler trên Host

$ ps -aux | grep scheduler

K8s Items

Kiểm tra logs của Scheduler trên Host

$ ps -aux | grep scheduler

K8s Items

Bây giờ chúng ta có thể sử dụng Scheduler được chạy trực tiếp trên Host. Mỗi lần cần test, chúng ta cần compile lại code và restart lại service

$ cd $GOPATH/src/k8s.io/kubernetes
$ make WHAT=cmd/kube-scheduler
$ cd $GOPATH/kubernetes/_output/bin
$ sudo ./kube-scheduler --address=127.0.0.1 --kubeconfig=/etc/kubernets/scheduler.conf --leader-elect=true -v=4

Author: Nguyễn Văn Trung - IRC: trungnv

3. References

  • https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/compiling-kubernetes-binaries