使用高级 Terraform 模块部署 Oracle Cloud Infrastructure Kubernetes Engine (OKE)
简介
这是 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 自动化系列中的第二个教程,它基于第一个概念 使用 Terraform 创建 Oracle Cloud Infrastructure Kubernetes Engine 集群中的基础概念。在本文中,我们将 OKE 部署提升到一个新的水平,引入了高级自动化和模块化设计,用于在 Oracle Cloud Infrastructure (OCI) 上预配可扩展、可恢复且高度可定制的环境。
本指南专为 Oracle 工程师和客户而设计,可帮助您将基本的 Terraform 配置转换为可根据任何部署大小定制的结构化、可重用模块。通过结合使用基础设施即代码 (IaC) 原则和 Terraform(社区版本),再结合使用 Jenkins 和 Oracle 命令行界面 (Command Line Interface,CLI) ,我们为 OKE 集群及其配置和自动测试提供了 single-click
预配解决方案。
本教程重点介绍四个关键领域:
- 模块化设计和自动化:为核心组件(例如 VCN、OKE 集群和堡垒主机)构建可重用的模块,并进行版本控制以实现兼容性,从而简化管理并促进代码重用。
- 动态配置:从单个代码库管理特定于环境的设置(设备、测试、生产),以实现一致且可重复的部署。
- 高级节点池:使用专用配置、兼容 OKE 映像和标签优化资源使用和成本,以实现智能工作负载放置。
- 无缝 CI/CD 集成:使用集成了 Terraform、Jenkins 和 OCI CLI 的管道自动执行 OKE 预配和更新,以实现高效的
one-click
部署。
本指南中概述的体系结构使用分层网络拓扑来创建安全且可扩展的基础。它可以隔离控制层、 worker 节点和负载平衡器流量,从而确保任意规模的企业负载都具有灵活性。我们将演示如何完全自动预配此类环境,包括网络、集群和节点池,同时提供工具来定制和扩展解决方案以满足您的需求。
本教程将了解 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 应用防火墙 (Web Application Firewall,WAF) 实施强大的安全态势,从而实现安全隔离和严格的流量控制。
- 可扩展性:通过跨可用性域(即容错域)分配节点并使用 Kubernetes 集群自动缩放器进行动态缩放来优化高可用性。
- 监视和观测:与 OCI Logging 和 OCI Logging Analytics 集成,全面监视集群和云池级别的行为。
关键设计要素
此模块化解决方案基于分层网络架构构建,可为 OKE 上的企业工作负载提供安全、可扩展的基础:
- 网络细分:为 Kubernetes API、worker 节点和负载平衡器使用专用公共子网和专用子网分隔环境。
- 受控访问:使用专用 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
以实现可读性和可维护性。 - Inputs/Outputs and Versioning(输入/输出和版本控制):在
variables.tf
中定义输入,在outputs.tf
中公开输出,并使用 Terraform 模块版本控制(source
中的version
约束条件)实现无缝的数据流和兼容性。 - 编排:在根模块级别处理条件逻辑(如
count
),使子模块专注于其资源。
- 结构和逻辑:封装自包含目录(例如
目录结构:平面与模块
平面模块:单个单片目录,在几个文件中包含所有资源。简单的概念证明,但随着复杂性的增加而变得无法管理。
结构化模块:每个资源组(VCN、OKE、Bastion)都位于自己的模块目录中。根模块负责编排相关项和顶级配置。
示例模块
- VCN 模块 (
modules/vcn
) :- 用途:管理网络(VCN、子网、网关、路由、安全列表等)。
- 密钥文件:
variables.tf
:定义输入,例如vcn_cidr_block
。main.tf
:包含资源定义。outputs.tf
:为其他模块公开 VCN 和子网 ID。
- OKE Module (
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
) :- 提供虚拟云网络 (virtual cloud network,VCN) 和相关子网(例如,Kubernetes API 和 worker 节点的专用子网、负载平衡器和堡垒的公共子网)。
- 由
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 Module (
modules/oke
) :- 部署 OCI Kubernetes 引擎 (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、region、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 端点子 net。workernodes_private_subnet_cidr_block
:Worker 节点子网。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
:云池可获得原生 OCI IP。FLANNEL_OVERLAY
:Pod 从 Flannel 获取 IP。
- 将
control_plane_is_public
设置为true
或false
。
任务 1.4:节点池配置
- 在
node_pools
下定义节点池,其中:- 配置、版本、引导卷大小和 AD 位置(如果适用,请设置 3 个 AD)
- 用于访问池中 worker 节点的 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,它具有关联的网络组件(路由表、安全列表、网关)、用于 worker 节点和 API 端点的专用子网,以及用于负载平衡器的公共子网。
- 具有指定 CNI 类型和 Kubernetes 版本的
ENHANCED_CLUSTER
、托管节点池和堡垒主机(如果已配置)以进行安全 SSH 访问。
任务 1.7:验证
- 导航到 OCI 控制台以验证集群配置。
- 运行
terraform destroy
以在完成后清除资源。
使用 Jenkins CI/CD 管道自动执行 OKE 部署
为了将 OKE 部署集成到 DevOps 管道中,Terraform CLI 是一个很好的选择。我们的方法详见使用 Terraform 创建 Oracle Cloud Infrastructure Kubernetes Engine 集群,它使用 bash 脚本来编排流程。此工作流可以合并到 Jenkins 管道中以实现自动执行。
选项 2:使用 OCI 资源管理器自动执行 OKE
当您需要适用于基础设施部署的托管云原生解决方案时, OCI 资源管理器 (ORM) 是理想的选择。它特别适合协作式企业环境,其中安全性、集中式状态管理和治理至关重要。ORM 的主要优势是能够处理 OCI 中的整个部署生命周期,安全地存储状态文件并防止冲突。这样就无需进行本地设置或管理共享后端。此外,ORM 与 Oracle Cloud 的深度集成使其能够利用 OCI 原生功能(例如身份和访问管理 (IAM)),增强安全性和控制力。
在本教程中,我们将 OCI 资源管理器 (ORM) 与 OCI CLI 和 Bash 相结合,并将其集成到 Jenkins CI/CD 管道中,提供完整的 one-click
自动化流以及额外的 DevOps 功能,例如漂移检测、安全状态管理和团队协作以及版本控制以实现兼容性。
OCI 资源管理器流
下图说明了 ORM 工作流,包括七个步骤:
- 源配置:定义 IaC 配置的源(例如 OCI Object Storage、GitHub、Zip 文件)。
- Terraform 模板:使用 Terraform 定义基础设施。
- OCI 资源管理器:ORM 使用 Terraform 模板并管理预配过程。
- 创建堆栈:ORM 使用该模板创建 OCI 资源堆栈。
- 计划:生成计划,概述要执行的操作。
- 应用:根据计划提供资源。
- 销毁:在不再需要时销毁资源。
要使用 OCI 资源管理器 (ORM) 中的新模块部署 OKE 集群,请首先下载 ORM 的高级模块:oke_advanced_module_orm.zip
。此版本为 ORM 预配置,变量设置为通用占位符,例如 REPLACE_WITH_YOUR_OWN_VARIABLE_VALUE
。
任务 2.1:源配置
使用特定于环境的详细信息(例如区域、网络 CIDR)和用于控制资源创建(VCN、OKE 群集、节点池、堡垒主机)的标志更新 variables.tf
。
以下 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(首席云架构师)、Payal Sharma(高级云架构师)、Matthew McDaniel(员工云工程师)
更多学习资源
通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Deploy Oracle Cloud Infrastructure Kubernetes Engine (OKE) using Advanced Terraform Modules
G44446-01