Mở Đầu
Trong bài viết này, chúng ta sẽ tiếp tục với Chuỗi Series [K8S]: Phần 1 – Install Kubernetes Cluster trên môi trường Lab. Series này sẽ tập trung vào từng bước triển khai Kubernetes – nền tảng quản lý container mạnh mẽ cho các ứng dụng phân tán. Đối với các môi trường yêu cầu khả năng mở rộng và tự động hóa cao, việc thiết lập Kubernetes Cluster đóng vai trò vô cùng quan trọng trong việc quản lý và điều phối container.
Qua từng bài viết, bạn sẽ nắm vững từ những kiến thức cơ bản đến các bước cấu hình chi tiết, giúp dễ dàng xây dựng môi trường Kubernetes sẵn sàng cho triển khai ứng dụng thực tế.
Mô Hình
Đây là mô hình kiến trúc triển khai một Kubernetes Cluster với các thành phần chính như sau:
- Network: Lớp mạng là nền tảng cơ bản kết nối toàn bộ hệ thống, đảm bảo các thành phần trong Cluster có thể giao tiếp với nhau.
- K8S Platform: Đây là nền tảng Kubernetes, nơi các dịch vụ Kubernetes vận hành, bao gồm các thành phần như API Server, Scheduler, Controller Manager, và v.v.
- Control Plan Node: Đây là thành phần quản lý của Kubernetes Cluster, chịu trách nhiệm giám sát và điều khiển toàn bộ Cluster.
- Gồm nhiều node master: Master-1, Master-2, và Master-3. Việc triển khai nhiều node master (multi-master setup) giúp tăng tính khả dụng và tính chịu lỗi cho hệ thống, tránh điểm lỗi đơn (single point of failure). Trong bài lab này, mình chỉ chạy 1 master node cho đơn giản việc cài đặt. Ở các bài lab tiếp theo mình sẽ xây dựng tính sẵn sàng cho Master Node.
- Worker Node: Đây là các node thực thi, nơi các container chạy. Các node này chịu trách nhiệm chạy các workload của ứng dụng.
- Bao gồm 4 node worker: Worker-1, Worker-2, Worker-3, và Worker-4. Các node này sẽ triển khai các Pod, quản lý tài nguyên cho ứng dụng và đảm bảo tính sẵn sàng cho hệ thống.
- Namespace: Đây là cơ chế phân tách logic trong Kubernetes, cho phép quản lý và cô lập các tài nguyên giữa các nhóm hoặc dự án khác nhau trong cùng một Cluster.
- Ingress Controller (Nginx): Ingress Controller (ở đây là Nginx) chịu trách nhiệm xử lý các yêu cầu từ bên ngoài vào Cluster, phân phối lưu lượng và điều phối các yêu cầu đến các dịch vụ trong Kubernetes. Nó giúp định tuyến các yêu cầu HTTP và HTTPS đến đúng ứng dụng hoặc dịch vụ.
- Repository (Harbor): Harbor là một Docker Registry được sử dụng để lưu trữ và quản lý Docker Images. Trong mô hình này, Harbor được đặt bên ngoài Cluster, đóng vai trò cung cấp các image cho Deployment Manager.
- Deployment Manager: Thành phần này chịu trách nhiệm triển khai và quản lý các ứng dụng hoặc dịch vụ trên Kubernetes Cluster, lấy image từ Repository (Harbor) và triển khai lên các worker node trong Cluster.
Cài Đặt Kubernetes Cluster
Thực hiện trên cả Master & Worker Node
Để Install Kubernetes Cluster, thực hiện các bước
- Cài đặt DNS
sudo yum install -y bind-utils
- Mục đích: Cài đặt công cụ bind-utils, bao gồm các lệnh DNS như dig và nslookup. Các công cụ này giúp kiểm tra và xử lý sự cố liên quan đến DNS, rất quan trọng để đảm bảo Kubernetes Cluster có thể phân giải tên miền chính xác khi cần.
- Tắt swap
sudo swapoff -a
sudo sed -i ‘/ swap / s/^\(.*\)$/#\1/g’ /etc/fstab
- Tắt swap trên hệ thống. Kubernetes yêu cầu tắt swap để đảm bảo tính ổn định trong việc quản lý bộ nhớ của các node trong Cluster. Nếu swap không được tắt, một số tiến trình trong Kubernetes sẽ không hoạt động đúng và ngăn không cho swap tự động kích hoạt khi khởi động lại máy.
- Cấu hình module kernel cho containerd
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
- Mục đích: Tạo file /etc/modules-load.d/containerd.conf và thêm các module kernel overlay và br_netfilter.
- overlay: Module này giúp tăng hiệu suất khi sử dụng hệ thống file OverlayFS, thường được dùng trong môi trường container.
- br_netfilter: Module này giúp lọc các gói mạng trên các bridge network, cần thiết để Kubernetes quản lý network giữa các container.
sudo modprobe overlay
sudo modprobe br_netfilter
- Lệnh modprobe: Tải và kích hoạt các module kernel overlay và br_netfilter vào kernel, giúp hệ thống nhận diện các module này mà không cần khởi động lại.
- Cấu hình network cho Kubernetes
sudo vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
- Mục đích: Tạo hoặc chỉnh sửa file cấu hình k8s.conf trong thư mục /etc/sysctl.d, nơi lưu các cấu hình liên quan đến kernel.
- net.bridge.bridge-nf-call-iptables = 1: Đảm bảo các gói mạng đi qua bridge sẽ được xử lý bởi iptables, cần thiết cho quản lý network của Kubernetes.
- net.ipv4.ip_forward = 1: Cho phép chuyển tiếp IP, giúp các gói dữ liệu có thể đi qua hệ thống và đến đúng đích, cần thiết cho network của các pod trong Kubernetes.
- net.bridge.bridge-nf-call-ip6tables = 1: Tương tự như cấu hình trên, nhưng dành cho IPv6.
- Áp dụng cấu hình kernel
sudo sysctl –system
- Lệnh sysctl –system: Áp dụng toàn bộ các cấu hình trong thư mục /etc/sysctl.d/. Điều này giúp các thay đổi vừa cấu hình trong file k8s.conf có hiệu lực ngay mà không cần khởi động lại máy.
6. Tải docker
sudo dnf config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install containerd.io -y
- Cấu hình containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
- Mục đích: Tạo file cấu hình mặc định cho containerd tại đường dẫn /etc/containerd/config.toml.
sudo sed -i ‘s/SystemdCgroup \= false/SystemdCgroup \= true/g’ /etc/containerd/config.toml
- Mục đích: Chuyển SystemdCgroup từ false sang true trong file cấu hình của containerd.
sudo systemctl restart containerd
sudo systemctl enable containerd
- systemctl restart containerd: Khởi động lại containerd để áp dụng các thay đổi trong file cấu hình.
- systemctl enable containerd: Bật tự động khởi động containerd khi hệ thống khởi động.
- Cấu hình kho lưu trữ (repository) cho Kubernetes
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
- Mục đích: Tạo file repo /etc/yum.repos.d/kubernetes.repo để thêm kho lưu trữ chính thức của Kubernetes vào hệ thống, phục vụ cho việc cài đặt các gói kubelet, kubeadm, và kubectl.
- Cấu hình repo:
- [kubernetes]: Đặt tên cho kho lưu trữ là kubernetes.
- name=Kubernetes: Mô tả kho lưu trữ.
- baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/: URL của kho lưu trữ chính thức cho phiên bản Kubernetes 1.28.
- enabled=1: Bật kho lưu trữ này.
- gpgcheck=1: Bật kiểm tra GPG để xác minh tính toàn vẹn của các gói.
- gpgkey=…: Đường dẫn đến khóa GPG của kho lưu trữ.
- exclude=…: Loại trừ các gói cụ thể khỏi kho lưu trữ này.
- Cài đặt kubelet, kubeadm, và kubectl
sudo yum install -y kubelet kubeadm kubectl –disableexcludes=Kubernetes
- Mục đích: Cài đặt ba thành phần chính của Kubernetes:
- kubelet: Thành phần chạy trên mỗi node, chịu trách nhiệm quản lý vòng đời của các pod.
- kubeadm: Công cụ giúp dễ dàng thiết lập Kubernetes Cluster.
Thực Hiện Trên Master Node
10. Tạo Control Plan
sudo systemctl enable –now kubelet
sudo kubeadm init –control-plane-endpoint=k8s-master01.vsslab.com
11. Tạo Configure cho node master
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
12. Thực hiện join các Worker Node
Copy lệnh join từ Master node và thực hiện trên các worker node
kubectl get nodes
13. Cài đặt network cho K8S
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
kubectl get pods -n kube-system
kubectl get nodes
Kết Luận
Kết thúc Phần 1 của Chuỗi Series Install Kubernetes Cluster, chúng ta đã thực hiện các bước đầu tiên để cài đặt và cấu hình Kubernetes Cluster trên môi trường Lab. Đây là bước nền tảng quan trọng, giúp bạn hiểu rõ cách thức hoạt động của một hệ thống quản lý container và đặt nền móng cho các phần triển khai tiếp theo.
Trong chuỗi Series tiếp theo, chúng ta sẽ tiếp tục mở rộng và đi sâu vào các thành phần và tính năng nâng cao của Kubernetes, từ quản lý tài nguyên, phân phối ứng dụng. Hãy cùng đón chờ và theo dõi nhé!