Triển khai Kubernetes Cluster trên Proxmox bằng Terraform
Bước này xây dựng một cụm Kubernetes (Cluster) chạy trên Proxmox để làm nơi lưu trữ Crossplane Controller. Chúng ta sử dụng Terraform để tự động hóa việc tạo các Virtual Machine (VM) và cấu hình chúng thành các node Kubernetes.
Tạo file /infra/cluster/k8s-cluster.tf với nội dung sau để định nghĩa 1 node master và 1 node worker trên Proxmox:
resource "proxmox_virtual_environment_vm" "k8s_master" {
name = "k8s-master"
node_name = "pve-node-01"
started = true
cpu {
type = "host"
cores = 2
}
memory = 4096
disk {
size = 50
type = "scsi"
iothread = true
}
network_device {
name = "virtio"
}
operating_system {
type = "l26"
}
unmount_disks = true
}
resource "proxmox_virtual_environment_vm" "k8s_worker" {
name = "k8s-worker"
node_name = "pve-node-01"
started = true
cpu {
type = "host"
cores = 2
}
memory = 4096
disk {
size = 50
type = "scsi"
iothread = true
}
network_device {
name = "virtio"
}
operating_system {
type = "l26"
}
unmount_disks = true
}
Chạy lệnh apply để tạo VM. Sau khi VM được tạo, bạn cần SSH vào master node để cài đặt Kubernetes (sử dụng kubeadm hoặc k3s theo chuẩn của phần trước) và cấu hình worker node join vào cluster.
Kết quả mong đợi: Bạn có 2 VM chạy trên Proxmox, và lệnh kubectl get nodes trên master trả về trạng thái Ready cho cả master và worker.
Cài đặt Crossplane Controller trên Kubernetes
Crossplane hoạt động như một extension của Kubernetes, cho phép quản lý tài nguyên hạ tầng (cloud resources) thông qua các Custom Resource Definitions (CRD). Chúng ta sẽ cài đặt nó vào cluster vừa tạo.
Đầu tiên, thêm repository Helm của Crossplane vào cluster:
helm repo add crossplane https://charts.crossplane.io/stable
helm repo update
Tiếp theo, tạo namespace riêng cho Crossplane để cô lập các thành phần quản lý:
kubectl create namespace crossplane-system
Cài đặt Crossplane Controller bằng Helm. Lệnh này sẽ tạo các CRD cần thiết và triển khai các deployment, service account cho controller:
helm install crossplane crossplane/crossplane \
--namespace crossplane-system \
--wait \
--version 1.15.0
Sau khi cài đặt xong, kiểm tra trạng thái của các pod trong namespace crossplane-system:
kubectl get pods -n crossplane-system
Kết quả mong đợi: Tất cả các pod (crossplane-rbac, crossplane-runtime, crossplane-webhook, crossplane-control-plane) đều ở trạng thái Running với trạng thái restart 0 hoặc 1.
Cấu hình Provider cho Proxmox và AWS trong Crossplane
Crossplane sử dụng "Provider" để kết nối với các nền tảng hạ tầng cụ thể. Mỗi Provider là một controller riêng biệt chạy trong cluster. Chúng ta cần cấu hình Provider cho AWS và Proxmox.
Cấu hình Provider cho AWS
Để Crossplane có thể tạo tài nguyên AWS (như EC2), bạn cần cài đặt Provider AWS. Lưu ý: Provider này cần thông tin truy cập AWS từ Cluster.
Thêm và cài đặt Provider AWS:
helm repo add crossplane-contrib https://charts.crossplane.io/contrib
helm install provider-aws crossplane-contrib/provider-aws \
--namespace crossplane-system \
--wait \
--version 1.22.0
Tạo một file cấu hình ProviderConfig cho AWS. File này chứa thông tin Region và cách thức xác thực (thông qua Environment hoặc IAM Role nếu chạy trên EKS, ở đây dùng Access Key/Secret cho Proxmox):
Tạo file /crossplane-configs/aws-provider-config.yaml:
apiVersion: aws.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
region: us-east-1
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-creds
key: creds
Trước khi áp dụng ProviderConfig, bạn cần tạo Secret chứa thông tin AWS Access Key và Secret Key:
kubectl create secret generic aws-creds \
--namespace crossplane-system \
--from-literal=creds="aws_access_key_id=YOUR_AWS_ACCESS_KEY_ID\naws_secret_access_key=YOUR_AWS_SECRET_ACCESS_KEY"
Áp dụng ProviderConfig:
kubectl apply -f /crossplane-configs/aws-provider-config.yaml
Kết quả mong đợi: Chạy kubectl get providerconfig.aws sẽ thấy tài nguyên "default" có trạng thái SYNCED.
Cấu hình Provider cho Proxmox
Hiện tại Crossplane chưa có Provider chính thức cho Proxmox trong repo stable. Chúng ta sẽ sử dụng provider generic hoặc provider Proxmox từ cộng đồng (crossplane-contrib) nếu có, hoặc sử dụng provider Kubernetes để quản lý VM qua API Proxmox nếu cần. Ở đây, giả sử ta dùng provider Proxmox từ cộng đồng (ví dụ: provider-proxmox nếu đã build sẵn hoặc dùng provider-generic với API Proxmox).
Tuy nhiên, để đảm bảo tính ổn định và tương thích ngay lập tức cho tutorial, chúng ta sẽ sử dụng Provider Kubernetes để quản lý Proxmox VM thông qua API của Proxmox (giả lập bằng một controller tùy chỉnh hoặc dùng provider-generic với template). Để đơn giản và chính xác nhất cho bài này, ta sẽ dùng provider-terraform của Crossplane để quản lý Proxmox, vì Terraform đã có provider Proxmox mạnh mẽ.
Cài đặt Provider Terraform cho Crossplane:
helm install provider-terraform crossplane-contrib/provider-terraform \
--namespace crossplane-system \
--wait \
--version 0.15.0
Tạo ProviderConfig cho Terraform (sử dụng backend local hoặc S3, ở đây dùng local để đơn giản):
Tạo file /crossplane-configs/terraform-provider-config.yaml:
apiVersion: terraform.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
name: proxmox
spec:
runtimeConfig:
backend:
type: local
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: proxmox-creds
key: creds
Tạo Secret chứa thông tin đăng nhập Proxmox:
kubectl create secret generic proxmox-creds \
--namespace crossplane-system \
--from-literal=creds="proxmox_api_url=https://192.168.1.100:8006\
proxmox_api_token=root@pam!crossplane-token\
proxmox_api_token_id=root@pam!crossplane-token\
proxmox_api_token_value=YOUR_PROXMOX_API_TOKEN_VALUE"
Áp dụng ProviderConfig:
kubectl apply -f /crossplane-configs/terraform-provider-config.yaml
Kết quả mong đợi: Chạy kubectl get providerconfig.terraform sẽ thấy tài nguyên "proxmox" có trạng thái SYNCED.
Tạo Managed Resource đầu tiên (EC2 hoặc VM Proxmox) qua Crossplane
Bây giờ chúng ta đã có Controller và Provider cấu hình xong. Bước cuối cùng là tạo tài nguyên thực tế trên hạ tầng bằng cách định nghĩa một "Managed Resource" trong Kubernetes.
Tạo VM Proxmox qua Crossplane (sử dụng Provider Terraform)
Chúng ta sẽ tạo một VM trên Proxmox bằng cách định nghĩa một tài nguyên ExternalResource hoặc sử dụng CRD của Provider Terraform. Ở đây, ta dùng CRD ExternalResource để chạy Terraform plan/apply cho một VM.
Tạo file /crossplane-resources/proxmox-vm.yaml:
apiVersion: terraform.crossplane.io/v1beta1
kind: ExternalResource
metadata:
name: proxmox-vm-demo
namespace: default
spec:
providerConfigRef:
name: proxmox
connectionDetails:
source: "Secret"
secretRef:
name: proxmox-vm-demo-creds
resource:
name: proxmox-vm-demo
type: proxmox_virtual_environment_vm
values:
name: "crossplane-vm-demo"
node_name: "pve-node-01"
started: true
cpu:
type: "host"
cores: 2
memory: 2048
disk:
size: 20
type: "scsi"
network_device:
name: "virtio"
operating_system:
type: "l26"
deletionPolicy: Delete
Áp dụng tài nguyên này:
kubectl apply -f /crossplane-resources/proxmox-vm.yaml
Crossplane sẽ tự động gọi Terraform để tạo VM trên Proxmox. Bạn có thể xem trạng thái quá trình bằng lệnh:
kubectl describe externalresource proxmox-vm-demo
Kết quả mong đợi: Trong phần Status của ExternalResource, bạn sẽ thấy READY là true. Trên Proxmox, một VM mới tên crossplane-vm-demo đã xuất hiện và đang chạy.
Tạo EC2 Instance trên AWS qua Crossplane
Để chứng minh tính Multi-Cloud, chúng ta tạo một EC2 instance trên AWS sử dụng Provider AWS đã cấu hình.
Tạo file /crossplane-resources/aws-ec2.yaml:
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Instance
metadata:
name: crossplane-ec2-demo
namespace: default
spec:
forProvider:
ami: "ami-0c55b159cbfafe1f0" # AMI Amazon Linux 2 cho us-east-1
instanceType: "t2.micro"
subnetId: "subnet-12345678" # Thay bằng Subnet ID thực tế của bạn
vpcSecurityGroupIds:
- "sg-12345678" # Thay bằng Security Group ID thực tế
tags:
Name: "crossplane-ec2-demo"
providerConfigRef:
name: default
writeConnectionSecretToRef:
name: ec2-demo-creds
namespace: default
Áp dụng tài nguyên EC2:
kubectl apply -f /crossplane-resources/aws-ec2.yaml
Kiểm tra trạng thái của Instance EC2 trong Kubernetes:
kubectl get instance ec2-demo
Kết quả mong đợi: Tài nguyên Instance có trạng thái SYNCED. Trên AWS Console, bạn sẽ thấy một EC2 instance mới với tên crossplane-ec2-demo đang ở trạng thái running.
Verify kết quả cuối cùng
Để xác nhận toàn bộ hệ thống hoạt động, thực hiện các lệnh sau:
kubectl get externalresource
kubectl get instance
kubectl get providerconfig
Đảm bảo tất cả các tài nguyên đều ở trạng thái SYNCED hoặc READY. Kiểm tra trực tiếp trên Proxmox và AWS Console để xác nhận VM và EC2 đã được tạo thành công bởi Crossplane.
Đ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 3: Triển khai hạ tầng Hybrid đầu tiên với Terraform
Phần 5: Xây dựng Composite Resource để trừu tượng hóa hạ tầng Hybrid »