設定 Terraform 模組

此解決方案所需的資源定義於 Terraform 模組中。

開始之前

開始設定 Terraform 模組之前,請先完成下列步驟:

  1. 瞭解 Terraform 的基本知識。

    至少要閱讀 Terrraform 文件中的簡介。

  2. 保留下列資訊就緒:
    • 您租用戶的 OCID。

      您可以在Oracle Cloud Infrastructure Web 主控台中找到租用戶的 OCID。從服務功能表中選取管理,然後按一下租用戶詳細資訊

    • 您要使用 Terraform 向Oracle Cloud Infrastructure進行認證的使用者 OCID。

      若要尋找使用者的 OCID,請由服務功能表中選取識別,然後選取使用者。在清單中尋找您的使用者名稱,並複製其 OCID。

    • 要在其中建立資源之區間的 OCID。

      若要尋找區間的 OCID,請由服務功能表中選取識別,然後選取區間。找出清單中所需的區間,並複製它的 OCID。

    • 要建立資源的區域 ID。

      例如,US East (Ashburn) 區域的 ID 是 us-ashburn-1

      請參閱區域和可用性網域

  3. 決定下列項目:
    • 要用於水平和管理主機之影像的 Ocid。
      針對消費主機在 Terraform 組態中定義的預設影像為 Oracle Autonomous Linux 影像。若要使用不同的影像,請指定所需影像的 OCID。
      • 若要尋找自訂映像檔的 OCID,請登入Oracle Cloud Infrastructure Web 主控台,從服務功能表選取運算,然後選取自訂映像檔
      • 若要尋找 Oracle 提供之影像的 OCID,請完成下列步驟:
        1. 移至 Oracle Cloud 影像
        2. 在左邊的導覽窗格中,選取一個影像系列 (例如Oracle Linux 7.x)。
        3. 在結果頁面上,向下捲動至您要使用的影像版本,然後按一下它 (例如,Oracle - Linux -7.7-2019.09.25-0)。
        4. 在顯示的頁面中,向下捲動至影像 Ocid 區段。
        5. 複製對應至要建立修訂主機之區域的 OCID。

          影像 OCID 包含可用於影像之區域的 ID。例如,德國中部 (Frankfurt) 區域內影像的 OCID 格式為 ocid1.image.oc1.eu-frankfurt-1.aaaaaaaaxxx…,務必複製您要建立資源之區域的 OCID。

    • 基礎與管理主機的時區。

      在 Unix 類似系統上,您可以執行以下命令來取得時區清單:timedatectl list-timezones

    • 要用於防部主機、管理主機以及 Kubernetes 工作者節點的運算型態。

      請參閱運算資源配置

  4. 完成在 Oracle Cloud Infrastructure 中建立 Kubernetes 叢集的先決條件。請參閱準備 Kubernetes 容器引擎
  5. (選擇性) 如果您想從 Oracle Cloud Infrastructure Registry 中的專用儲存區域提取容器化應用程式的影像,就需要此步驟。
    1. 產生使用者名稱的認證記號,此名稱應該用來從 Oracle Cloud Infrastructure Registry 提取影像。請參閱取得認證記號
    2. 將您產生的認證記號儲存在 Oracle Cloud Infrastructure Vault 中作為密碼。請參閱管理密碼。

下載 Terraform 代碼

GitHub 上提供此解決方案的 Terraform 代碼。

  1. 在左邊的導覽窗格中,按一下下載代碼
  2. 按一下 Git 儲存區域
  3. 將儲存區域複製或下載至您的本機電腦。

關於 Terraform 程式碼

此解決方案的 Terraform 程式碼會組織為可重複使用的模組,每個包含目標拓撲之特定元件的資源。

編碼 Terraform 組態檔中的雲端資源,可讓您快速佈建拓樸並有效管理資源。

Terraform 代碼包含最上層的下列目錄與檔案:
  • docs 目錄與 *.adoc:程式碼的文件。您所需的全部資訊和指示都包括在您正在讀取的文件中。您不需要參照程式碼中包含的文件。
  • *.tf:解決方案所使用的 Terraform 組態檔。請勿編輯這些檔案。
  • terraform.tfvars.example:您將用來建立 Terraform 變數檔案的範本。請勿編輯或移除範本。將它複製到 terraform.tfvars
  • modules:包含您使用此解決方案建立之資源的核心 Terraform 組態的目錄。請勿編輯它們。
  • .github 目錄與 .gitignore:內部 Github 組態檔。請勿編輯它們。

設定 Terraform 變數

指定 Terraform 連線至Oracle Cloud Infrastructure 租用戶所需的參數。同時也指定網路參數、bastion 主機和管理主機的屬性,以及 Kubernetes 設定值。

  1. 在您下載或複製之程式碼的最上層目錄中,建立名為 provider.tf 的純文字檔案,其中包含下列程式碼:
    provider "oci" {
      tenancy_ocid         = var.tenancy_id
      user_ocid            = var.user_id
      fingerprint          = var.api_fingerprint
      private_key_path     = var.api_private_key_path
      region               = var.region
      disable_auto_retries = var.disable_auto_retries
    }
  2. 在下載或複製之程式碼的最上層目錄中尋找 terraform.tfvars.example 檔案,然後將它複製到 terraform.tfvars

    注意:

    若要管理多個租用戶的資源,請針對每個租用戶維護個別的 terraform.tfvars 檔案。
  3. 請確定您已完成之前描述的先決條件。請參閱開始之前
  4. 在純文字編輯器中開啟 terraform.tfvars,然後依下列方式設定變數的值:
    變數 描述
    api_fingerprint (必要) 您上傳之 API 簽章金鑰的指紋。
    api_private_key_path (必要) 包含您私密 API 簽署金鑰之檔案的完整路徑與名稱。
    compartment_id (必要) 要在其中建立資源之區間的 OCID。
    tenancy_id (必要) 您租用戶的 OCID。
    user_id (必要) 您要使用 Terraform 向Oracle Cloud Infrastructure進行認證的使用者 OCID。
    ssh_private_key_path 包含私密 SSH 金鑰的檔案完整路徑與名稱,該私密 SSH 金鑰對應至要提供給消費主機的公用金鑰。

    這個值會用來建構可用來存取 bastion 主機的 ssh 命令。當您套用 Terraform 組態時,ssh 命令會顯示在輸出中。請注意,Terraform 無法讀取或複製私密金鑰。

    ssh_public_key_path 包含您要為基礎主機提供之公用 SSH 金鑰的檔案的完整路徑與名稱。
    label_prefix 一個短 Id,用來作為資源名稱的前置碼。

    使用可協助您查看資源名稱以識別資源用途或性質的字串。例如,如果您想要使用 Terraform 組態來設定測試或暫存環境,請考慮使用前置碼 teststaging

    region - 區域 要建立資源的區域 ID。

    例如,US East (Ashburn) 區域的 ID 是 us-ashburn-1

    nat_gateway_enabled 指定 true 為 VCN 建立 NAT 閘道。

    若任何專用運算執行處理 (例如管理主機或 Kubernetes 工作節點) 需要存取公用網際網路上的主機,則需要 NAT 閘道。

    newbitsnetnum 套用組態時,Terraform 會將 newbitsnetnum 的值作為引數傳送至 Terraform 函數 cidrsubnet()。此函數會計算基礎主機、管理主機、負載平衡器節點以及 Kubernetes 工作者節點之子網路的 CIDR 前置碼。
    • newbits 可用來決定子網路的大小。它是 VCN 的網路遮罩和基礎子網路所需的網路遮罩之間的差異。

      例如,若要在 /16 VCN 中以網路遮罩 /29 建立子網路,請指定 13 作為 newbits 值 (即 2916)。

      較低的 newbits 值會產生位址空間較大的子網路。

    • netnum 可用來決定子網路的界限。當網路以 newbits 遮罩時,這是以零為基礎的子網路索引。

      如果您指定 newbits=13netnum=0,則 cidrsubnet() 函數會傳回子網路 CIDR 前置碼 10.0.0.0/29,這是 10.0.0.0/16 VCN 內的第一個 /29 位址空間。

    預設值:
    netnum = {
      admin   = 33
      bastion = 32
      int_lb  = 16
      pub_lb  = 17
      workers = 1
    }
    
    newbits = {
      admin   = 13
      bastion = 13
      lb      = 11
      workers = 2
    }
    如果您將這些變數保留在預設值並指定 10.0.0.0/16 作為 VCN 的 CIDR 範圍,則 Terraform 函數 cidrsubnet() 會計算子網路的下列 CIDR 前置碼。可用的地址會以括號顯示。請注意,網路服務會保留前兩個位址和子網路中的最後一個位址。
    • 基本子網路:10.0.1.0/29 (可用的位址:10.0.1.210.0.1.6;亦即 5 部主機)
    • 管理子網路:10.0.1.8/29 (10.0.1.1010.0.1.14;5 個主機)
    • 內部負載平衡器子網路:10.0.2.0/27 (10.0.2.210.0.2.30;29 個節點)
    • 公用負載平衡器子網路:10.0.2.32/27 (10.0.2.3410.0.2.62;29 個節點)
    • Kubernetes 工作節點子網路:10.0.64.0/18 (10.0.64.210.0.127.254;16381 個節點)

    如果您需要的子網路具有與預設設定不同的位址或大小,您應該決定 newbitsnetnum 的適當值。若要這樣做,您必須具備無類別 IP 位址的基本知識。另請參閱 cidrsubnet() 函數的 Terraform 文件。

    請確定您在此處指定的 CIDR 區塊未與您為 Kubernetes pods (pods_cidr) 指定的 CIDR 區塊重疊。

    service_gateway_enabled 指定 true 為 VCN 建立服務閘道。

    如果 VCN 中的運算執行處理需要存取其他 Oracle 服務 (例如Oracle Cloud Infrastructure Object Storage),就必須提供服務閘道。

    vcn_cidr 您為 VCN 選擇的 IPv4 CIDR 區塊。

    預設值為 10.0.0.0/16。允許的範圍為 /16/30

    請確定您在此處指定的 CIDR 區塊未與您為 Kubernetes 服務指定的 CIDR 區塊 (services_cidr) 重疊。

    vcn_dns_label VCN 內部 DNS 名稱的名稱前置碼。

    您在此處指定的名稱前面會加上 oraclevcn.com,以形成 VCN 的 DNS 網域名稱。例如,如果您指定 oke 作為前置碼,VCN 的 DNS 網域名稱就會是 oke.oraclevcn.com

    vcn_name VCN 資源的名稱。
    bastion_access 必須允許 SSH 存取此種子的 IP 位址範圍 (以 CIDR 表示法表示)。

    若要允許從任何主機 (亦即 0.0.0.0/0) 存取 SSH,請將變數保留為其預設值 ANYWHERE

    bastion_enabled 指定 true 以建立種子主機。
    bastion_image_id 要用來建立基礎主機之影像的 OCID。

    如果您將此變數保留為預設值 NONE,則會使用 Oracle 自治式 Linux 影像。

    bastion_notification_enabled 您可以使用「Oracle Cloud Infrastructure 通知」服務在套用更新或 Oracle Ksplice 偵測到已知的展開嘗試時,接收來自消耗主機的狀態訊息。
    指定 true 以啟用種子主機的傳送通知。

    注意:

    此解決方案中的 Terraform 程式碼僅會在您使用預設的 Oracle Autonomous Linux 影像時設定基礎架構主機的通知。
    bastion_notification_endpoint 要接收通知的電子郵件地址。如果您將 bastion_notification_enabled 設為 true,則需要此變數。
    bastion_notification_protocol 將此變數設為 EMAIL
    bastion_notification_topic 要建立之通知主題的名稱。如果您將 bastion_notification_enabled 設為 true,則需要此變數。
    bastion_package_upgrade 如果您希望這些基礎主機的安全套裝程式在第一次啟動主機時升級,請指定 true

    請注意,當此變數設為 true 時,在啟動設定 basis 主機之後,就無法在升級安全套裝程式的期間內使用它。但可讓這項升級將基礎主機的漏洞降到最低。

    bastion_shape 要用於消費主機的運算型態。
    bastion_timezone 以 IANA 時區格式為巴斯主機設定的時區 (例如,America/Los_Angeles)。
    admin_enabled 指定 true 以建立管理主機。
    admin_image_id 要用來建立基礎主機之影像的 OCID。

    如果您將此變數留在預設值 NONE,則會使用 Oracle 提供的 Linux 影像。

    admin_instance_principal 若要讓管理主機管理您指定之區間中的所有資源,請指定 true
    若您想從管理主機執行 CLI 命令或進行 API 呼叫來管理拓樸中的資源,請使用此功能。

    注意:

    任何可使用 SSH 連線計算執行處理的使用者,都會繼承授與執行處理的執行處理主要項目權限。決定是否將管理主機指定為執行處理主要項目時,請考慮此選項。您可以在不影響管理主機的情況下,隨時關閉或開啟此功能。

    如果您將此變數設為 true,則會將管理主機設為動態群組的成員,並建立原則敘述句以允許動態群組管理區間中的所有資源。

    admin_notification_enabled

    admin_notification_endpoint

    admin_notification_protocol

    admin_notification_topic

    將這些變數留在預設值。目前不支援啟用此 Terraform 程式碼中管理主機的通知。
    admin_package_upgrade 如果您要在第一次啟動主機時升級管理主機的安全套裝程式,請指定 true

    請注意,當此變數設為 true 時,在管理主機啟動設定之後,安全套裝程式升級期間將無法使用短期的變數。但可讓這項升級將管理主機的漏洞降到最低。

    admin_shape 要用於管理主機的運算型態。
    admin_timezone 以 IANA 時區格式設定管理主機的時區 (例如,America/Los_Angeles)。
    availability_domains 您要佈建管理主機與基礎主機的可用性網域。

    例如,若要在第二個可用性網域中佈建防止主機,請設定 bastion = 2

    如果您指定的區域只包含一個可用性網域,請將此變數保留為預設值 1

    tagging 指定您要指定給運算和網路資源的標記。
    allow_node_port_access 若要允許在公用模式下建置 TCP 流量至 Kubernetes 工作者節點,請指定 true
    allow_worker_ssh_access 若要允許透過 Based 主機連線至 Kubernetes 工作者節點,請指定 true

    請注意,即使在公用模式下建置工作節點,SSH 連線仍必須通過基礎主機。

    如果您將此變數設為 true,則必須同時設定 bastion_enabled = true

    cluster_name Kubernetes 叢集的名稱。
    dashboard_enabled 若要建立預設 Kubernetes 儀表板,請指定 true
    kubernetes_version 用於工作節點的 Kubernetes 版本。

    如果您將此變數保留為其預設值 LATEST,則會選取最新支援的版本。若要使用特定版本,請指定該版本。

    node_pools 要建立的節點集區數目、每個集區的大小,以及用於工作節點的運算型態 (格式如下):
    node_pools = {
      "np1" = ["computeShape", numberOfNodes]
      "np2" = ["computeShape", numberOfNodes]
      "np3" = ["computeShape", numberOfNodes]
      ...
    }
    • np1np2 以及 np3 是代表個別節點集區的任意名稱。
    • computeShape 是集區中工作節點所要使用的運算型態。
    • numberOfNodes 是要在人才庫中建立的 Kubernetes 職工節點數。系統會在每個集區中建立最少三個節點,即使您指定較低的值也是如此。
    以下是由兩個集區組成的叢集範例,每個集區都使用不同的運算型態,並包含不同數目的 Kubernetes 工作節點:
    node_pools = {
      "np1" = ["VM.Standard2.1", 3]
      "np2" = ["VM.Standard2.2", 5]
    }
    node_pool_name_prefix 節點集區的名稱前置碼。

    節點集區的名稱是透過串接 label_prefixnode_pool_name_prefix 以及節點集區編號的值來產生的。例如,如果指定 label_prefix = "prod"node_pool_name_prefix = "np",則節點集區產生的名稱會是 prod-np-1prod-np-2prod-np-3 等等。

    node_pool_image_id Kubernetes 工作節點所要使用的映像檔 OCID。

    如果您將此變數保留為預設值 NONE,則會使用與您為 node_pool_osnode_pool_os_version 指定之值相符的影像。

    node_pool_os 應用於 Kubernetes 工作者節點的作業系統 (例如,"Oracle Linux")。

    此設定值只有在您設定 node_pool_image_id = "NONE" 時才會被視為

    node_pool_os_version 應用於 Kubernetes 工作者節點的作業系統版本 (例如,"7.7")。

    此設定值只有在您設定 node_pool_image_id = "NONE" 時才會被視為

    pods_cidr 您選擇用於 Kubernetes pods 的 IPv4 CIDR 區塊。

    請確定您在此指定的 CIDR 區塊未與您為 VCN (vcn_cidr) 指定的 CIDR 區塊重疊。

    services_cidr 您選擇用於 Kubernetes pods 的 IPv4 CIDR 區塊。

    請確定您在此指定的 CIDR 區塊未與您為 VCN (vcn_cidr) 指定的 CIDR 區塊重疊。

    worker_mode 若必須能夠從公用網際網路存取工作節點,請指定 public。否則,請將此變數設為 private

    如果您設定 worker_mode = "private",請設定 nat_gateway_enabled = true

    lb_subnet_typepreferred_lb_subnets 您為 lb_subnet_typepreferred_lb_subnets 指定的值會決定子網路類型,此類型必須用於使用 LoadBalancer 類型的 Kubernetes 服務建置的任何負載平衡器節點。

    公用負載平衡器有公用 IP 位址。內部負載平衡器只有專用 IP 位址,無法從公用網際網路存取。

    • 如果您打算使用公用負載平衡器,請將 preferred_lb_subnet = "public"subnet_type 設為 "both""public"
    • 如果您打算使用內部負載平衡器,請將 preferred_lb_subnet = "internal"subnet_type 設為 "both""internal"

      即使您將負載平衡器子網路設為內部,您還是必須在建立內部負載平衡器服務時設定適當的註解 (例如 service.beta.kubernetes.io/oci-load-balancer-internal: "true")。Merely setting to private 子網路不足。

      如需建立內部負載平衡器的相關資訊,請參閱Oracle Cloud Infrastructure 文件。

    secret_id Oracle Cloud Infrastructure Vault 服務中機密的 ID,用於儲存 Oracle Cloud Infrastructure Registry 提取應用程式影像的認證記號。
    您也必須設定下列項目:
    bastion_enabled = true
    admin_enabled = true
    admin_instance_principal = true
    email_address 產生 Docker 密碼時所使用的電子郵件地址。需有電子郵件地址,但不管您的指定內容為何。

    如果指定 secret_id,則需要此變數。

    tenancy_name 包含登錄檔的租用戶之Oracle Cloud Infrastructure Object Storage 命名空間,應從其中將影像提取以供部署到您的 Kubernetes 叢集。

    如果指定 secret_id,則需要此變數。

    username 您產生認證記號的使用者名稱 (儲存在 secret_id 中)。

    如果指定 secret_id,則需要此變數。

    install_helm 若要安裝 Helm,請指定 true

    Helm 是 Kubernetes 的套裝軟體管理員。

    若要安裝 Helm,您也必須設定 admin_instance_principal = true

    helm_version 要安裝的 Helm 從屬端版本。

    波狀符號 (Helm 伺服器端的反應器端) 會自動升級。

    install_calico 若要安裝 Calico,請指定 true

    您可以使用 Calico 來為建置到 Kubernetes 叢集的容器工作負載實行網路原則。

    如果您設定 install_calico = true,則還必須設定下列項目:
    bastion_enabled = true
    admin_enabled = true
    admin_instance_principal = true
    calico_version 要安裝的 Calico 版本。
    install_metricserver 若要安裝 Kubernetes Metrics Server,請指定 true

    預設情況下,最新版本會安裝在 kube-system 命名空間中。「Kubernetes 測量結果伺服器」會聚總叢集的資源使用狀況資料。

    如果您設定 install_metricserver = true,則還必須設定下列項目:
    bastion_enabled = true
    admin_enabled = true
    admin_instance_principal = true
    use_encryption 若要使用 Oracle Cloud Infrastructure Vault 服務來加密 Kubernetes 密碼,請將此變數設為 true
    如果您設定 use_encryption = true,則還必須設定下列項目:
    bastion_enabled = true
    admin_enabled = true
    admin_instance_principal = true
    existing_key_id Oracle Cloud Infrastructure Vault 服務中建立之現有金鑰的 OCID。

    如果您將 use_encryption 設為 true,則需要此變數。

    create_service_account 如果您要外部處理作業和工具 (例如CI/CD管線) 存取叢集,請將此變數設為 true。服務帳號是以其本身的認證記號所建立。
    如果您設定 create_service_account = true,則還必須設定下列項目:
    bastion_enabled = true
    admin_enabled = true
    admin_instance_principal = true
    service_account_name 要建立之服務帳號的名稱。
    service_account_namespace 應在其中建立帳戶的 Kubernetes 命名空間。
    service_account_cluster_role_binding 服務帳號之叢集角色連結的名稱。

    以下是已完成 terraform.tfvars 檔案的範例。

    # Identity and access parameters
    
    api_fingerprint = "d4:dc:...(truncated)"
    
    api_private_key_path = "/home/joe/.oci/oci_api_key.pem"
    
    compartment_id = "ocid1.compartment.oc1..aaaaaaaaxxx... (truncated)"
    
    tenancy_id = "ocid1.tenancy.oc1..aaaaaaaaxxx... (truncated)"
    
    user_id = "ocid1.user.oc1..aaaaaaaaxxx... (truncated)"
    
    ssh_private_key_path = "/home/joe/.ssh/id_rsa"
    
    ssh_public_key_path = "/home/joe/.ssh/id_rsa.pub"
    
    # general oci parameters
    label_prefix = "prod"
    
    region = "us-phoenix-1"
    
    # networking
    
    nat_gateway_enabled = true
    
    netnum = {
      admin   = 33
      bastion = 32
      int_lb  = 16
      pub_lb  = 17
      workers = 1
    }
    
    newbits = {
      admin   = 13
      bastion = 13
      lb      = 11
      workers = 2
    }
    
    service_gateway_enabled = true
    
    vcn_cidr = "10.0.0.0/16"
    
    vcn_dns_label = "oke"
    
    vcn_name = "oke vcn"
    
    # bastion
    
    bastion_access = "ANYWHERE"
    
    bastion_enabled = true
    
    bastion_image_id = "NONE"
    
    bastion_notification_enabled = true
    
    bastion_notification_endpoint = "joe@example.com"
    
    bastion_notification_protocol = "EMAIL"
    
    bastion_notification_topic = "bastion_server_notification"
    
    bastion_package_upgrade = true
    
    bastion_shape = "VM.Standard.E2.1"
    
    bastion_timezone = "America/Los_Angeles"
    
    admin_enabled = true
    
    admin_image_id = "NONE"
    
    admin_instance_principal = true
    
    admin_notification_enabled = false
    
    admin_notification_endpoint = "joe@example.com"
    
    admin_notification_protocol = "EMAIL"
    
    admin_notification_topic = "admin_server_notification"
    
    admin_package_upgrade = true
    
    admin_shape = "VM.Standard.E2.1"
    
    admin_timezone = "America/Los_Angeles"
    
    # availability_domains
    
    availability_domains = {
      bastion = 1
      admin   = 1
    }
    
    tagging = {
      computetag = {"Environment" = "dev" }
      networktag = { "Name" = "network" }
    }
    
    # oke
    
    allow_node_port_access = false
    
    allow_worker_ssh_access = false
    
    cluster_name = "oke"
    
    dashboard_enabled = true
    
    kubernetes_version = "LATEST"
    
    node_pools = {
      np1 = ["VM.Standard2.1", 3]
      #np2 = ["VM.Standard2.8", 4]
      #np3 = ["VM.Standard1.4", 5]
    }
    
    node_pool_name_prefix = "np"
    
    node_pool_image_id = "NONE"
    
    node_pool_os = "Oracle Linux"
    
    node_pool_os_version = "7.7"
    
    pods_cidr = "10.244.0.0/16"
    
    services_cidr = "10.96.0.0/16"
    
    worker_mode = "private"
    
    # oke load balancers
    
    lb_subnet_type = "public"
    
    preferred_lb_subnets = "public"
    
    # ocir
    
    secret_ocid = "ocid1.key.oc1..aaaaaaaaxxx... (truncated)"
    
    email_address = "joe@example.com"
    
    tenancy_name = "mytenancy"
    
    username = "joe_k8s_admin"
    
    # helm
    
    helm_version = "3.0.0"
    
    install_helm = false
    
    # calico
    
    calico_version = "3.9"
    
    install_calico = false
    
    # metrics server
    
    install_metricserver = false
    
    use_encryption = false
    
    existing_key_id = ""
    
    # service accountcreate_service_account = true
    service_account_name = "kubeconfigsa"
    service_account_namespace = "kube-system"
    service_account_cluster_role_binding = "myapps-manage-binding"
  5. 儲存並關閉 terraform.tfvars