Kubernetes tập hợp một hoặc nhiều máy tính, có thể là máy ảo hoặc máy vật lý, thành một cụm để chạy khối lượng công việc trong các container. Nó hoạt động với nhiều trình chạy container khác nhau, chẳng hạn như Docker.
Node điều khiển (master node) trong Kubernetes xử lý mặt điều khiển (control plane) của cụm, quản lý khối lượng công việc và điều phối giao tiếp trong hệ thống. etcd là một kho dữ liệu key-value nhẹ, phân tán và liên tục (ban đầu được phát triển cho Container Linux). Nó lưu trữ đáng tin cậy dữ liệu cấu hình của cụm, đại diện cho trạng thái tổng thể của cụm tại bất kỳ thời điểm nào.
API server phục vụ API của Kubernetes sử dụng JSON qua HTTP, cung cấp cả giao diện nội bộ và bên ngoài cho Kubernetes. API server xử lý, xác thực các yêu cầu REST và cập nhật trạng thái của các đối tượng API trong etcd
, cho phép khách hàng cấu hình khối lượng công việc và container trên các node làm việc.
Scheduler là một thành phần có thể mở rộng, lựa chọn node để chạy pod chưa được lên lịch, dựa trên khả năng tài nguyên và các ràng buộc khác. Scheduler theo dõi việc phân bổ tài nguyên trên mỗi node để đảm bảo rằng khối lượng công việc không vượt quá tài nguyên khả dụng.
Controller là một vòng lặp điều phối (reconciliation loop) giúp đưa trạng thái thực tế của cụm tiến gần đến trạng thái mong muốn, thông qua việc giao tiếp với API server để tạo, cập nhật và xóa tài nguyên mà nó quản lý.
Node (hay còn gọi là worker hoặc minion) là máy tính nơi các container (khối lượng công việc) được triển khai. Mỗi node trong cụm phải chạy một container runtime cũng như các thành phần sau để có thể giao tiếp với cấu hình mạng chính của các container.
Kubelet chịu trách nhiệm về trạng thái hoạt động của mỗi node, đảm bảo rằng tất cả container trên node đều hoạt động tốt. Nó quản lý việc khởi động, dừng và duy trì các container ứng dụng được tổ chức thành các pod theo chỉ đạo từ control plane.
Container runtime chịu trách nhiệm về vòng đời của container, bao gồm khởi chạy, đồng bộ hóa và hủy container. Kubelet tương tác với runtime thông qua Container Runtime Interface (CRI) để tách biệt phần lõi Kubernetes khỏi phần triển khai cụ thể.
Kube-proxy là một trình proxy mạng và cân bằng tải, hỗ trợ các thao tác mạng và trừu tượng hóa dịch vụ. Nó định tuyến lưu lượng đến đúng container dựa trên IP và cổng của yêu cầu đến.
Bài viết này hướng dẫn triển khai cụm Kubernetes trên hạ tầng On-Premise (máy chủ vật lý).
Lưu ý: Thư mục kubernetes chứa các file chuẩn bị máy chủ để cài đặt cụm Kubernetes hoặc tham gia vào cụm.
Hãy chạy các lệnh sau trên tất cả máy chủ:
sudo ansible servers -m ping -i inventory.ini -u root sudo ansible-playbook -i inventory.ini Kubernetes/ServerPrepare.yml -u root
Cụm Kubernetes
Địa chỉ các node control-plane:
- 192.168.56.120
- 192.168.56.121
- 192.168.56.122
Địa chỉ các node worker:
- 192.168.56.123
- 192.168.56.124
Các máy ảo được host trên VirtualBox theo sơ đồ sau:
Địa chỉ máy chủ HAProxy (Load Balancer cho kube-apiserver):
- 192.168.56.118
File haproxy.cfg:
stats enable
(frontend bind to 192.168.56.118:6443)
(backend bind to 192.168.56.120:6443 192.168.56.121:6443 192.168.56.122:6443)
Bắt đầu cụm Kubernetes
Chạy các lệnh sau chỉ trên 192.168.56.120:
sudo kubeadm init --control-plane-endpoint="192.168.56.118:6443" --upload-certs --apiserver-advertise-address=192.168.56.120 --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
Và các lệnh sau trên tất cả node:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Cài đặt Calico Network Policy cho triển khai on-premises (dưới 50 node):
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/calico.yaml -O kubectl apply -f calico.yaml
Thêm các node khác vào cụm
Trên control-plane (ví dụ: 192.168.56.122):
kubeadm join 192.168.56.118:6443 --token c4c6wt.2rzubblajmxx7wf1 \ --discovery-token-ca-cert-hash sha256:91877d933445148c650e5fa11acca05d455fe1e9e53cd33f8497ad06a2126142 \ --control-plane --certificate-key 2e8c3d0a1f2d4aec3e4ccb09a0dd6f43756344269c0b414cdd83c0ef02c0293d \ --apiserver-advertise-address=192.168.56.122 --cri-socket=unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
Trên các node worker:
kubeadm join 192.168.56.118:6443 --token c4c6wt.2rzubblajmxx7wf1 \ --discovery-token-ca-cert-hash sha256:91877d933445148c650e5fa11acca05d455fe1e9e53cd33f8497ad06a2126142 \ --cri-socket=unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
Bước cuối cùng – Kiểm tra cụm hoạt động
kubectl get nodes -o wide kubectl get pod -A
HAProxy Stats:
haproxy.cfg:
Chúc các bạn thành công!