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:
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.
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