使用 Terraform 建立 Oracle Cloud Infrastructure Kubernetes Engine 叢集

簡介

在本教學課程中,我們將示範如何使用 Terraform 建立 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 叢集,並使用 Oracle Resource Manager 管理您的 Terraform 程式碼。此方法可讓您在部署中實行基礎架構即程式碼 (IaC) 原則、增強自動化、一致性和重複性。

Oracle Cloud Infrastructure Kubernetes Engine (OKE)

Kubernetes (K8s) 是一個開放原始碼平台,可自動部署、調整規模及管理容器化應用程式。最初由 Google 開發,目前由 CNCF 維護,這是大規模執行雲端原生應用程式的業界標準。

OKE 是 Oracle Cloud Infrastructure (OCI) 上完全託管的服務,可簡化 Kubernetes 叢集的部署與管理。它將控制層和工作者節點管理自動化、與 OCI 的網路、儲存和安全服務整合,並支援無狀態和有狀態的工作負載。OKE 節點會組織成節點集區,可輕鬆調整及管理,確保容器化應用程式的高可用性和最佳資源使用率。OKE 採用標準 Kubernetes 模型,其中包含兩個主要元件 (受管理的控制層和客戶管理的資料層 )。

如需詳細資訊,請參閱管理具有不同容量類型的 OCI Kubernetes 引擎,並解決先佔式節點的常見問題

架構

下列參考架構將用於示範 OKE 叢集的建立。

OKEArchitecture

此圖說明部署在多個容錯域 (FD) 之間之單一 OCI 區域內的彈性 OKE 架構。此設定使用虛擬雲端網路 (VCN) 搭配三個不同的子網路:代管網際網路閘道的公用子網路 (LBSubnet),使用 OCI 負載平衡器分配內送流量,使用兩個專用子網路,一個用於 OKE 工作節點 (NodeSubnet),另一個用於 API 伺服器 (APISubnet)。工作者節點分佈在單一可用性網域 (AD) 內的三個 FD 中,將失敗風險降到最低。叢集會順暢地連線至 OCI Container Registry,以進行容器映像檔儲存及擷取。

OCI 主控台提供直接的 Point-&-Click 方法。若要使用此叢集,請瀏覽至 Kubernetes 叢集 UI。選取快速建立 (Quick-Create) 。為叢集命名。選取專用 API 端點。使用所需的資源配置、映像檔和數目設定受管理工作節點。OCI 主控台選項會設定增強型 OKE 叢集。它使用 OCI_VCN_IP_NATIVE CNI,這是預設值。它也為工作者節點和 API 端點提供專用的專用子網路。此外,它會為負載平衡器建立公用子網路。不過,對於大型或可重複的部署而言,此手動方法相當耗時且無法擴展

為了克服手動部署的限制,本教學課程提供簡化的平面式 Terraform 解決方案,以三個步驟將整個 OKE 叢集設定自動化:

本教學課程著重於部署核心 OKE 叢集基礎架構。應用程式層級自訂項目和工作負載特定組態超出其範圍。為了簡化佈建,我們包含了可自動執行 Terraform 命令的 Bash 命令檔。這些指令碼是專為與三相 Jenkins 管線順暢整合而設計,讓 One-Click 自動部署整個 OKE 環境。

您將瞭解如何使用 Terraform CLI 和 Oracle Resource Manager 自動建立網路資源 (VCN、閘道、子網路)、OKE 叢集及其節點集區。我們也將示範如何使用 Bash、OCI CLI 和 Jenkins 擴充此自動化功能,以減少手動作業並確保提供一致的基礎架構。

目標

必備條件

建立 OKE 叢集的 Terraform 自動化

建立 VCN (OKE-VCN) 和 OKE 叢集有兩個自動化選項:平面模組或利用子模組的標準模組。後者方法不在本文的範圍內,但它為大型、複雜的部署提供更佳的組織和擴展性,促進程式碼重複使用性和維護性,使其適用於生產環境。我們將採用簡便的扁平化方法,適用於開發使用案例、測試案例或一次性 VCN 部署示範。如需詳細資訊,請參閱 terraform-oci-oke

