0

Cách tạo Kubernetes(K8s) Cluster Home Lab bằng Ubuntu Server 24.04

Cấu hình Kubernetes Cluster Home Lab 🖥️⚙️ Một Kubernetes cluster bao gồm các node (máy tính hoặc VM) để chạy các ứng dụng containerized. Nó cung cấp khả năng mở rộng, tính sẵn sàng cao và tự động hóa cho việc triển khai ứng dụng.

Cấu hình Lab với 2 Nodes:

  • Master Node (kb1)
  • Worker Node (kb2)

Cấu hình Node:

  • CPU: 2
  • RAM: 3GB
  • Storage: 20GB

Địa chỉ IP:

  • kb1 (Master Node): 192.168.0.112
  • kb2 (Worker Node): 192.168.0.113

Lưu ý: Đảm bảo SSH hoạt động giữa hai node trước khi bắt đầu cài đặt!

Bước 1: Cấu hình hostname và cập nhật file hosts

1. Đổi hostname (Tùy chọn)

Trên mỗi node, chạy lệnh sau để đặt hostname:

sudo hostnamectl set-hostname "<new-host-name>"

VD:

sudo hostnamectl set-hostname "kb1"

Thêm ánh xạ IP và tên máy chủ trên mỗi nút để cập nhật giao tiếp mạng.

Chỉnh sửa tập tin máy chủ:

cd  /etc/hosts

Sau đó thêm dòng sau:

<IP> <Hostname>
<IP> <Hostname>

VD:

192.168.0.112  kb1
192.168.0.113  kb2

Bước 2: Đối với tất cả các nút

Hãy vô hiệu hóa Swap và Load Kernel Modules

sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Để tải các mô-đun hạt nhân bằng modprobe.

sudo modprobe overlay && sudo modprobe br_netfilter

Để tải vĩnh viễn các mô-đun này, hãy tạo tệp có nội dung sau.

sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

Tiếp theo, thêm các tham số hạt nhân như chuyển tiếp IP. Tạo một tệp và tải các tham số bằng lệnh sysctl.

sudo tee /etc/sysctl.d/kubernetes.conf <<EOT
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOT

Để tải các tham số hạt nhân ở trên, dùng lệnh:

sudo sysctl --system

Bước 3: Đối với tất cả các nút

Cài đặt Containerd

Đầu tiên, cài đặt các phụ thuộc của containerd

sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

Tiếp theo, thêm kho lưu trữ containerd

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Bây giờ, hãy cài đặt containerd

sudo apt update && sudo apt install containerd.io -y

Cấu hình containerd để nó bắt đầu sử dụng SystemdCgroup.

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

Khởi động lại containerd để xem hiệu ứng

sudo systemctl restart containerd

Để kiểm tra trạng thái của containerd

sudo systemctl status containerd

Output:

● containerd.service - containerd container runtime
     Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; preset: enabled)
     Active: active (running) since Mon 2025-02-17 16:20:34 UTC; 2h 17min ago
       Docs: https://containerd.io
    Process: 738 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 741 (containerd)
      Tasks: 156
     Memory: 201.3M (peak: 229.5M)
        CPU: 20min 13.594s
     CGroup: /system.slice/containerd.service
             ├─  741 /usr/bin/containerd
             ├─ 1138 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 53e05d7bda37772f5869ec026de03b40d4ce532ba0303c42be5184994439b3bf -address /run/containerd/containerd.sock
             ├─ 1139 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 5398ebda2355cad57be69e19bf098e4202fe259a61270ea9cc274b81f77977ab -address /run/containerd/containerd.sock
             ├─ 1140 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id e4f1f987a5fb8db03db049b518fdfe6680b8c83617733de91620948c6bc00c95 -address /run/containerd/containerd.sock
             ├─ 1150 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 24d231aefec7bde2646ae123758907e5d464973705d8c0cd9d8db67756c19ef2 -address /run/containerd/containerd.sock
             ├─ 1547 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 4d7ddac790ef53cb30823d45ed4b675d54cf66694833158f8d15f0ba93b93e2c -address /run/containerd/containerd.sock
             ├─ 2267 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 72b50ae3cea036f3b51e18bf9b900ccd46399fed052bf51a41bcea735062f413 -address /run/containerd/containerd.sock
             ├─ 2377 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 2fcb5f2766fc1ff28a8a020c10eb1aff4b1895eb7ade8af65c72bedd0a634ead -address /run/containerd/containerd.sock
             ├─ 2434 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id d6f43f441495e4a00387114d5d7462bc54b1a592bd41bc1ee1709d16d507633b -address /run/containerd/containerd.sock
             └─27675 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 2b645f1523cda54eb099d35542d77347071c2cdaef648a7e5559ec01779bac29 -address /run/containerd/containerd.sock

Bước 4: Đối với tất cả các nút

Thêm kho lưu trữ gói kubernetes

Các gói K8s không có sẵn trong kho lưu trữ gói mặc định của Ubuntu 24.04, vì vậy trước tiên chúng ta cần thêm kho lưu trữ.

Đầu tiên, hãy tải xuống khóa ký công khai cho kho lưu trữ gói Kubernetes bằng lệnh curl.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/k8s.gpg

