使用進階 Terraform 模組部署 Oracle Cloud Infrastructure Kubernetes Engine (OKE)
簡介
這是 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 自動化系列中的第二個教學課程,以第一個概念為基礎構建,使用 Terraform 建立 Oracle Cloud Infrastructure Kubernetes Engine 叢集。本文將介紹進階自動化和模組化設計,以在 Oracle Cloud Infrastructure (OCI) 上佈建可擴展、彈性和高度自訂的環境,進而將 OKE 部署更上一層樓。
本指南是專為 Oracle 工程師和客戶所設計,可讓您將基本 Terraform 組態轉換成結構化、可重複使用的模組,以量身打造任何部署大小。我們運用 Infrastructure as Code (IaC) 原則與 Terraform (社群版本) 結合了 Jenkins 和 Oracle Command Line Interface (CLI) ,因此為 OKE 叢集、其組態和自動化測試提供 single-click
佈建解決方案。
本教學課程著重於四個關鍵領域:
- 模組化設計與自動化:為核心元件 (例如 VCN、OKE 叢集及堡壘主機) 建置可重複使用的模組,並搭配版本控制以簡化管理及提升程式碼重複使用。
- 動態組態:從單一程式碼庫管理環境特定設定值 (dev、test、prod),以進行一致且可重複的部署。
- 進階節點集區:使用特殊資源配置、相容的 OKE 影像和標籤,將資源使用量和成本最佳化,以放置智慧型工作負載。
- 無縫 CI/CD 整合:使用整合 Terraform、Jenkins 和 OCI CLI 的管線將 OKE 佈建和更新自動化,以實現高效率的
one-click
部署。
本指南中概述的架構使用分層網路拓樸來建立安全且可擴展的基礎。它將控制層、工作節點和負載平衡器流量分開,確保任何規模的企業工作負載都能享有彈性。我們將示範如何將佈建這類環境 (包括網路、叢集及節點集區) 完全自動化,同時提供可自訂及擴充解決方案所需的工具。
本教學課程假設您瞭解 Kubernetes、網路和 IaC 原則,以及 Terraform、OCI CLI 和 Jenkins 等工具的工作知識。最後,您將具備在 OCI 上部署彈性、高效能且可擴展 OKE 環境的技能,並靈活地適應您的特定需求。
Oracle Cloud Infrastructure Kubernetes Engine (OKE) 概要
雖然 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 是託管服務,但成功執行關鍵任務工作負載仍需要審慎且結構良好的架構方法。從基本設定轉變為可擴展的企業級環境需要仔細規劃和使用基礎架構即程式碼 (IaC) 工具,例如 Terraform。
模組化和自動化對於 OKE 而言至關重要,以確保擴展性、安全性和營運效率。企業可以利用結構化模組和自動化工具,以一致性部署和管理關鍵任務工作負載,減少手動錯誤,並加快上市時間。
下圖說明 OKE 架構、標示其分層網路拓樸、專用 API 端點及安全存取控制:
如需架構的詳細範例,請參閱 Oracle 文件。
架構考量
建立可擴充 OKE 環境至少涉及解決下列主要技術挑戰:
- 安全性:使用工作負載識別、網路安全群組、專用 API 端點和 Web 應用程式防火牆 (WAF) 實作強大的安全狀態,以進行安全隔離和嚴格的流量控制。
- 擴展性:將節點分配到各個可用性網域,然後分配容錯域並使用 Kubernetes Cluster Autoscaler 進行動態擴展,以最佳化高可用性。
- 監控與可觀察性:與 OCI 日誌記錄和 OCI 日誌記錄分析整合,以全面監控叢集和 Pod 層次行為。
關鍵設計要素
此模組化解決方案是以分層網路架構為基礎,可為 OKE 上的企業工作負載提供安全且可擴展的基礎:
- 網路區隔:使用 Kubernetes API、工作節點及負載平衡器的專用公用和專用子網路區隔環境。
- 受控制存取:使用專用 API 端點進行安全控制層存取,以及用於受管理 SSH 存取的堡壘主機。
- 完全自動化:使用 Terraform、OCI CLI、Bash 和 Jenkins 自動化佈建整個環境,包括網路、叢集和節點集區,以實現高效率的
single-click
部署。 - 進階作業:導入永久磁碟區和自動化節點循環,以進行零停機升級。
建置適用於 OKE 的模組化 Terraform 自動化
將 flat
Terraform 組態轉換為 structured
,模組化設計對於建立可重複且可擴展的環境至關重要。此方法可確保企業規模的組織、程式碼重複使用性和維護性更佳,並編列各團隊相容性和協同合作的版本。
轉換程序:平面至結構化模組
從第一個教學課程中描述的平面模組開始,我們將程式碼重製為模組化設計:
- 重新建立目錄結構:建立子項模組 (
vcn
、oke
、bastion
),並將資源組織至它們各自的資料夾中。 - 套用金鑰原則:
- 結構和邏輯:封裝獨立目錄中的資源 (例如
modules/vcn
、modules/oke
、modules/bastion
),然後將單體代碼分割成main.tf
、variables.tf
和outputs.tf
,以供讀取和維護。 - 輸入 / 輸出與版本控制:定義
variables.tf
中的輸入、在outputs.tf
中顯示輸出,以及使用 Terraform 模組版本控制 (source
中的version
限制條件) 以無縫接軌的資料流程與相容性。 - 協調:處理根模組層級的條件邏輯 (例如
count
),讓子模組專注於其資源。
- 結構和邏輯:封裝獨立目錄中的資源 (例如
目錄結構:平面與模組化
Flat Module (平面模組) :單一的單一目錄,包含少數檔案中的所有資源。簡單易用的概念證明,但隨著複雜性成長而變得無法管理。
結構化模組:每個資源群組 (VCN、OKE、堡壘主機) 都在自己的模組目錄中。根模組會協調相依性和最上層組態。
範例模組
- VCN 模組 (
modules/vcn
) :- 用途:管理網路 (VCN、子網路、閘道、路由、安全清單等)。
- 索引鍵檔案:
variables.tf
:定義輸入,例如vcn_cidr_block
。main.tf
:包含資源定義。outputs.tf
:顯示其他模組的 VCN 和子網路 ID。
- OKE 模組 (
modules/oke
) :- 目的:部署 OKE 叢集與節點集區。
- 索引鍵檔案:
variables.tf
:包含來自 VCN 模組的vcn_id
和子網路 ID。main.tf
:重製的叢集和節點集區定義。outputs.tf
:顯示 OKE 叢集與節點集區 ID。
- 堡壘主機模組 (
modules/bastion
) :- 用途:建立堡壘主機以進行安全存取。
- 索引鍵檔案:
variables.tf
:定義輸入,例如bastion_subnet_id
。main.tf
:重製的堡壘主機資源。outputs.tf
:顯示堡壘主機 ID 和公用 IP。
為何選擇模組?
- 可重複使用性與協同合作:可在專案之間共用模組,促進團隊合作。
- 可維護性與版本控制:一致地套用更新,減少差異並確保相容性。
- 擴展性與一致性:模組化設計可有效率地處理複雜性、將部署標準化,以及移除重複項目。
模組協調 - 根 main.tf
根 main.tf
會依序協調三個主要模組 (modules/vcn
、modules/oke
和 modules/bastion
) 的部署。每個模組會根據組態旗標 (is_vcn_created
、is_oke_created
、is_bastion_created
) 有條件地呼叫,以提供部署的彈性。以下是簡化的協調流程版本,反白標示關鍵模組邏輯,但不詳述完整的 main.tf
。
協調流程:
- VCN 模組 (
modules/vcn
) :- 佈建虛擬雲端網路 (VCN) 和相關子網路 (例如 Kubernetes API 和工作節點的專用子網路、負載平衡器和堡壘主機的公用子網路)。
- 由
is_vcn_created
控制。如果啟用,會建立 VCN;否則,會假設現有的 VCN (您需要提供其使用的子網路 OCID)。 - 範例程式碼片段:
module "vcn" { count = var.is_vcn_created ? 1 : 0 source = "./modules/vcn?ref=v1.0.0" # Specify the module version # Key variables: compartment_id, vcn_cidr_block, subnet configs, ... }
- OKE 模組 (
modules/oke
) :- 部署 OCI Kubernetes Engine (OKE) 叢集,包括控制層和選擇性的受管理節點集區。
- 視子網路 ID 的 VCN 模組而定。只有在
is_oke_created
和is_vcn_created
為 true 時才會呼叫。 - 範例程式碼片段:
module "oke" { count = var.is_oke_created && var.is_vcn_created ? 1 : 0 source = "./modules/oke?ref=v1.0.0" # Specify the module version # Key variables: vcn_id, subnet IDs, k8 version, node pool config, ... }
- 堡壘主機模組 (
modules/bastion
) :- 建立堡壘主機,以安全存取專用資源的 SSH。
- 視公用子網路 ID 的 VCN 模組而定。只有在
is_bastion_created
和is_vcn_created
為 true 時才會呼叫。 - 範例程式碼片段:
module "bastion" { count = var.is_bastion_created && var.is_vcn_created ? 1 : 0 source = "./modules/bastion?ref=v1.0.0" # Specify the module version # Key variables: bastion_subnet_id, SSH keys, parameters... }
關鍵備註:
- 模組相依性:VCN 模組 (例如
module.vcn[0].vcn_id
) 的輸出會作為輸入傳送至 OKE 和堡壘主機模組,以確保明確的相依性鏈結。 - 組態邏輯:簡化的參數對應 (例如
node_pool_param
、bastion_params
) 可簡化組態和可讀性。 - 啟動多版本功能:在
source
中使用版本限制條件可確保模組以正確且經過測試的版本進行部署,以確保相容性
為 OKE 建立模組化 Terraform 結構之後,下一步是將部署自動化。自動化可確保一致性、減少手動錯誤、加速佈建流程,並透過快速交付新功能和服務來直接改善上市時間 (TTM)。
自動化選項
有數種工具可以自動執行 OKE 部署,包括 Terraform CLI、OCI Resource Manager (ORM)、OCI CLI、Ansible OCI 模組和 Helm。不過,本指南著重於 Oracle Cloud Infrastructure (OCI) 中的兩個最著名基礎架構即程式碼 (IaC) 方法:Terraform CLI 和 OCI Resource Manager (ORM) 。
兩個工具都運用相同的宣告式 HashiCorp 組態語言 ( HCL),但其作業模型不同:
- Terraform CLI :命令行介面工具可直接控制基礎架構和狀態檔案,適用於個別開發人員或小型團隊。
- OCI 資源管理程式 (ORM) :以主控台為基礎、完全受管理的 OCI 原生服務,可集中管理狀態並提供安全的協作環境,使其成為企業規模部署的首選。
讓我們詳細探索每個選項。
選項 1:使用 Terraform CLI 部署 OKE 資源
當您需要對本機環境進行完整的控制時,Terraform CLI 就是理想的選擇。最適合個別開發人員或小型團隊,他們可以管理狀態檔案並使用共用後端有效協同合作。其可攜性可讓您從任何機器執行:本機、VM、容器、OCI CloudShell 或 CI/CD 執行程式 (例如 Jenkins)。不過,這種彈性具有職責,例如管理狀態檔案,以及確保團隊成員間的本機設定一致。
開始時,請下載 Terraform CLI 原始程式碼套裝程式並解壓縮至您的 Terraform 工作目錄。此套裝軟體包含 main.tf
、terraform.tfvars
範例和詳細的模組組態:下載 oke_advanced_module.zip
。
使用 Terraform CLI 部署 OKE 包括七項主要工作,從設定變數和網路到設定 OKE 叢集、節點集區以及堡壘主機。以下是使用 Terraform CLI 佈建及驗證 OKE 環境的詳細步驟。
作業 1.1:設定 Terraform 變數
以環境特定詳細資訊 (例如 tenancy_ocid、區域、compartment_ocid 和 network_compartment_ocid) 更新 terraform.tfvars
檔案。啟用下列旗標以控制資源的建立:
is_vcn_created
: Create new or reuse an existing VCN.is_okecluster_created
:佈建 OKE 叢集。is_nodepool_created
:建立一或多個節點集區。is_bastion_created
:部署堡壘主機。
作業 1.2:網路組態
定義 VCN 及其子網路的 CIDR 區塊:
vcn_cidr_block
:VCN CIDR 區塊鏈。k8apiendpoint_private_subnet_cidr_block
:Kubernetes API 端點子網。workernodes_private_subnet_cidr_block
:工作節點子網路。serviceloadbalancers_public_subnet_cidr_block
:負載平衡器子網路。bastion_public_subnet_cidr_block
:堡壘主機子網路。
作業 1.3:OKE 叢集組態
- 指定
control_plane_kubernetes_version
和cluster_type
(BASIC_CLUSTER
或ENHANCED_CLUSTER
)。 - 選擇 CNI 類型:
OCI_VCN_IP_NATIVE
:Pod 可取得原生 OCI IP。FLANNEL_OVERLAY
:Pod 從 Flannel 取得 IP。
- 將
control_plane_is_public
設為true
或false
。
作業 1.4:節點集區組態
- 在
node_pools
下定義節點集區,包含:- 資源配置、版本、開機磁碟區大小及 AD 位置 (如果適用,請設定 3 個 AD)
- 可存取集區中工作節點的 SSH 金鑰
- 啟用
node_cycle_config
以進行安全節點更新:node_cycling_enabled
:啟用滾動節點取代。maximum_surge
和maximum_unavailable
:控制更新期間的調整比例 (例如:1:0)。cycle_modes
:選擇BOOT_VOLUME_REPLACE
或INSTANCE_REPLACE
。
作業 1.5 堡壘主機組態
- 如果
is_bastion_created
為true
,Terraform 會在公用子網路中佈建 Linux 堡壘主機。 - 提供:
shape
、hostname
、boot_volume_size
、Linux 映像檔 OCID 以及 SSH 金鑰路徑。
作業 1.6:執行 Terraform 命令
執行下列命令以部署基礎架構:
terraform init
terraform plan
terraform apply
terraform apply
完成後,您的 OKE 叢集將會佈建如下:
- 一個 VCN,其中包含關聯的網路元件 (路由表、安全清單、閘道)、工作節點和 API 端點的專用子網路,以及負載平衡器的公用子網路。
- 具有指定 CNI 類型和 Kubernetes 版本的
ENHANCED_CLUSTER
、受管理節點集區,以及用於安全 SSH 存取的堡壘主機 (若已設定)。
Task 1.7:驗證
- 瀏覽至「OCI 主控台」以驗證叢集組態。
- 執行
terraform destroy
以在完成時清除資源。
自動化 OKE 部署與 Jenkins CI/CD 管線
若要將 OKE 部署整合至 DevOps 管線,Terraform CLI 是絕佳選擇。我們的方法詳述於使用 Terraform 建立 Oracle Cloud Infrastructure Kubernetes Engine 叢集中,並使用 bash 命令檔來協調流程。此工作流程可合併至 Jenkins 管線以進行自動執行。
選項 2:使用 OCI 資源管理程式自動執行 OKE
當您需要針對基礎架構部署的託管雲端原生解決方案時, OCI Resource Manager (ORM) 是理想的選擇。這特別適合協同合作、安全、集中式狀態管理及治理至關重要的企業環境。ORM 的主要優勢在於它處理 OCI 內的整個部署生命週期,安全地儲存狀態檔案並防止發生衝突。這樣就不需要本機設定或管理共用後端。此外,ORM 與 Oracle Cloud 的深度整合可讓 ORM 運用 OCI 原生功能,例如身分識別與存取管理 (IAM),強化安全性與控制。
在本教學課程中,我們將 OCI Resource Manager (ORM) 與 OCI CLI、Bash 結合,並將其整合至 Jenkins CI/CD 管線中,提供完整的 one-click
自動化流程以及額外的 DevOps 功能 (例如漂移偵測、安全狀態管理,以及使用版本控制進行團隊協同合作以實現相容性)。
OCI 資源管理程式流程
下圖說明 ORM 工作流程,其中包含七個步驟:
- 來源組態:定義 IaC 組態的來源 (例如 OCI 物件儲存、GitHub、Zip 檔案)。
- Terraform 樣板:使用 Terraform 定義基礎架構。
- OCI 資源管理程式:ORM 會採用 Terraform 樣板並管理啟動設定處理作業。
- 建立堆疊:ORM 會使用樣板來建立 OCI 資源堆疊。
- 計畫:產生概述要採取之動作的計畫。
- 套用:根據計劃佈建資源。
- 毀棄:不再需要資源時,請取消資源。
若要使用 OCI Resource Manager (ORM) 的新模組部署 OKE 叢集,請先下載 ORM 的進階模組:oke_advanced_module_orm.zip
。此版本是針對 ORM 預先設定的,變數設為一般預留位置 (例如 REPLACE_WITH_YOUR_OWN_VARIABLE_VALUE
)。
作業 2.1:來源組態
使用您的環境特定詳細資訊 (例如區域、網路 CIDR 以及旗標) 更新 variables.tf
,以控制資源的建立 (VCN、OKE 叢集、節點集區、堡壘主機)。
下列 bash 命令檔會建立 ORM 資源來源 zip 檔案。
- Bash 指令碼:
create_new_oke_stack_source.sh
。#!/bin/bash # Define the source directory for the stack src_dir="~/oke_advanced_module_orm/oke_app_src" # Create the zip archive from the source code with overwrite rm -f "$src_dir/stackconfig.zip" cd $src_dir zip -r "../stackconfig.zip" * modules/ # List the contents of the zip file for verification /usr/bin/unzip -l "$src_dir/stackconfig.zip"
請檢查您的來源目錄 (
~/oke_advanced_module_orm
),確定名稱為stackconfig.zip
的檔案包含所有 terraform 資源定義。
作業 2.2:建立 OCI 資源管理程式堆疊
使用 OCI CLI 建立 ORM 堆疊。下面的指令檔可簡化程序:
Bash 指令碼:create_new_oke_stack.sh
。
#!/bin/bash
# Load environment variables (e.g., COMPARTMENT_ID, STACK_NAME, etc.)
source "./env-vars"
# Create the Oracle Resource Manager stack and capture the OCID
stack_output=$(oci resource-manager stack create \
--compartment-id "$COMPARTMENT_ID" --display-name "$STACK_NAME" \
--description "$STACK_DESCRIPTION" --config-source "$CONFIG_SOURCE")
# Extract the OCID of the newly created stack and display it
STACK_OCID=$(echo "$stack_output" | jq -r '.data.id')
echo "Stack OCID: $STACK_OCID"
作業 2.3:執行堆疊計畫工作
在套用變更之前,執行 Plan
工作來驗證變更。此模擬測試提供基礎架構變更的透明度。
Bash 指令碼:create_oke_stack_plan_job.sh
#!/bin/bash
# Load environment variables (e.g., STACK_OCID)
source "./env-vars"
# Create a plan job for the specified stack
plan_job_output=$(oci resource-manager job create-plan-job \
--stack-id "$STACK_OCID")
# Extract the OCID of the plan job and check for errors
PLAN_JOB_OCID=$(echo "$plan_job_output" | jq -r '.data.id')
if [[ -z "$PLAN_JOB_OCID" ]]; then
echo "Error: Failed to retrieve plan job OCID." >&2
exit 1
fi
echo "Plan job OCID: $PLAN_JOB_OCID"
作業 2.4:建立套用工作
使用 Apply
工作佈建 OKE 叢集和關聯的資源,例如節點集區。
Bash 指令碼:create_oke_stack_apply_job.sh
#!/bin/bash
# Load environment variables (e.g., STACK_OCID, EXEC_PLAN_STRATEGY)
source "./env-vars"
# Create an apply job for the specified stack
apply_job_output=$(oci resource-manager job create-apply-job \
--stack-id "$STACK_OCID" \
--execution-plan-strategy "$EXEC_PLAN_STRATEGY")
# Extract the OCID of the apply job and check for errors
APPLY_JOB_OCID=$(echo "$apply_job_output" | jq -r '.data.id')
if [[ -z "$APPLY_JOB_OCID" ]]; then
echo "Error: Failed to retrieve apply job OCID." >&2
exit 1
fi
echo "Apply job OCID: $APPLY_JOB_OCID"
工作 2.5:執行毀棄工作
在不再需要環境時執行 Destroy
工作來清除資源。
Bash 指令碼:create_oke_stack_destroy_job.sh
#!/bin/bash
# Load environment variables (e.g., STACK_OCID, EXEC_PLAN_STRATEGY)
source "./env-vars"
# Create an jotroy for the specified stack
apply_job_output=$(oci resource-manager job create-destroy-job \
--stack-id "$STACK_OCID" \
--execution-plan-strategy "$EXEC_PLAN_STRATEGY")
# Extract the OCID of the destroy job and check for errors
DESTROY_JOB_OCID=$(echo "$apply_job_output" | jq -r '.data.id')
if [[ -z "$DESTROY_JOB_OCID" ]]; then
echo "Error: Failed to retrieve destroy job OCID." >&2
exit 1
fi
echo "Apply job OCID: $DESTROY_JOB_OCID"
使用 Jenkins 和 OCI 資源管理程式自動執行 OKE
我們建立了 Jenkins 管線,將端對端佈建程序自動化 (任務 2.1 – 2.4)。管線會使用 OCI CLI 執行 bash 命令檔,以與 ORM 互動。
下方影像顯示前四個工作的 one-click
自動化;簡潔不包含 destroy
步驟。
管線包括來源組態、ORM 堆疊建立、計畫產生、資源佈建,以及選擇性的資源取消佈建。
後續步驟:
使用 Terraform 進行 OKE 佈建可確保一致性、自動化及擴展性。結合 OCI 資源管理程式和 CI/CD 管線的模組化設計,讓部署變得更簡單且更容易維護。在下一個教學課程中,我們將涵蓋監控、安全性和生產整備的最佳實務。在這些基礎上,我們將擴展模組至 Oracle AIOps ,為 AI 應用程式建立端對端 OKE 藍圖,並展示使用 AI 驅動的可觀察性記錄分析如何偵測異常並強化容器平台安全性。
相關連結
- 使用 Terraform 建立 Oracle Cloud Infrastructure Kubernetes Engine 叢集
- GitHub 上的 Terraform OCI OKE
- OCI 資源管理程式
確認
- 作者:Mahamat Guiagoussou (Master Principal Cloud Architect)、Payal Sharma (資深雲端架構師)、Matthew McDaniel (員工雲端工程師)
其他學習資源
在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Deploy Oracle Cloud Infrastructure Kubernetes Engine (OKE) using Advanced Terraform Modules
G44447-01