工作 1:使用 Terraform 部署 OKE 資源 (社群版本)

在執行 Terraform 命令以使用 Terraform CLI 規劃及部署基礎架構之前,請先從本機機器或透過 OCI Cloud Shell,以您的環境特定詳細資訊更新提供的 Terraform 組態。

您可以在此處下載完整的 Terraform 原始碼:oke_terraform_for_beginners.zip 。我們正在使用平面目錄結構。解壓縮套裝程式時,請確定所有 Terraform 樣板原始程式碼 (.tf、.tfvars、ssh 金鑰等) 都位於根目錄中。

  1. 若要指示 Terraform 建立任何主要資源 (VCNOKE_CluserNode_Pool),您必須將 terraform.tfvars 中的適當旗標 (is_vcn_createdis_k8cluster_createdis_pool_created) 設為 true。然後在其各自的程式碼區塊中指定網路、OKE 叢集及節點集區的其餘參數。

    1. 從將 is_vcn_created 設為 true 開始,指示 Terraform 建立新的 VCN,或將 false 設為使用現有的 VCN (您必須提供其 OCID)。如果建立新的 VCN,請務必指定 CIDR 區塊變數 vcn_cidr_block

    2. 提供以下三個子網路的 CIDR 區塊。

      • K8 API 端點專用子網路 (k8apiendpoint_private_subnet_cidr_block)。
      • 工作節點專用子網路 (workernodes_private_subnet_cidr_block)。
      • 服務負載平衡器公用子網路 (serviceloadbalancers_public_subnet_cidr_block)。
    3. 設定 is_k8cluster_created 旗標,告知 Terraform 建立 Kubernetes 叢集,並使用 compartment_id 指定目標區間。如果需要工作節點集區,請相應地設定 is_nodepool_created 旗標。

    4. OKE 支援兩種 CNI 類型:VCN 原生 (預設),其中每個 Pod 會取得自己的 IP 以獲得更佳的效能和完整的 OCI 網路整合,而 Flannel-Overlay 則是 Pod 共用節點 VNIC 的較簡單覆疊網路。在此設定中,cni_type 會設為 OCI_VCN_IP_NATIVE,以符合 OCI 主控台中快速建立工作流程所建立的預設叢集組態。

    5. OKE 提供兩種叢集類型:基本增強。為了獲得更大的彈性,請將 cluster_type 設為 ENHANCED_CLUSTER

      • 增強型叢集提供進階功能,例如附加元件管理、更高的安全性,以及更好的生命週期控制
      • 基本叢集提供具有基本功能的直接 Kubernetes 環境
    6. 節點週期組態 node_cycle_config 定義如何在節點集區中建立、取代或更新工作節點,尤其是在更新、升級或自動調整事件期間。組態定義下列屬性:

      • is_node_cycling_enabled (bool): 在更新或升級期間啟用節點的自動循環 (取代)。設為 true 以啟用安全節點輪換。
      • maximum_surge (int)可在更新期間新增的額外節點數目上限 (超過所需的數目)。它允許在刪除舊節點之前建立新節點,但不停機。
      • maximum_unavailable (int)更新期間不可使用的節點數目上限。用於控制滾動更新期間的中斷。
      • cycle_modes (list) (選擇性):提供節點循環的動作順序清單。可用的週期模式為:
        • REPLACE_BOOT_VOLUME更新開機磁碟區而不終止節點。
        • REPLACE_NODES使用更新的組態來協調、清空、終止及重新建立節點。
  2. 僅在必要時修改預設值。此套件包含環境設定、執行步驟的明確指示,以及與網路和安全相關的重要概念。

    以下是 terraform.tfvars 檔案中 Terraform 組態的範例,您必須自訂該組態才能在環境中執行。

    	##########################################################################
    	# Terraform module: OKE Cluster with Flat Network.                       #
    	#                                                                        #
    	# Author: Mahamat H. Guiagoussou and Payal Sharma    		             #
    	#                                                                        #
    	# Copyright (c) 2025 Oracle                                              #
    	##########################################################################
    
    	# Working Compartment
    	compartment_id = "WORKING_COMPARTMENT"
    
    	#------------------------------------------------------------------------#
    	# Step 2.1:  Create Flat Network                                         #
    	#------------------------------------------------------------------------#
    	is_vcn_created = false   # Terraform creates VCN if set to 'true'
    
    	# Display Name Prefix & Host Name Prefix 
    	display_name_prefix = "DISPLAY_NAME_PREFIX" # e.g.: "ACME-DEV"
    	host_name_prefix    = "HOST_PREFIX"         # e.g.: "myvcn" 
    
    	# VCN & Subnets CIDR Blocks
    	vcn_cidr_block                                = "VCN_CIDR_BLOCK" 
    	k8apiendpoint_private_subnet_cidr_block       = "ENDPOINT_CIDR_BLOCK" 
    	workernodes_private_subnet_cidr_block         = "WRKRNODE_CIDR_BLOCK" 
    	serviceloadbalancers_public_subnet_cidr_block = "LB_CIDR_BLOCK" 
    
    	#------------------------------------------------------------------------#
    	# Step 2.2: Create the OKE Cluster                                       #
    	#------------------------------------------------------------------------#
    
    	is_k8cluster_created             = false # Terraform creates OKE cluster if 'true' 
    	control_plane_kubernetes_version = "K8_VERSION" # e.g.: "v1.32.1"
    	cni_type                         = "OCI_VCN_IP_NATIVE" # FLANNEL_OVERLAY
    	control_plane_is_public          = false
    
    	# Set the below flag to true for 'OCI_VCN_IP_NATIVE'. This is needed to 
    	# provision a dedicated subnet for pods when using the VCN-Native CNI.
    	create_pod_network_subnet        = true               # NO subnet 'false'           
    	image_signing_enabled            = false              # image not signed
    	cluster_type                     = "ENHANCED_CLUSTER" # or "BASIC_CLUSTER"
    
    	#------------------------------------------------------------------------#
    	# Step 2.3: Create a Node Pool for the cluster                           #
    	#------------------------------------------------------------------------#
    	is_nodepool_created             = false # Terraform creates Node_Pool if 'true'
    	worker_nodes_kubernetes_version = "WORKER_NODE_VERSION" # e.g.: "v1.32.1"
    
    	# Detailed configuration for the Node Pool
    	node_pools = {
    	  node_pool_one = {
    		name  = "WORKER_NODE_POOL_DISPLAY_NAME" # e.g. "my_worker_node_pool",
    		# https://docs.oracle.com/en-us/iaas/Content/ContEng/Reference/contengimagesshapes.htm
    		shape = "WORKER_NODE_SHAPE_NAME" # e.g.: "VM.Standard.E4.Flex",   
    		shape_config = {
    			ocpus  = "WORKER_NODE_NB_OF_OCPUS" # e.g.: 1
    			memory = "WORKER_NODE_MEMOR_SIZE"  # e.g.: 16
    		},
    		boot_volume_size =  "WORKER_BOOT_VOLUME_SIZE"  # e.g.: 50
    		# Oracle maintains a list of supported OKE worker node images here:
    		# https://docs.oracle.com/en-us/iaas/images/oke-worker-node-oracle-linux-8x/ 
    		# https://docs.oracle.com/en-us/iaas/Content/ContEng/Reference/contengimagesshapes.htm#images__oke-images
    		image = "WORKER_NODE_OKE_IMAGE"  # e.g.: ocid1.image.oc1.iad...."
    
    		node_labels = { hello = "Demo"},
    
    		# Run command "oci iam availability-domain list" to list region's ADs.
    		# No need to set Fault Domains, they are selected automatically
    		availability_domains     = ["YOUR_AD_NAME"] # e.g. "GqIF:US-ASHBURN-AD-1", 
    		number_of_nodes          = "NB_OF_NODES_IN_THE_POOL" # e.g. 1,
    		pv_in_transit_encryption = false,
    		node_cycle_config = {
    			node_cycling_enabled   = false
    			maximum_surge          = 1
    			maximum_unavailable    = 0
    		},
    		ssh_key = "YOUR_SSH_KEY_PATH" # e.g.: "worker_node_ssh_key.pub" 
    	  }
    	}
    
  3. 執行下列 Terraform 命令。

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

    成功執行 terraform apply 之後,您的 OKE 叢集將會建立在您的工作區間和區域中,並設定下列組態:

    • ENHANCED_CLUSTER (含 OCI_VCN_IP_NATIVE cni_type) 以及指定的 OKE 版本。
    • 工作節點和 API 端點都有專用的專用子網路。
    • 負載平衡器存取叢集服務的公用子網路。
    • 使用您想要的資源配置、映像檔以及節點數目設定的受管理節點集區。
  4. 請前往 OCI 主控台確認您的叢集部署和組態。

    OKECluster

    下列影像說明成功執行 Terraform 以及產生的日誌。

    OKETFLogs

  5. 完成測試後,請執行 terraform destroy 來清除您的環境。此命令會移除在部署期間建立的所有 OKE 資源,並協助防止租用戶使用不必要的資源。

工作 2:使用 Jenkins CI/CD 管線將 Terraform CLI 執行自動化

在此任務中,我們會將先前詳細的步驟摘要成四個主要階段,專為 Jenkins 稍後協調而設計。此聚總管線是透過一組執行 Terraform CLI 命令的 Bash 命令檔來實行。

作業 2.1:建立網路資源

下列命令檔會執行一系列的多個 Terraform 命令來建立網路資源。

對於其餘的命令檔,請確定已經執行 terraform init,且您正在從工作目錄執行命令。例如,~/oke_terraform_for_beginners

作業 2.2:建立 OKE 叢集

此程序檔會執行 terraform apply 指令來建立 OKE 叢集。

作業 2.3。建立 OKE 工作節點集區

下列命令檔會執行 terraform apply 命令,為 OKE 叢集建立工作節點集區。

作業 2.4:毀棄所有資源

此程序檔會執行 destroy 指令,清除所有 OKE 叢集資源 (網路資源、OKE 叢集及工作節點集區)。

我們已自動化 Jenkins 管線的端對端流程,並將其合併成四個 Jenkins 組建工作 (任務 2.1、2.2、2.3)。此聚總的管線是透過執行 Terraform CLI 命令的 Bash 命令檔執行。下方影像顯示前三項工作的一鍵自動化;簡單來說,不包含 destroy 步驟。

