Viblo Learning
+21

Tự động cài đặt Kubernetes cluster với RKE, rút gọn kubectl command với kubectx và kubens

RKE viết tắt của cụm danh từ Rancher Kubernetes Engine. Bài viết này sẽ thực hiện setup Kubernetes cluster với RKE CLI - tự động hóa và đơn giản hóa việc setup Kubernetes cluster. Tránh gặp phải các lỗi phổ biến trong quá trình cài đặt. Phiên bản RKE sử dụng trong bài là v1.2.8.

Warning: Nếu bạn thấy chủ đề này hay, bạn hãy clip lại bài này để khi nào rảnh thì ngồi thực hành chơi cho vui nhé. 😄

Cài đặt RKE

Bạn download file binary mới nhất về dùng nha: https://github.com/rancher/rke/releases.

Chuẩn bị K8s node

Mình sẽ thiết lập K8s cluster có 4 node. Trong đó, 1 node master và 3 node còn lại là worker. Mình sử dụng máy ảo để dựng các node. Bạn có thể tham khảo bài viết Hướng dẫn dựng máy ảo Debian 10 trong Hyper-V trên Windows 10Hướng dẫn cách sử dụng ssh-copy-id để copy public key lên server của mình.

Như bạn biết, với các node chạy K8s, chúng ta được khuyến nghị tắt swap đi để đảm bảo tính ổn định. Bài viết này vẫn sử dụng K8s với Docker nhé. Do đó, chúng ta sẽ thực hiện các việc trên với tất cả các node.

Lưu ý: Chi tiết các requirement xem tại đây https://rancher.com/docs/rke/latest/en/os.

Tip: Nếu bạn dùng Tmux như mình thì có thể mở 4 pane, mỗi pane SSH tới một node rồi sau đó bật chế độ synchoronize-panes để gõ lệnh trên nhiều pane cùng một lúc nhé. Kiểu như multi-cursor khi code ấy.

# Bật
setw synchronize-panes on
# Tắt
setw synchronize-panes off

Giống như này nè:

