1. Xác định yêu cầu tài nguyên và môi trường Kubernetes
Mục tiêu: Đảm bảo hạ tầng đủ mạnh để chạy Backstage, Crossplane, ArgoCD và các workload mẫu.
Lý do: Backstage là ứng dụng React nặng, cần bộ nhớ RAM lớn. Crossplane và các controller cần CPU để xử lý sự kiện. Nếu thiếu tài nguyên, các dịch vụ sẽ bị OOMKilled hoặc treo.
Yêu cầu tối thiểu cho Local (Kind/Minikube):
- CPU: 4 Cores trở lên.
- RAM: 8GB trở lên (Khuyến nghị 16GB).
- Disk: 50GB trống.
- Hệ điều hành: Linux (Ubuntu 22.04/Debian 12) hoặc macOS với Docker Desktop.
Yêu cầu cho Production (EKS/GKE/AKS):
- Node Group: Tối thiểu 3 nodes loại m5.xlarge (4vCPU, 16GB RAM) hoặc tương đương.
- Storage: EBS gp3 hoặc Standard SSD.
- Network: VPC với public/private subnets.
Triển khai Cluster mẫu với Kind (Local Development)
Hành động: Tạo Kubernetes cluster local với cấu hình 2 nodes để mô phỏng môi trường production (1 control-plane, 1 worker).
Lý do: Kind (Kubernetes in Docker) tạo cluster nhanh, nhẹ và hỗ trợ quay lại trạng thái cũ dễ dàng, phù hợp để test kiến trúc IDP.
Kết quả mong đợi: Cluster chạy với 2 nodes, trạng thái Ready.
Đầu tiên, tạo file cấu hình cluster ở đường dẫn /tmp/kind-config.yaml với nội dung:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: idp-cluster
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "node-role.kubernetes.io/control-plane=true"
- role: worker
kubeadmConfigPatches:
- |
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "node-role.kubernetes.io/worker=true"
Chạy lệnh để khởi tạo cluster dựa trên file cấu hình trên:
kind create cluster --config /tmp/kind-config.yaml
Verify kết quả bằng cách liệt kê các node trong cluster:
kubectl get nodes
Kết quả mong đợi: Xuất hiện 2 node với trạng thái Ready.
2. Cài đặt các công cụ CLI cần thiết
Mục tiêu: Cài đặt kubectl, Helm, crossplane và git vào môi trường làm việc.
Lý do: Đây là bộ công cụ bắt buộc để quản lý cluster, cài đặt package, tương tác với Crossplane và quản lý source code cho GitOps.
Kết quả mong đợi: Các lệnh trả về phiên bản tương ứng và sẵn sàng sử dụng.
Cài đặt kubectl
Hành động: Tải và cài đặt kubectl phiên bản mới nhất từ trang chính thức.
Lý do: kubectl là giao diện dòng lệnh chính để tương tác với API server của Kubernetes.
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/
Verify kết quả:
kubectl version --client
Cài đặt Helm
Hành động: Cài đặt Helm v3 để quản lý package trên Kubernetes.
Lý do: Backstage, ArgoCD và Crossplane đều được đóng gói dưới dạng Helm Chart. Chúng ta cần Helm để deploy chúng.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Verify kết quả:
helm version
Cài đặt Crossplane CLI
Hành động: Tải và cài đặt công cụ CLI của Crossplane.
Lý do: CLI này giúp kiểm tra trạng thái các tài nguyên XRM (Crossplane Resource Management) và debug khi triển khai infrastructure.
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | sh
sudo mv cross /usr/local/bin/
Verify kết quả:
cross version
Cài đặt Git
Hành động: Đảm bảo Git đã cài đặt (thường có sẵn trên Linux/macOS).
Lý do: Git là nền tảng của GitOps. ArgoCD sẽ sync trạng thái cluster từ các repository Git.
git --version
3. Cấu hình Kubernetes Cluster và Namespaces
Mục tiêu: Tạo các namespace riêng biệt để tách biệt các thành phần của IDP.
Lý do: Việc tách biệt namespace giúp quản lý RBAC (quyền truy cập), mạng (NetworkPolicy) và tài nguyên dễ dàng hơn. Tránh việc các service của Backstage va chạm với Crossplane.
Kết quả mong đợi: Các namespace được tạo và sẵn sàng nhận workload.
Tạo file cấu hình namespace tại /tmp/idp-namespaces.yaml:
apiVersion: v1
kind: Namespace
metadata:
name: backstage
labels:
app: backstage
---
apiVersion: v1
kind: Namespace
metadata:
name: crossplane-system
labels:
app: crossplane
---
apiVersion: v1
kind: Namespace
metadata:
name: argocd
labels:
app: argocd
---
apiVersion: v1
kind: Namespace
metadata:
name: platform-ops
labels:
app: platform-ops
Áp dụng cấu hình vào cluster:
kubectl apply -f /tmp/idp-namespaces.yaml
Verify kết quả:
kubectl get namespaces
Kết quả mong đợi: Thấy 4 namespace mới trong danh sách.
4. Giới thiệu kiến trúc tổng thể IDP
Mục tiêu: Hiểu cách Backstage, Crossplane và ArgoCD tương tác trong quy trình phát triển.
Lý do: Kiến trúc này là nền tảng để bạn triển khai code trong các phần tiếp theo. Nếu không hiểu luồng dữ liệu, việc cấu hình sẽ sai lệch.
Luồng hoạt động (Workflow)
- Developer (Backstage): Lập trình viên truy cập Backstage để tạo request (ví dụ: "Tạo 1 môi trường staging"). Họ điền thông tin vào form UI.
- Backstage Plugin (Scaffolder): Backstage kích hoạt plugin Scaffolder. Plugin này tạo ra các file manifest (YAML) chứa định nghĩa tài nguyên Crossplane (XR) và lưu vào một repository Git.
- GitOps Controller (ArgoCD): ArgoCD đang chạy trên cluster và liên tục quét (poll) repository Git. Khi phát hiện thay đổi, nó áp dụng (apply) các manifest vào Kubernetes.
- Infrastructure Controller (Crossplane): Crossplane đọc các tài nguyên XR từ Kubernetes. Nó chuyển đổi các XR này thành các tài nguyên hạ tầng thực tế (Provider) như AWS RDS, GCP Bucket, hoặc Kubernetes Namespace.
- Cloud Provider: Hạ tầng thực tế được tạo ra. Trạng thái (Ready/Failed) được quay ngược lại qua Crossplane -> Kubernetes -> ArgoCD -> Backstage.
Sơ đồ thành phần
- Backstage: Portal duy nhất cho developer (Single Pane of Glass).
- ArgoCD: Động cơ GitOps, đảm bảo trạng thái cluster luôn khớp với Git repository.
- Crossplane: Động cơ Infrastructure as Code (IaC), cho phép developer yêu cầu tài nguyên cloud mà không cần biết API của cloud provider.
- Kubernetes Cluster: Nơi chứa các controller và application.
Verify kiến trúc bằng cách tưởng tượng luồng dữ liệu: Developer -> Backstage -> Git -> ArgoCD -> Crossplane -> Cloud.
5. Kiểm tra môi trường trước khi vào Phần 2
Mục tiêu: Đảm bảo môi trường đã sẵn sàng 100% để triển khai Backstage trong phần tiếp theo.
Lý do: Phát hiện sớm các lỗi về network, permission hoặc thiếu tool để không bị tắc nghẽn ở phần sau.
Chạy script kiểm tra tổng hợp:
echo "=== Checking Tools ===" && kubectl version --client &> /dev/null && echo "kubectl: OK" || echo "kubectl: FAIL"
echo "=== Checking Helm ===" && helm version &> /dev/null && echo "Helm: OK" || echo "Helm: FAIL"
echo "=== Checking Cluster ===" && kubectl get nodes &> /dev/null && echo "Cluster: OK" || echo "Cluster: FAIL"
echo "=== Checking Namespaces ===" && kubectl get ns backstage &> /dev/null && echo "Namespaces: OK" || echo "Namespaces: FAIL"
Kết quả mong đợi: Tất cả các dòng đều hiển thị OK.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Internal Developer Platform (IDP) với Backstage, Crossplane và GitOps trên Kubernetes để tối ưu trải nghiệm phát triển phần mềm
Phần 2: Triển khai Backstage và cấu hình Core »