OKEArchitecture

作業 3:使用 Oracle 資源管理程式協調 OKE 部署

Oracle 資源管理程式流程 (不滿意):

OKEArchitecture

下圖說明「Oracle 資源管理程式程式碼管理程式」的七個步驟:

  1. 來源組態:定義 IaC 組態的來源位置,例如 OCI 中的區間、OCI 物件儲存的儲存桶、Zip 檔案、Bitbucket 或 GitHub。
  2. Terraform 範本:基礎架構組態是使用範本檔案中的 HashiCorp Terraform 來定義。
  3. Oracle Resource Manager: OCI Terraform as a Service 方案採用 Terraform 範本作為輸入,並管理基礎架構佈建流程。
  4. 建立堆疊:Oracle Resource Manager 會使用樣板來建立堆疊,此堆疊是 OCI 資源的集合。
  5. 計畫:在進行任何變更之前,「Oracle 資源管理程式」會產生一個計畫,其中概述將對基礎架構進行啟動設定或修改的動作。
  6. 套用:根據計畫,Oracle Resource Manager 會套用組態,並在 OCI 內佈建指定的資源。
  7. 毀棄:您也可以使用「Oracle 資源管理程式」毀棄 (取消啟動設定) 或永久清除堆疊先前建立的資源。

作業 3.1:來源組態:定義 Oracle 資源管理程式堆疊