(Nguồn ảnh: https://github.com/gpakosz/.tmux)

  1. Tắt swap trên các node
sudo swapoff -a \
    && sudo cp -f /etc/fstab /etc/fstab.bak \
    && sudo sed -e '/swap/ s/^#*/#/' -i /etc/fstab

Lưu ý: fstab.bak là file backup lại của /etc/fstab, các dòng lệnh khai báo bộ nhớ swap được comment lại để nếu restart lại node thì swap không bị bật trở lại.

  1. Cài đặt Docker trên các node

Mình cài Docker cho các máy ảo Debian 10 của mình theo hướng dẫn của Docker. Các bạn lưu ý nếu các node của bạn không dùng Debian thì đọc doc của Docker để chạy cho đúng lệnh nha.

sudo apt-get update

sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

  1. Một requirement nữa đó các cài đặt sysctl cần được apply:
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1

Mở vim lên điền nội dung vào file (nếu dùng Tmux thì bạn nhớ bật synchronize-panes=on để tiết kiệm thời gian).

echo "net.bridge.bridge-nf-call-ip6tables=1" | sudo tee -a /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Chuẩn bị file cấu hình RKE Cluster

Nhớ lại phần trước chút nhé, trong bài viết này mình chuẩn bị 4 node. Trong đó sẽ có:

  • 1 node master, với vai trò control-plane, etcd. Cấu hình tối thiểu cho master: 2 cores - 4GB RAM
  • 3 node worker, với vai trò worker

Sử dụng RKE CLI với lệnh sau để bắt đầu tạo file cấu hình cho RKE Cluster. RKE CLI sẽ tạo ra một file có cluster.yml với các options để cấu hình K8s node: Cấu hình đăng nhập qua SSH, k8s network plugin gì, vai trò của các node là gì...

RKE sẽ dùng file này để SSH vào các node rồi tự động setup Kubernetes cluster cho chúng ta. Bạn không cần phải lên server cài kubectl, kubeadm... nữa.

Chi tiết về các options trong file cluster.yml, chúng ta có thể đọc thêm tại tài liệu của Rancher tại đường dẫn https://rancher.com/docs/rke/latest/en/config-options.

rke config --name mycluster.yml

Tham số: --name=mycluster.yml để chỉ định tên file YAML output thay vì dùng tên mặc định là cluster.yml.

Sau đó bạn trả lời các câu hỏi để hoàn tất việc cấu hình. Dưới đâu là mẫu mà mình dùng cho bài viết này.

[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]: ~/.ssh/kimnguyen.ict
[+] Number of Hosts [1]: 4
[+] SSH Address of host (1) [none]: 192.168.137.10
[+] SSH Port of host (1) [22]:
[+] SSH Private Key Path of host (192.168.137.10) [none]: ~/.ssh/kimnguyen.ict
[+] SSH User of host (192.168.137.10) [ubuntu]: clouduser
[+] Is host (192.168.137.10) a Control Plane host (y/n)? [y]: y
[+] Is host (192.168.137.10) a Worker host (y/n)? [n]: n
[+] Is host (192.168.137.10) an etcd host (y/n)? [n]: y
[+] Override Hostname of host (192.168.137.10) [none]: master
[+] Internal IP of host (192.168.137.10) [none]: 192.168.137.10
[+] Docker socket path on host (192.168.137.10) [/var/run/docker.sock]:
[+] SSH Address of host (2) [none]: 192.168.137.11
[+] SSH Port of host (2) [22]:
[+] SSH Private Key Path of host (192.168.137.11) [none]: ~/.ssh/kimnguyen.ict
[+] SSH User of host (192.168.137.11) [ubuntu]: clouduser
[+] Is host (192.168.137.11) a Control Plane host (y/n)? [y]: n
[+] Is host (192.168.137.11) a Worker host (y/n)? [n]: y
[+] Is host (192.168.137.11) an etcd host (y/n)? [n]: n
[+] Override Hostname of host (192.168.137.11) [none]: worker1
[+] Internal IP of host (192.168.137.11) [none]: 192.168.137.11
[+] Docker socket path on host (192.168.137.11) [/var/run/docker.sock]:
[+] SSH Address of host (3) [none]: 192.168.137.12
[+] SSH Port of host (3) [22]:
[+] SSH Private Key Path of host (192.168.137.12) [none]: ~/.ssh/kimnguyen.ict
[+] SSH User of host (192.168.137.12) [ubuntu]: clouduser
[+] Is host (192.168.137.12) a Control Plane host (y/n)? [y]: n
[+] Is host (192.168.137.12) a Worker host (y/n)? [n]: y
[+] Is host (192.168.137.12) an etcd host (y/n)? [n]: n
[+] Override Hostname of host (192.168.137.12) [none]: worker2
[+] Internal IP of host (192.168.137.12) [none]: 192.168.137.12
[+] Docker socket path on host (192.168.137.12) [/var/run/docker.sock]:
[+] SSH Address of host (4) [none]: 192.168.137.13
[+] SSH Port of host (4) [22]:
[+] SSH Private Key Path of host (192.168.137.13) [none]: ~/.ssh/kimnguyen.ict
[+] SSH User of host (192.168.137.13) [ubuntu]: clouduser
[+] Is host (192.168.137.13) a Control Plane host (y/n)? [y]: n
[+] Is host (192.168.137.13) a Worker host (y/n)? [n]: y
[+] Is host (192.168.137.13) an etcd host (y/n)? [n]: n
[+] Override Hostname of host (192.168.137.13) [none]: worker3
[+] Internal IP of host (192.168.137.13) [none]: 192.168.137.13
[+] Docker socket path on host (192.168.137.13) [/var/run/docker.sock]:
[+] Network Plugin Type (flannel, calico, weave, canal, aci) [canal]: calico
[+] Authentication Strategy [x509]:
[+] Authorization Mode (rbac, none) [rbac]:
[+] Kubernetes Docker image [rancher/hyperkube:v1.20.6-rancher1]:
[+] Cluster domain [cluster.local]: mycluster.local
[+] Service Cluster IP Range [10.43.0.0/16]:
[+] Enable PodSecurityPolicy [n]:
[+] Cluster Network CIDR [10.42.0.0/16]:
[+] Cluster DNS Service IP [10.43.0.10]:
[+] Add addon manifest URLs or YAML files [no]: yes
[+] Enter the Path or URL for the manifest [none]: https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
[+] Add another addon [no]: yes
[+] Enter the Path or URL for the manifest [none]: https://gist.githubusercontent.com/superseb/499f2caa2637c404af41cfb7e5f4a938/raw/930841ac00653fdff8beca61dab9a20bb8983782/k8s-dashboard-user.yml
[+] Add another addon [no]: n

Bắt đầu cài đặt RKE cluster

Sau khi có file mycluster.yml ở phần trên, chúng ta sẽ tiếp tục dùng RKE CLI để quá trình cài đặt chính thức bắt đầu.

rke up --config mycluster.yml
  • Nếu trong quá trình cài đặt gặp lỗi bạn cứ thử chạy lại lệnh rke up ở trên nhé, các bước nào đã thực hiện thì sau đó sẽ được skip.
  • Nếu muốn gỡ bỏ RKE cluster khỏi các node trên bạn chạy lệnh sau:
rke remove --config mycluster.yml
INFO[0000] Running RKE version: v1.2.8
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [192.168.137.13]
INFO[0000] [dialer] Setup tunnel for host [192.168.137.11]
INFO[0000] [dialer] Setup tunnel for host [192.168.137.10]
INFO[0000] [dialer] Setup tunnel for host [192.168.137.12]
INFO[0001] Checking if container [cluster-state-deployer] is running on host [192.168.137.10], try #1
INFO[0001] Image [rancher/rke-tools:v0.1.74] exists on host [192.168.137.10]
INFO[0001] Starting container [cluster-state-deployer] on host [192.168.137.10], try #1
INFO[0001] [state] Successfully started [cluster-state-deployer] container on host [192.168.137.10]
INFO[0001] Checking if container [cluster-state-deployer] is running on host [192.168.137.11], try #1
INFO[0001] Image [rancher/rke-tools:v0.1.74] exists on host [192.168.137.11]
INFO[0002] Starting container [cluster-state-deployer] on host [192.168.137.11], try #1
INFO[0002] [state] Successfully started [cluster-state-deployer] container on host [192.168.137.11]
INFO[0002] Checking if container [cluster-state-deployer] is running on host [192.168.137.12], try #1
INFO[0002] Image [rancher/rke-tools:v0.1.74] exists on host [192.168.137.12]
INFO[0002] Starting container [cluster-state-deployer] on host [192.168.137.12], try #1
INFO[0002] [state] Successfully started [cluster-state-deployer] container on host [192.168.137.12]
INFO[0003] Checking if container [cluster-state-deployer] is running on host [192.168.137.13], try #1
INFO[0003] Image [rancher/rke-tools:v0.1.74] exists on host [192.168.137.13]
INFO[0003] Starting container [cluster-state-deployer] on host [192.168.137.13], try #1
INFO[0003] [state] Successfully started [cluster-state-deployer] container on host [192.168.137.13]
INFO[0003] [certificates] Generating CA kubernetes certificates
...
INFO[0154] Finished building Kubernetes cluster successfully

Trong quá trình setup, một file mycluster.rkestate sẽ được tạo ra. File này chính là file lưu trữ trạng thái hiện tại và cấu hình hiện tại của RKE cluster sau khi chạy lệnh cài đặt bên trên. File này chứa cả những thông tin quan trọng như các certificate được dùng trong cluster. Do đó, chúng ta cần lữu giữ và bảo mật file này để có thể sử dụng nó trong các lần sửa đổi cluster sau này bằng RKE.

Tương tác với RKE cluster

kube_config_cluster.yml

Cuối cùng, chúng ta sẽ cần kiểm tra lại xem có đúng là RKE đã setup Kubernetes cluster hoàn chỉnh và đúng cho chúng ta chưa. Check nhanh bằng cách SSH và chạy thử lệnh:

docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED              STATUS                  PORTS     NAMES
3a86e7c6d0ff   rancher/mirrored-pause:3.2           "/pause"                 1 second ago         Up Less than a second             k8s_POD_calico-kube-controllers-7ddcfb748f-rf5w2_kube-system_c93539ae-4870-4c69-8673-7bace5e9dd87_87
19f6b34a4048   rancher/nginx-ingress-controller     "/usr/bin/dumb-init …"   53 seconds ago       Up 52 seconds                     k8s_nginx-ingress-controller_nginx-ingress-controller-zf9sp_ingress-nginx_4554b4be-8156-4094-93c6-39de2677674b_0
1da451d4e161   rancher/mirrored-pause:3.2           "/pause"                 About a minute ago   Up About a minute                 k8s_POD_calico-node-tjxc5_kube-system_28e61807-1f03-44b2-887b-0dce08c44042_1
21a6680cf1e1   rancher/mirrored-pause:3.2           "/pause"                 About a minute ago   Up About a minute                 k8s_POD_nginx-ingress-controller-zf9sp_ingress-nginx_4554b4be-8156-4094-93c6-39de2677674b_0
a21eaa67a7eb   rancher/hyperkube:v1.20.6-rancher1   "/opt/rke-tools/entr…"   47 minutes ago       Up About a minute                 kube-proxy
c906664b9ff8   rancher/hyperkube:v1.20.6-rancher1   "/opt/rke-tools/entr…"   47 minutes ago       Up About a minute                 kubelet
30ae6c174dff   rancher/rke-tools:v0.1.74            "nginx-proxy CP_HOST…"   47 minutes ago       Up About a minute                 nginx-proxy

Một điểm yếu mà Docker gặp phải đó chính là Docker chỉ chạy và quản lý được các container trên một node. Swarm mode giúp chúng ta có thể triển khai các container trên nhiều node dưới dạng cluster, các công việc deploy ứng dụng chúng ta đã hoàn toàn chỉ cần thực hiện trên master node. Nhưng khi muốn thao tác với một container chạy trong worker node từ master node thì lại không thể. Và đó là điểm trí tử đầu tiên.

Đối với Kubernetes, mỗi cluster sẽ có những cấu hình và context riêng. Dù bạn setup Kubernetes cluster thủ công hay bằng RKE thì luôn có một file config mô tả về cluster, các tài khoản có thể truy cập và thao tác trong cluster... Chúng được lưu trữ tại thư mục ~/.kube. Mặc định thì chúng ta sẽ có một file ~/.kube/config sẽ là file cấu hình của cluster.

Các file config sẽ được kubectl sử dụng để có thể truy cập lên server và tương tác với cluster như deploy chẳng hạn. Nếu bạn để ý, thì từ đầu bài đến giờ, chúng ta chưa hề cài đặt kubectl trên bất kỳ một node nào cả. RKE cũng không thực hiện việc đó. Bạn có thể check bằng lệnh:

which kubectl

Với RKE, sau khi cài đặt xong cluster thì ngoài file .rkestate ra sẽ có thêm một file nữa có tên là kube_config_cluster.yml. Trong bài này thì file sinh ra có tên là kube_config_mycluster.yml. Đây chính là file config của RKE cluster mà chúng ta vừa dựng. Chúng ta có thể sử dụng file config cluster này để tương tác với Kubernetes bằng kubectl được cài đặt trên máy local của bạn, truy cập được tới bất kỳ pod trên node bất kỳ mà chúng không phải SSH vào bất kỳ server nào cả.

Check thử bằng cách chạy lệnh sau:

kubectl --kubeconfig kube_config_mycluster.yml get nodes

Như bạn thấy, output của mình:

NAME      STATUS   ROLES               AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION    CONTAINER-RUNTIME
master    Ready    controlplane,etcd   10h   v1.20.6   192.168.137.10   <none>        Debian GNU/Linux 10 (buster)   4.19.0-16-amd64   docker://20.10.6
worker1   Ready    worker              10h   v1.20.6   192.168.137.11   <none>        Debian GNU/Linux 10 (buster)   4.19.0-16-amd64   docker://20.10.6
worker2   Ready    worker              10h   v1.20.6   192.168.137.12   <none>        Debian GNU/Linux 10 (buster)   4.19.0-16-amd64   docker://20.10.6
worker3   Ready    worker              10h   v1.20.6   192.168.137.13   <none>        Debian GNU/Linux 10 (buster)   4.19.0-16-amd64   docker://20.10.6

Ngắn gọn hơn với --context

kubectl hỗ trợ tương tác được với nhiều Kubernetes cluster vời nhiều file config như trên. Mặc định thì nó chỉ đọc file config cluster là ~/.kube/config. Nếu mỗi lần chạy command mà thêm cái path như kia thì toang quá.

Nếu không muốn merge các file config này lại thì bạn chỉ cần thiết lập biến môi trường KUBECONFIG để chỉ đường cho kubectl. Thêm biến môi trường này vào trong file .bashrc hoặc .zshrc hoặc .config/fish/config.fish để mỗi lần đăng nhập là biến này đã được tạo, theo mẫu sau:

export KUBECONFIG='~/.kube/config:~/.kube/kube_config_mycluster.yml:~/.kube/webee_staging.yml:~/.kube/webee_production.yml'
set KUBECONFIG $HOME/.kube/config:$HOME/.kube/kube_config_mycluster.yml:$HOME/.kube/webee_staging.yml:$HOME/.kube/webee_production.yml

Dùng option --context thay --kubeconfig:

kubectl --context local
NAME      STATUS   ROLES               AGE   VERSION
master    Ready    controlplane,etcd   10h   v1.20.6
worker1   Ready    worker              10h   v1.20.6
worker2   Ready    worker              10h   v1.20.6
worker3   Ready    worker              10h   v1.20.6

Ngắn hơn nữa với kubectx + kubens

Theo như trên, mỗi lần chúng ta chạy lệnh sẽ phải thêm option --context, mỗi khi tương tác với namespace khác nhau lại phải thêm --namespace sẽ rất bất tiện. Mình sẽ giới thiệu thêm một cách khác ngắn gọn hơn đó là dùng kubectx - https://github.com/ahmetb/kubectx/releases.

Bạn download file binary là kubectxkubens về và copy vào thưc mục /usr/local/bin (Linux). Trong đó thì:

  • kubectx: Xem và thay đổi context mặc định khi không gõ command mà không có --context
  • kubens: Liệt kê và thay đổi namespace mặc định khi gõ command mà không có --namespace

Cách dùng kubectx

  • Liệt kê các context:
kubectx
  • Đổi context mặc định sang cái khác:
kubectx <context-name>

Cách dùng kubens

  • Liệt kê các namespace:
kubens
  • Đổi namespace mặc định sang một cái khác:
kubens <namespace-name>

Tổng kết

Trên đây là bài chia sẻ của mình tới các bạn, nó mang đến một số kiến thức:

  • Cách để setup Kubernetes cluster tự động với RKE CLI
  • Cách sử dụng multi-clusters kubectl ngắn gọn với lệnh kubectxkubens
  • Mẹo sử dụng synchronize-panes với Tmux

Nếu bạn thấy bài viết này hay và hữu ích, nhớ upvote và clip bài này để ủng hộ mình nhé. Comment nếu bạn gặp vấn đề khi thực hiện hoặc muốn biết request thêm những bài viết về chủ đề mới. Chúc các bạn sẽ học tập thêm nhiều kiến thức mới trên Viblo.

Follow mình trên Viblo nhé! Cảm ơn các bạn đã theo dõi. 👋👋👋

Tài liệu tham khảo thêm


All Rights Reserved