Tiếp theo, thêm kho lưu trữ

echo 'deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/k8s.list

Bước 5: Đối với tất cả các nút

Đặt các thành phần K8 như Kubeadm, Kubelet và Kubectl để quản lý cụm Kubernetes.

sudo apt update
sudo apt install kubelet kubeadm kubectl -y

Bước 6: Chỉ dành cho Master Node

Tạo cụm Kubernetes

Để khởi tạo mặt phẳng điều khiển hoặc nút chính bằng Kubeadm.

sudo kubeadm init --control-plane-endpoint=<master-node-name>

VD:

sudo kubeadm init --control-plane-endpoint=kb1

Output khi này: image.png

Theo hướng dẫn, hãy chạy các lệnh sau.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Bước 7: Chỉ dành cho các Worker Node

Thêm các Worker Node vào Master Node

Thêm các worker node vào cụm Kubernetes của bạn bằng cách sử dụng mã thông báo được tạo trong quá trình khởi tạo. image.png

VD:

sudo kubeadm join 192.168.0.112:6443 --token yagkiy.650e76uk72jycv1k --discovery-token-ca-cert-hash sha256:2f01622e81717582443eac4f206436e7e3bd018e2f23e4197906c22c38df9f14

Bây giờ quay lại Master Node và chạy:

kubectl get nodes

Output khi này:

NAME   STATUS   ROLES           AGE   VERSION
kb1    NotReady    control-plane   10d   v1.31.5
kb2    NotReady    <none>          10d   v1.31.5

Trạng thái của nút là NotReady . Để thay đổi thành Ready, chúng ta cần cài đặt plugin bổ trợ mạng Calico.

Bước 8: Chỉ dành cho Master Node

Cài đặt Calico Network Plugin

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml

Sau khi cài đặt thành công calico, trạng thái của nút sẽ chuyển thành Ready. Để kiểm tra hãy chạy lệnh bên dưới.

kubectl get pods -n kube-system

Output khi này:

NAME                                      READY   STATUS    RESTARTS      AGE
calico-kube-controllers-b8d8894fb-rz6zx   1/1     Running   3 (24h ago)   7d21h
calico-node-4klgg                         1/1     Running   0             24h
calico-node-9c9lg                         1/1     Running   0             24h
coredns-7c65d6cfc9-8f26s                  1/1     Running   3 (24h ago)   7d21h
coredns-7c65d6cfc9-sgsvc                  1/1     Running   3 (24h ago)   7d21h
etcd-kb1                                  1/1     Running   4 (24h ago)   10d
kube-apiserver-kb1                        1/1     Running   4 (24h ago)   10d
kube-controller-manager-kb1               1/1     Running   9 (24h ago)   10d
kube-proxy-h5fnm                          1/1     Running   2 (25h ago)   10d
kube-proxy-n9zts                          1/1     Running   4 (24h ago)   10d
kube-scheduler-kb1                        1/1     Running   7 (24h ago)   10d

Bây giờ, hãy kiểm tra trạng thái nút

kubectl get nodes

Output:

NAME   STATUS   ROLES           AGE   VERSION
kb1    Ready    control-plane   10d   v1.31.5
kb2    Ready    <none>          10d   v1.31.5

Bước 9: Kiểm tra cài đặt K8s

Tạo và triển khai NGINX để xác minh thiết lập.

Để tạo một không gian tên

kubectl create ns <namespace-name>

VD:

kubectl create ns demo-app

Để kiểm tra xem không gian tên đã được tạo hay chưa

 kubectl get namespace

Output:

NAME              STATUS   AGE
default           Active   10d
demo-app          Active   10d
kube-node-lease   Active   10d
kube-public       Active   10d
kube-system       Active   10d

Để triển khai nginx-app với hai bản sao bằng cách sử dụng không gian tên demo-app

kubectl create deployment nginx-app --image nginx --replicas 2 --namespace demo-app

Để kiểm tra xem việc triển khai đã được tạo hay chưa

kubectl get deployment -n demo-app

Output:

NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app   2/2     2            2           9m55s

Để kiểm tra xem các pod đã được tạo hay chưa

kubectl get pods -n demo-app

Output:

NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-7df7b66fb5-9wkds   1/1     Running   0          9m37s
nginx-app-7df7b66fb5-xppqk   1/1     Running   0          9m37s

Để expose việc triển khai:

kubectl expose deployment nginx-app -n demo-app --type NodePort --port 80

Output:

service/nginx-app exposed

Để kiểm tra dịch vụ đang chạy

kubectl get svc -n demo-app

Output:

NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-app   NodePort   10.110.254.203   <none>        80:31809/TCP   50s

Để truy cập ứng dụng nginx bằng nodeport

curl http://<any-worker-IP>:<exposed-port>

VD:

curl http://192.168.0.113:31809

Lưu ý rằng: Đừng có khớp số cổng với nhau

Output:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Cảm ơn các bạn đã theo dõi!

Nếu bạn chưa biết rõ Kubernetes là gì, hãy tham khảo bài viết này nhé: Kubernetes (K8s) là gì? Tìm hiểu cơ bản về Kubernetes


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí