Rancher Terraform
Rancher Terraform Provider 允許管理員使用 Terraform 建立和管理 RKE2 客體叢 集。
部署
先決條件
- Kubernetes 叢集建構在 Harvester VM 之上。
- 作為客體 Kubernetes 節點執行的 Harvester VM 位於相同的命名空間中。
使用 Rancher Terraform Provider 部署客體叢集
-
建立 API 金鑰。
在 Rancher UI 上,前往 Account & API Keys > Create API key > Create。


-
取得 Harvester 叢集 ID。
在 Rancher UI 上,前往 Virtualization Management > Manage > Related Resources > Mgmt Cluster Name。

-
取得 Harvester Cloud Provider 和 Harvester CSI Driver 的 kubeconfig。
- UI
- Shell
在 Rancher UI 上,前往 Virtualization Management。在清單中找到目標 Harvester 叢集,然後選擇 ⋮ > Download KubeConfig。

# 產生 harvester cloud provider kubeconfig
RANCHER_SERVER_URL="<RANCHER_SERVER_URL>" # 純伺服器 URL,例如 https://192.168.0.181:6443
RANCHER_ACCESS_KEY="<RANCHER_ACCESS_KEY>"
RANCHER_SECRET_KEY="<RANCHER_SECRET_KEY>"
HARVESTER_CLUSTER_ID="<HARVESTER_CLUSTER_ID>"
CLUSTER_NAME="rke2-demo"
curl -k -X POST ${RANCHER_SERVER_URL}/k8s/clusters/${HARVESTER_CLUSTER_ID}/v1/harvester/kubeconfig \
-H 'Content-Type: application/json' \
-u ${RANCHER_ACCESS_KEY}:${RANCHER_SECRET_KEY} \
-d '{"clusterRoleName": "harvesterhci.io:cloudprovider", "namespace": "default", "serviceAccountName": "'${CLUSTER_NAME}'"}' | xargs | sed 's/\\n/\n/g' > ${CLUSTER_NAME}-kubeconfig
-
準備一個包含以下內容的
provider.tf檔案:terraform {
required_providers {
rancher2 = {
source = "rancher/rancher2"
version = "4.2.0"
}
}
}
# 設定 Rancher2 provider 為管理員
provider "rancher2" {
api_url = "<api_url>" # Account & API Keys 頁面上的 API Endpoint
access_key = "<access_key>"
secret_key = "<secret_key>"
insecure = true # 如果 Rancher 伺服器使用自簽憑證,請設定為 true
} -
準備一個包含以下內容的
main.tf檔案:# 取得已匯入的 harvester 叢集 資訊
data "rancher2_cluster_v2" "harv" {
name = "<harvester_cluster_name_in_rancher>"
}
# 為已匯入的 Harvester 叢集建立新的 Cloud Credential
resource "rancher2_cloud_credential" "harv-cred" {
name = "harv-cred"
harvester_credential_config {
cluster_id = data.rancher2_cluster_v2.harv.cluster_v1_id
cluster_type = "imported"
kubeconfig_content = data.rancher2_cluster_v2.harv.kube_config
}
}
# 使用 harvester node_driver 建立新的 rancher2 machine config v2
resource "rancher2_machine_config_v2" "rke2-machine" {
generate_name = "rke2-machine"
harvester_config {
vm_namespace = "default"
cpu_count = "2"
memory_size = "4"
disk_info = <<EOF
{
"disks": [{
"imageName": "default/<vmimage-name>",
"size": 15,
"bootOrder": 1
}]
}
EOF
network_info = <<EOF
{
"interfaces": [{
"networkName": "default/<network-name>"
}]
}
EOF
ssh_user = "<ssh_user>"
user_data = <<EOF
package_update: true
packages:
- qemu-guest-agent
- iptables
runcmd:
- - systemctl
- enable
- '--now'
- qemu-guest-agent.service
EOF
}
}
resource "rancher2_cluster_v2" "rke2-demo" {
name = "rke2-demo"
kubernetes_version = "v1.28.10+rke2r1"
rke_config {
machine_pools {
name = "pool1"
cloud_credential_secret_name = rancher2_cloud_credential.harv-cred.id
control_plane_role = true
etcd_role = true
worker_role = true
quantity = 1
machine_config {
kind = rancher2_machine_config_v2.rke2-machine.kind
name = rancher2_machine_config_v2.rke2-machine.name
}
}
machine_selector_config {
config = yamlencode({
cloud-provider-config = file("${path.module}/rke2-demo-kubeconfig")
cloud-provider-name = "harvester"
})
}
machine_global_config = <<EOF
cni: "calico"
disable-kube-proxy: false
etcd-expose-metrics: false
EOF
upgrade_strategy {
control_plane_concurrency = "1"
worker_concurrency = "1"
}
etcd {
snapshot_schedule_cron = "0 */5 * * *"
snapshot_retention = 5
}
chart_values = <<EOF
harvester-cloud-provider:
clusterName: rke2-demo
cloudConfigPath: /var/lib/rancher/rke2/etc/config-files/cloud-provider-config
EOF
}
} -
執行
terraform init。 -
執行
terraform apply。