Yêu cầu tài nguyên và chuẩn bị hạ tầng Kubernetes
Để vận hành ổn định stack bao gồm Crossplane, ArgoCD và Backstage, cluster Kubernetes cần đáp ứng tối thiểu yêu cầu tài nguyên sau để tránh tình trạng OOMKilled hoặc nghẽn CPU.
Yêu cầu tối thiểu cho môi trường Dev:
- CPU: 4 Cores (Khuyến nghị 8 Cores nếu chạy nhiều môi trường song song).
- RAM: 8 GB (Khuyến nghị 16 GB để Backstage và Crossplane Controller hoạt động mượt mà).
- Disk: 50 GB SSD (NFS hoặc EBS nếu dùng cloud, LocalStorage nếu dùng on-prem).
- OS: Ubuntu 22.04 LTS hoặc Rocky Linux 9.
Chúng ta sẽ triển khai cluster sử dụng k3s vì tính đơn giản, nhẹ và phù hợp cho môi trường Dev/Stage nội bộ. k3s đã tích hợp sẵn CNI (Calico), Storage Class và Tracing.
Thực hiện cài đặt k3s trên node master với cấu hình mặc định nhưng tăng giới hạn RAM cho các thành phần hệ thống.
curl -sfL https://get.k3s.io | K3S_VERSION=v1.28.0+k3s1 K3S_CLUSTER_TOKEN=my_secure_token_12345 sh -
Command này sẽ tải về và cài đặt k3s server, khởi động kubelet và các control plane components. Token được đặt để dễ dàng join worker nodes sau này.
Kết quả mong đợi: Process k3s chạy, port 6443 (API server) mở, và file cấu hình ~/.kube/config được tạo tự động.
Verify cluster đang hoạt động:
sudo k3s kubectl get nodes
Verify kết quả: Output hiện trạng thái Ready của node master.
Cấu hình Network và Storage cho Platform
Hạ tầng GitOps cần mạng nội bộ ổn định để các controller (Crossplane, ArgoCD) giao tiếp với Git server và Kubernetes API. Chúng ta cần đảm bảo Calico (CNI mặc định của k3s) đang hoạt động và cấu hình LoadBalancer nếu cần expose dịch vụ ra ngoài.
Tạo namespace riêng biệt cho platform engineering để cách ly tài nguyên với các ứng dụng business.
kubectl create namespace platform-system
Namespace này sẽ chứa Crossplane, ArgoCD, và Backstage, giúp quản lý RBAC và resource limits tập trung.
Verify kết quả: Namespace được tạo thành công.
kubectl get namespace platform-system
Kết quả mong đợi: Trạng thái Active.
Cấu hình Storage Class để Backstage và GitOps có thể lưu trữ state nếu cần (ví dụ: volume mount cho database của Backstage hoặc cache của ArgoCD). Với k3s, ta dùng local-path mặc định.
kubectl get storageclass
Verify kết quả: Có ít nhất một storage class (thường là local-path hoặc hostpath) trong danh sách.
Thiết lập Git Repository làm Single Source of Truth
Chiến lược GitOps yêu cầu một repository Git duy nhất chứa toàn bộ trạng thái mong muốn (desired state) của hạ tầng và ứng dụng. Chúng ta sẽ cấu trúc repo theo mô hình Monorepo hoặc Git-ops-hub để quản lý Crossplane Compositions và ArgoCD Applications.
Trên server Git (hoặc local dev machine), tạo cấu trúc thư mục chuẩn cho series này.
mkdir -p platform-ops/{infrastructure,applications,platform-config}
cd platform-ops
git init
git remote add origin git@github.com:your-org/platform-ops.git
Thư mục infrastructure sẽ chứa Crossplane Compositions và Claims. Thư mục applications chứa Helm charts hoặc Kustomize cho app. Thư mục platform-config chứa config cho ArgoCD và Backstage.
Commit cấu trúc ban đầu lên Git:
touch README.md
echo "# Platform Engineering GitOps Repository" > README.md
git add .
git commit -m "Initial commit: Setup directory structure for GitOps"
git push origin main
Verify kết quả: Repository trên GitHub/GitLab có file README.md và 3 thư mục con.
Cài đặt bộ công cụ CLI cần thiết
Trên máy trạm làm việc (laptop) hoặc bastion host, bạn cần cài đặt các công cụ CLI để tương tác với cluster và repository.
1. Cài đặt kubectl và k3s tools
Nếu dùng Ubuntu/Debian, cập nhật repo và cài đặt kubectl.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
kubectl version --client
Verify kết quả: In ra phiên bản kubectl client, không có lỗi kết nối (vì chưa có config cluster).
2. Cài đặt Helm v3
Helm là công cụ package manager để cài đặt Crossplane, ArgoCD và Backstage lên Kubernetes.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Verify kết quả: Command helm version trả về phiên bản v3.x.x.
3. Cài đặt Crossplane CLI
Crossplane CLI giúp manage và debug các resource (Compositions, Claims) một cách trực quan hơn kubectl.
curl -sSL https://get.crossplane.io | sh
sudo mv /usr/local/bin/cross /usr/local/bin/crossplane
crossplane version
Verify kết quả: In ra phiên bản Crossplane CLI (ví dụ: v1.14.x).
4. Cài đặt Backstage CLI (Optional cho local dev)
Chỉ cần thiết nếu bạn muốn phát triển custom plugin cho Backstage. Để vận hành production, Backstage chạy trên K8s.
npm install -g @backstage/cli
Verify kết quả: Command backstage-cli version hoạt động.
Lộ trình kiến trúc tổng quan
Trước khi bắt tay vào cài đặt từng component, hãy xác định rõ luồng dữ liệu và trách nhiệm của từng phần trong kiến trúc này.
Luồng vận hành (Workflow)
- Developer Portal (Backstage): Developer truy cập Backstage để tạo môi trường Dev mới. Backstage sẽ generate manifest YAML.
- GitOps (ArgoCD): Manifest YAML được commit vào Git repository. ArgoCD phát hiện thay đổi trong repo.
- Infrastructure as Code (Crossplane): ArgoCD áp dụng manifest vào cluster. Crossplane nhận request, tự động provision hạ tầng (ví dụ: tạo AWS RDS, Azure VM, hoặc K8s Namespace) dựa trên Composition đã định nghĩa.
- Feedback Loop: Crossplane cập nhật trạng thái thực tế (status) về Kubernetes. ArgoCD đồng bộ trạng thái này. Backstage hiển thị trạng thái môi trường cho Developer.
Kiến trúc này đảm bảo mọi thay đổi đều đi qua Git, tạo ra audit log rõ ràng và khả năng rollback tự động.
Verify kiến trúc: Kiểm tra xem bạn đã hiểu rõ vai trò của từng component chưa. Crossplane là "engine" tạo hạ tầng, ArgoCD là "driver" điều khiển engine, Backstage là "giao diện" cho người dùng.
Verify tổng thể môi trường đã sẵn sàng
Trước khi chuyển sang Phần 2, hãy đảm bảo cluster, network và tools đều hoạt động ổn định.
Thực hiện test kết nối từ CLI đến Cluster:
kubectl get pods --all-namespaces
Kết quả mong đợi: List các pod hệ thống của k3s (coredns, local-path-provisioner, metrics-server, traefik, etc.) đang ở trạng thái Running.
Test khả năng tạo resource trong namespace platform-system:
kubectl run test-pod --image=nginx:alpine -n platform-system --dry-run=client -o yaml > /tmp/test-deployment.yaml
kubectl apply -f /tmp/test-deployment.yaml -n platform-system
kubectl get pods -n platform-system
Kết quả mong đợi: Pod test-pod được tạo và chuyển sang trạng thái Running sau vài giây.
Xóa resource test:
kubectl delete -f /tmp/test-deployment.yaml -n platform-system
Môi trường đã sẵn sàng cho việc cài đặt Crossplane trong phần tiếp theo.
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống Platform Engineering nội bộ với Crossplane, Backstage và GitOps trên hạ tầng Kubernetes để tự động hóa môi trường Dev
Phần 2: Triển khai và cấu hình Crossplane cho Infrastructure as Code »