跳至主要内容

Rancher Terraform

Rancher Terraform Provider 允許管理員使用 Terraform 建立和管理 RKE2 客體叢集。

部署​

先決條件​

  • Kubernetes 叢集建構在 Harvester VM 之上。
  • 作為客體 Kubernetes 節點執行的 Harvester VM 位於相同的命名空間中。

使用 Rancher Terraform Provider 部署客體叢集​

  1. 建立 API 金鑰。

    在 Rancher UI 上,前往 Account & API Keys > Create API key > Create。

    Create API Key

    Access & Secret Keys

  2. 取得 Harvester 叢集 ID。

    在 Rancher UI 上,前往 Virtualization Management > Manage > Related Resources > Mgmt Cluster Name。

    Harvester Cluster ID

  3. 取得 Harvester Cloud Provider 和 Harvester CSI Driver 的 kubeconfig。

在 Rancher UI 上,前往 Virtualization Management。在清單中找到目標 Harvester 叢集,然後選擇 ⋮ > Download KubeConfig。

Download Kubeconfig

  1. 準備一個包含以下內容的 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
    }
  2. 準備一個包含以下內容的 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
    }
    }
  3. 執行 terraform init。

  4. 執行 terraform apply。