Triển khai Kubernetes Cluster với K3s trên Ubuntu 24.04
Chúng ta sẽ sử dụng K3s thay vì Kubeadm vì K3s được thiết kế nhẹ, tối ưu cho môi trường production và tương thích cực tốt với TiDB Operator. K3s đóng gói sẵn Kubernetes, container runtime (containerd), CNI (Flannel), và traefik, giúp giảm thiểu bước cấu hình thủ công.
Bước 1: Chuẩn bị hệ thống và cài đặt K3s
Trên node master (cũng là node worker duy nhất trong môi trường lab), thực hiện lệnh sau để cài đặt K3s với container runtime là containerd và mạng Flannel. Chúng ta cần tắt SELinux và AppArmor để tránh xung đột với CNI và container runtime trong quá trình triển khai TiDB.
Tại sao: TiDB yêu cầu hiệu năng I/O cao và khả năng networking ổn định. K3s với Flannel cung cấp mạng overlay đơn giản nhưng đủ mạnh cho cluster nhỏ, và containerd là runtime tiêu chuẩn mới cho Kubernetes.
Kết quả mong đợi: Cluster Kubernetes được khởi tạo, service k3s chạy, và bạn có thể truy cập kubeconfig.
sudo apt update && sudo apt install -y curl wget git
sudo systemctl disable --now apparmor
setenforce 0 2>/dev/null || true
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="666" sh -
Kiểm tra trạng thái service K3s và lấy file kubeconfig.
systemctl status k3s
cat /etc/rancher/k3s/k3s.yaml
Kết quả mong đợi: Service k3s ở trạng thái "active (running)". File kubeconfig hiển thị cấu hình endpoint 127.0.0.1:6443.
Bước 2: Cấu hình Kubeconfig cho người dùng hiện tại
Để không phải gõ `sudo` hoặc `--kubeconfig` liên tục, chúng ta sẽ sao chép file kubeconfig vào home directory và chỉnh sửa endpoint để trỏ về IP máy chủ thay vì localhost (nếu cần truy cập từ xa) hoặc giữ nguyên localhost nếu chạy local.
Tại sao: TiDB Operator cần quyền admin để tạo Custom Resource Definitions (CRD) và Pod. Cấu hình này giúp bạn thao tác với `kubectl` như một người quản trị.
Kết quả mong đợi: Lệnh `kubectl get nodes` chạy thành công và trả về trạng thái "Ready".
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sed -i 's/127.0.0.1/0.0.0.0/g' $HOME/.kube/config
kubectl get nodes
Verify kết quả: Bạn sẽ thấy output liệt kê node với status "Ready". Nếu thấy "NotReady", kiểm tra CNI bằng `kubectl get pods -n kube-system`.
Cấu hình CNI và Storage Class cho TiDB
TiDB yêu cầu mạng có độ trễ thấp và storage hỗ trợ ephemeral volumes hoặc persistent volumes có hiệu năng cao. Mặc định K3s dùng Flannel, nhưng để tối ưu cho TiDB (đặc biệt là TiKV và PD), chúng ta cần đảm bảo CNI hoạt động tốt và có Storage Class phù hợp.
Bước 1: Cài đặt và cấu hình CNI (Flannel đã có sẵn, kiểm tra lại)
Flannel đi kèm với K3s mặc định. Tuy nhiên, để đảm bảo tính ổn định cho TiDB, chúng ta cần xác nhận rằng pod network đã được thiết lập đúng và CIDR không bị xung đột với network vật lý.
Tại sao: TiDB sử dụng gossip protocol và RPC nội bộ. Nếu CNI bị lỗi hoặc CIDR trùng, các node trong cluster sẽ không thể giao tiếp với nhau, dẫn đến cluster không thể hình thành.
Kết quả mong đợi: Pod trong namespace `kube-system` đều ở trạng thái "Running".
kubectl get pods -n kube-system
Bước 2: Tạo Storage Class cho Local Storage (Local Path Provisioner)
Trong môi trường Ubuntu 24.04 standalone, chúng ta sẽ sử dụng `local-path-provisioner` để cung cấp Persistent Volumes (PV) từ disk local. Đây là cách nhanh nhất để có storage mà không cần cài đặt NFS hay Ceph phức tạp ở giai đoạn này.
Tại sao: TiDB Operator cần một Storage Class để mount data volume cho TiKV và PD. Local Path Provisioner cung cấp performance cao vì bypass network I/O, rất quan trọng cho write-heavy workload của TiDB.
Kết quả mong đợi: Storage Class `local-storage` được tạo và trở thành default (hoặc được đánh dấu).
Đường dẫn file cấu hình: `/tmp/local-storage-class.yaml`
cat
Verify kết quả: Chạy lệnh dưới để đảm bảo Storage Class tồn tại và Pod provisioner đang chạy.
kubectl get sc
kubectl get pods -n local-storage
Cài đặt TiDB Operator thông qua Helm Chart
TiDB Operator là bộ điều khiển (controller) để tự động hóa việc triển khai, quản lý và mở rộng TiDB Cluster trên Kubernetes. Chúng ta sẽ sử dụng Helm chart chính thức từ TiDB.
Bước 1: Cài đặt Helm và thêm Repository TiDB
Cài đặt Helm CLI và thêm repo `tidb` vào configuration của Helm.
Tại sao: Helm là công cụ quản lý package tiêu chuẩn cho Kubernetes, giúp cài đặt TiDB Operator chỉ với một lệnh và quản lý version dễ dàng.
Kết quả mong đợi: Repository `tidb` được thêm vào danh sách và sẵn sàng để search.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash -
helm repo add tidb https://charts.pingcap.org
helm repo update
Bước 2: Cài đặt TiDB Operator
Tạo namespace `tidb-admin` để chứa TiDB Operator và các CRD (Custom Resource Definitions). Sau đó cài đặt chart `tidb-operator`.
Tại sao: Namespace riêng biệt giúp cách ly các component quản lý khỏi các application TiDB cluster. CRD sẽ được tạo trong bước này để Kubernetes hiểu các resource như `TidbCluster`, `TidbInstanceSet`.
Kết quả mong đợi: Các Pod của TiDB Operator (`tidb-scheduler`, `tidb-operator`) đang chạy và các CRD được tạo.
kubectl create namespace tidb-admin
helm install tidb-operator tidb/tidb-operator \
--namespace tidb-admin \
--set imagePullPolicy=IfNotPresent \
--set operator.image.repository=quay.io/pingcap/tidb-operator \
--set operator.image.tag=v1.6.0 \
--set scheduler.image.repository=quay.io/pingcap/tidb-scheduler \
--set scheduler.image.tag=v1.6.0 \
--set general.watchNamespace=tidb-admin
Verify kết quả: Kiểm tra trạng thái của Pods và CRDs.
kubectl get pods -n tidb-admin
kubectl get crd | grep tidb
Chờ khoảng 1-2 phút để Pods chuyển sang trạng thái "Running". Nếu thấy lỗi "ImagePullBackOff", hãy kiểm tra lại tag version hoặc cấu hình registry.
Bước 3: Cấu hình RBAC cho TiDB Operator (Tùy chọn nhưng khuyến nghị)
Để TiDB Operator có thể quản lý cluster trong bất kỳ namespace nào (không chỉ `tidb-admin`), chúng ta cần cấp quyền ClusterRoleBinding. Mặc định chart đã cấu hình khá tốt, nhưng nếu bạn muốn chắc chắn 100% quyền hạn.
Tại sao: TiDB Operator cần quyền tạo Pod, Service, PVC, và quản lý NetworkPolicy trong toàn bộ cluster để có thể deploy TiDB cluster vào namespace khác (ví dụ: `tidb-cluster-1`).
Kết quả mong đợi: ClusterRoleBinding được tạo, Operator có thể tương tác với toàn cluster.
kubectl create clusterrolebinding tidb-operator-binding \
clusterrole tidb-operator \
serviceaccount tidb-admin/tidb-operator
Verify kết quả: Đảm bảo TiDB Operator đã sẵn sàng nhận yêu cầu tạo cluster.
kubectl get clusterrolebinding tidb-operator-binding
Bây giờ môi trường Kubernetes của bạn đã sẵn sàng với TiDB Operator. Các bước tiếp theo sẽ là tạo TidbCluster CRD để triển khai thực tế.
Điều hướng series:
Mục lục: Series: Triển khai Database Multi-Cloud với TiDB và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và yêu cầu hệ thống cho TiDB Multi-Cloud
Phần 3: Triển khai TiDB Cluster đầu tiên với cấu hình cơ bản »