Cài đặt ArgoCD trên Kubernetes Cluster Proxmox
Trước khi triển khai GitOps, chúng ta cần có công cụ ArgoCD chạy trên cluster Proxmox đã được chuẩn bị ở các phần trước.
Thêm repository Helm của ArgoCD vào local client kubectl của bạn.
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
Kết quả mong đợi: Thông báo repository đã được thêm và update thành công.
Tạo namespace riêng biệt để chứa ArgoCD, giúp cách ly tài nguyên quản lý khỏi ứng dụng.
kubectl create namespace argocd
Kết quả mong đợi: Namespace "argocd" được tạo thành công.
Triển khai ArgoCD bằng Helm chart với cấu hình mặc định. Lưu ý: Chúng ta cần disable SSL verification nếu dùng self-signed cert hoặc để mặc định cho demo.
helm install argocd argo/argo-cd --namespace argocd --set server.insecure=true --set controller.extraArgs="{\--repo-server-timeout-seconds=600}"
Kết quả mong đợi: Các Pod của ArgoCD (server, repo-server, applicationset-controller, etc.) chuyển sang trạng thái Running.
Verify kết quả cài đặt
Kiểm tra trạng thái của tất cả các pod trong namespace argocd.
kubectl get pods -n argocd
Kiểm tra xem service của ArgoCD server đã được expose chưa.
kubectl get svc -n argocd
Kết quả mong đợi: Tất cả pod đều ở trạng thái Running và có ít nhất một service tên "argocd-server" với kiểu ClusterIP hoặc NodePort.
Cấu hình Git Repository chứa mã nguồn Terraform và Crossplane
Chúng ta cần chuẩn bị một Git repository chứa toàn bộ định nghĩa hạ tầng (Terraform state code, Crossplane Compositions, K8s manifests) để ArgoCD đọc và sync.
Tạo cấu trúc thư mục chuẩn cho GitOps. Thư mục này sẽ chứa cả code Terraform để quản lý Proxmox và AWS, cũng như Crossplane Resources để quản lý K8s.
mkdir -p ~/hybrid-gitops/{infra/terraform,infra/crossplane,k8s/apps}
cd ~/hybrid-gitops
Kết quả mong đợi: Cấu trúc thư mục được tạo ra.
Tạo file cấu hình Terraform cho hạ tầng Proxmox (VM và Storage). Đây là code đã được chuẩn bị từ Phần 3.
Đường dẫn: ~/hybrid-gitops/infra/terraform/proxmox.tf
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "2.9.14"
}
}
}
provider "proxmox" {
pm_api_url = var.pm_api_url
pm_api_token = var.pm_api_token
pm_tls_insecure = true
}
variable "pm_api_url" {}
variable "pm_api_token" {}
resource "proxmox_vm_qemu" "worker_node" {
name = "worker-node-1"
target_node = "pve"
cores = 2
cpu = "host"
sockets = 1
memory = 4096
net0 = "virtio=52:54:00:12:34:56,bridge=vmbr0,firewall=1"
scsihw = "virtio-scsi-single"
disk {
slot = 0
size = "32G"
type = "scsi"
storage = "local-lvm"
interface = "scsi0"
}
os_type = "l24"
agent = 1
ciuser = "ubuntu"
cipassword = "changeme"
ciscript =
Kết quả mong đợi: File proxmox.tf được tạo, chứa định nghĩa VM worker node.
Tạo file Crossplane để trừu tượng hóa hạ tầng AWS (EC2 hoặc S3) như đã làm ở Phần 5.
Đường dẫn: ~/hybrid-gitops/infra/crossplane/aws-s3-bucket.yaml
apiVersion: aws.crossplane.io/v1beta1
kind: S3Bucket
metadata:
name: hybrid-data-store
namespace: crossplane-system
spec:
forProvider:
region: us-east-1
bucket: hybrid-data-store-prod
tags:
- key: Environment
value: Production
- key: ManagedBy
value: GitOps-ArgoCD
providerConfigRef:
name: aws-provider-config
Kết quả mong đợi: File YAML Crossplane được tạo, định nghĩa một S3 bucket trên AWS.
Tạo file Application cho ArgoCD. Đây là file quan trọng nhất, nó mô tả cho ArgoCD biết cần sync những gì từ Git repo nào.
Đường dẫn: ~/hybrid-gitops/k8s/apps/argocd-app-hybrid.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: hybrid-infra
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-username/hybrid-gitops-repo.git
targetRevision: HEAD
path: infra
destination:
server: https://kubernetes.default.svc
namespace: crossplane-system
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Kết quả mong đợi: File Application YAML được tạo, cấu hình tự động sync từ path "infra" của repo.
Tạo file .gitignore để tránh commit các file nhạy cảm như token, state file.
Đường dẫn: ~/hybrid-gitops/.gitignore
*.tfstate
*.tfstate.backup
*.tfvars
*.key
*.pem
secret/
*.env
Kết quả mong đợi: File .gitignore được tạo.
Verify kết quả cấu hình Git
Khởi tạo Git repository và commit lần đầu.
git init
git add .
git commit -m "Initial commit: Terraform and Crossplane configs for Hybrid Cloud"
Kết quả mong đợi: Commit thành công với hash commit đầu tiên.
Kết nối ArgoCD với Repository và tự động sync
Bây giờ ArgoCD đã chạy, chúng ta cần tạo tài khoản admin đầu tiên để truy cập giao diện web, sau đó cấu hình kết nối với Git repo.
Lấy mật khẩu admin mặc định của ArgoCD. Đây là bước bắt buộc để đăng nhập lần đầu.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Kết quả mong đợi: Một chuỗi ký tự ngẫu nhiên (mật khẩu) được in ra màn hình.
Tạo port-forward để truy cập ArgoCD UI từ local máy tính.
kubectl port-forward svc/argocd-server -n argocd 8080:443
Kết quả mong đợi: Terminal giữ nguyên dòng "Forwarding from 127.0.0.1:8080 -> 8080". Mở trình duyệt truy cập http://localhost:8080.
Đăng nhập vào ArgoCD UI với username "admin" và password vừa lấy. Sau khi đăng nhập, vào menu "Settings" -> "Repositories".
Click nút "NEW REPOSITORY". Điền thông tin:
- Type: Git
- Repo URL: https://github.com/your-username/hybrid-gitops-repo.git
- Auth Type: Basic (nếu dùng private repo có token) hoặc None (nếu public). Ở đây giả sử dùng Public hoặc Token.
- Username/Password: (Nếu cần)
Click "CREATE".
Kết quả mong đợi: Repository xuất hiện trong danh sách với trạng thái "Healthy" hoặc "Reconciling".
Tạo ArgoCD Application qua CLI (Tùy chọn nhưng nhanh hơn)
Thay vì tạo qua UI, ta có thể apply trực tiếp file Application YAML đã tạo ở phần trước vào cluster.
kubectl apply -f ~/hybrid-gitops/k8s/apps/argocd-app-hybrid.yaml
Kết quả mong đợi: Application "hybrid-infra" được tạo trong namespace argocd.
Truy cập lại ArgoCD UI, vào menu "Applications". Bạn sẽ thấy "hybrid-infra" xuất hiện.
Click vào Application đó, nhấn nút "Sync". Chọn "PRUNE: Yes" và "HEAL: Yes" (nếu có).
Kết quả mong đợi: Trạng thái chuyển từ "OutOfSync" sang "Syncing" rồi cuối cùng là "Synced" và "Healthy".
Triển khai toàn bộ hạ tầng Hybrid qua pipeline GitOps
Khi ArgoCD đã sync, nó sẽ trigger các controller để tạo tài nguyên. Với cấu hình của chúng ta, ArgoCD sẽ đọc file Crossplane và file Terraform (thông qua Custom Resource hoặc external tools).
Lưu ý: ArgoCD tự nó không chạy `terraform apply`. Nó chỉ quản lý các Kubernetes Resources. Để chạy Terraform trong GitOps, chúng ta cần một controller như "ArgoCD Plugin" hoặc "Crossplane Provider". Ở đây, chúng ta tập trung vào việc ArgoCD quản lý Crossplane Resources (đây là cách chuẩn của GitOps trên K8s).
Verify rằng Crossplane đã nhận được S3 Bucket từ ArgoCD.
kubectl get S3Bucket -n crossplane-system
Kết quả mong đợi: Resource "hybrid-data-store" xuất hiện với trạng thái "Ready: True" và "Synced: True".
Verify trên AWS Console hoặc CLI rằng bucket đã được tạo thực tế.
aws s3 ls
Kết quả mong đợi: Tên bucket "hybrid-data-store-prod" xuất hiện trong danh sách bucket AWS.
Đối với phần Terraform (Proxmox VM), nếu bạn đã cấu hình Crossplane Provider cho Proxmox (từ Phần 5), hãy tạo một file Crossplane tương tự cho Proxmox VM thay vì file .tf.
Đường dẫn: ~/hybrid-gitops/infra/crossplane/proxmox-vm.yaml
apiVersion: proxmox.crossplane.io/v1alpha1
kind: VirtualMachine
metadata:
name: worker-node-1
namespace: crossplane-system
spec:
forProvider:
name: worker-node-1
cores: 2
memory: 4096
disk:
size: 32
storage: local-lvm
network:
- bridge: vmbr0
mac: 52:54:00:12:34:56
osType: l24
providerConfigRef:
name: proxmox-provider-config
Kết quả mong đợi: File YAML được tạo.
Commit và push thay đổi mới nhất lên Git repo.
git add .
git commit -m "Add Proxmox VM definition via Crossplane"
git push origin main
Kết quả mong đợi: Push thành công.
ArGoCD sẽ tự động phát hiện thay đổi (do syncPolicy.automated.enabled=true) và trigger sync. Kiểm tra trạng thái trong UI hoặc CLI.
kubectl get app hybrid-infra -n argocd -o jsonpath='{.status.sync.status}'
Kết quả mong đợi: Trạng thái là "Synced".
Kiểm tra trên Proxmox UI xem VM "worker-node-1" đã được tạo chưa.
kubectl get VirtualMachine -n crossplane-system
Kết quả mong đợi: Resource VirtualMachine có trạng thái "Ready: True" và "Synced: True". Trên Proxmox UI, VM xuất hiện và đang chạy.
Verify toàn bộ pipeline GitOps
Thực hiện một thay đổi nhỏ (ví dụ: tăng RAM của VM từ 4096 lên 8192) trong file proxmox-vm.yaml.
sed -i 's/memory: 4096/memory: 8192/' ~/hybrid-gitops/infra/crossplane/proxmox-vm.yaml
git add .
git commit -m "Increase VM RAM to 8GB"
git push
Kết quả mong đợi: Push thành công.
Chờ khoảng 30-60 giây, kiểm tra lại ArgoCD.
kubectl get app hybrid-infra -n argocd -o jsonpath='{.status.operationState.phase}'
Kết quả mong đợi: Trạng thái là "Succeeded" hoặc "Running" (trong quá trình sync).
Verify trên Proxmox UI, VM đã được resize RAM và khởi động lại (hoặc thay đổi cấu hình) mà không cần vào console Proxmox thủ công.
kubectl describe VirtualMachine worker-node-1 -n crossplane-system | grep -A 2 "memory"
Kết quả mong đợi: Giá trị memory hiển thị là 8192.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Multi-Cloud Hybrid với Terraform, Crossplane và GitOps trên hạ tầng Proxmox và AWS
« Phần 5: Xây dựng Composite Resource để trừu tượng hóa hạ tầng Hybrid
Phần 7: Quản lý vòng đời và nâng cấp hạ tầng Hybrid »