若要使用 Oracle Resource Manager 部署 OKE 叢集,請先下載方便開始使用的模組:oke_terraform_for_beginners_orm.zip 。我們正在使用平面目錄結構。解壓縮套裝程式時,請確定所有 Terraform 樣板原始程式碼 (.tf) 都位於根目錄中。

此模組版本已預先為 Oracle Resource Manager 設定;terraform.tfvars 已經移除,所有變數均以 variables.tf 中的 "generic" 預留位置值 (例如 "REPLACE_WITH_YOUR_OWN_VARIABLE_VALUE") 設定。

建立 stack 之前,請先使用您的區域更新 variables.tf、網路 CIDR 和旗標,以控制 VCN、OKE 叢集和節點集區的建立。

OKE 叢集使用 VCN 原生 CNI (OCI_VCN_IP_NATIVE) 作為 Pod 網路,因此請確定已啟用 create_pod_network_subnet 旗標來定義您的 Pod 子網路 CIDR。

在 Oracle Resource Manager UI 中設定 stack 時,您可以選取下列項目來控制核心 OKE 資源的建立:

作業 3.2:建立 Oracle 資源管理程式堆疊

在建立 stack 時,選取提供的 Terraform 範本,然後直接在主控台內設定必要的變數。Oracle Resource Manager 會自動偵測 Terraform 檔案中定義的輸入變數,並以易於編輯的形式呈現這些變數。在此階段,您需要提供環境特定詳細資訊,例如您的租用戶 OCID、區間 OCID 以及其他必要值。

下列影像說明 Oracle Cloud 主控台中的 stack 建立和變數組態處理作業。

OKEArchitecture

OKEArchitecture

作業 3.3:執行套用工作

為求簡化,我們將略過 Plan 步驟,因為在「Oracle 資源管理程式」中執行 Apply 會自動執行該步驟。透過啟動 Apply 工作,Oracle Resource Manager 會使用上一個 Source Configuration 步驟中定義的組態來佈建 OCI 內指定的 OKE 資源。

下列影像說明成功的 stack Apply 工作執行以及產生的日誌。

OKEArchitecture

OKEArchitecture

作業 3.4:執行毀棄工作

活動或測試完成後,您可以在「Oracle 資源管理程式」中執行 Destroy 工作來清除環境。此動作會指示 Oracle Resource Manager 取消啟動設定 (永久清除) 先前建立為堆疊一部分的所有基礎架構資源,包括 OKE 叢集、節點集區、網路元件以及任何相關服務。執行 Destroy 可確保完全移除未使用的資源,協助您避免不必要的成本,並維持乾淨的 OCI 租用戶。

接下來的步驟

使用 Terraform 佈建 OKE 叢集,提供一致、可重複且自動化的方法來管理 Oracle Cloud Infrastructure (OCI) 上的 Kubernetes 基礎架構。透過基礎架構即程式碼 (IaC),團隊可以協調叢集的建立、實施最佳實務,並將 CI/CD 工作流程整合到其部署流程中。Oracle Resource Manager 透過簡化 Terraform 作業、管理狀態和實現 OCI 內的協作來增強這一點。本教程作為一個新手的介紹,在我們即將推出的進階指南中,我們將涵蓋可定制模塊、生產級自動化、模組化架構模式和完整的 CI/CD 整合。保持關注,以獲得更可擴展、安全且符合企業級需求的大規模管理 Kubernetes 方法。

確認

其他學習資源

docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center