Terraformを使用したOracle Cloud Infrastructure Kubernetes Engineクラスタの作成
はじめに
このチュートリアルでは、Terraformを使用してOracle Cloud Infrastructure Kubernetes Engine (OKE)クラスタを作成し、Oracle Resource Managerを使用してTerraformコードを管理する方法を示します。このアプローチにより、Infrastructure as Code (IaC)の原則を実装し、デプロイメントの自動化、一貫性および再現性を高めることができます。
Oracle Cloud Infrastructure Kubernetes Engine(OKE)
Kubernetes (K8s)は、コンテナ化されたアプリケーションのデプロイメント、スケーリングおよび管理を自動化するためのオープン・ソース・プラットフォームです。当初はGoogleによって開発され、現在はCNCFによって維持されており、クラウドネイティブ・アプリケーションを大規模に実行するための業界標準です。
OKEは、Kubernetesクラスタの導入と管理を簡素化する、Oracle Cloud Infrastructure(OCI)上のフルマネージド・サービスです。コントロール・プレーンおよびワーカー・ノード管理を自動化し、OCIのネットワーク、ストレージおよびセキュリティ・サービスと統合し、ステートレス・ワークロードとステートフル・ワークロードの両方をサポートします。OKEノードはノード・プールに編成され、簡単にスケーリングおよび管理できるため、コンテナ化されたアプリケーションの高可用性と最適なリソース使用率を確保できます。OKEは標準のKubernetesモデルに従い、2つの主要コンポーネント(管理コントロール・プレーンと顧客管理データ・プレーン)があります。
-
コントロール・プレーン: Oracleによって完全に管理され、そのコンポーネントはクラスタのオーケストレーションおよび管理を処理します。
kube-apiserver
:クラスタとの通信のための中央API。etcd
:クラスタの構成および状態を格納します。kube-scheduler
:ポッドを適切なノードに割り当てます。kube-controller-manager
:コントローラを管理することで、目的の状態を保証します。cloud-controller-manager
(CCM): OCIと統合して、OCIロード・バランサやOCIブロック・ボリュームなどのクラウド・リソースを管理します。
-
データ・プレーン:顧客テナンシにデプロイされ、実際のワークロードを実行します。次のもので構成されます。
Worker Nodes
:ポッドを実行するコンピュート・インスタンス(お客様がプロビジョニングします)。kubelet
:ポッド実行を管理するノード・エージェント。kube-proxy
:ネットワーク・ルールを処理し、ポッドとの間でトラフィックをルーティングします。
詳細は、「異なる容量タイプでのOCI Kubernetesエンジンの管理と、プリエンプティブル・ノードでの一般的な問題の解決」を参照してください。
アーキテクチャ
次のリファレンス・アーキテクチャを使用して、OKEクラスタの作成を示します。
この図は、複数のフォルト・ドメイン(FD)に分散された単一のOCIリージョン内にデプロイされた自己回復性のあるOKEアーキテクチャを示しています。この設定では、3つの異なるサブネットを持つVirtual Cloud Network (VCN)が特徴です。1つはインターネット・ゲートウェイをホストするパブリック・サブネット(LBSubnet)、もう1つは受信トラフィックを分散するOCIロード・バランサ、もう1つはOKEワーカー・ノード(NodeSubnet)、もう1つはAPIサーバー(APISubnet)の2つのプライベート・サブネットです。ワーカー・ノードは、1つの可用性ドメイン(AD)内の3つのFDに分散され、障害リスクを最小限に抑えます。クラスタは、コンテナ・イメージの格納および取得のためにOCIコンテナ・レジストリにシームレスに接続します。
OCIコンソールは、簡単なPoint-&-Clickメソッドを提供します。これを使用するには、KubernetesクラスタUIに移動します。「クイック作成」を選択します。クラスタに名前を付けます。プライベートAPIエンドポイントを選択します。必要なシェイプ、イメージおよび数で管理対象ワーカー・ノードを構成します。OCIコンソールのオプションによって、拡張OKEクラスタが設定されます。デフォルトであるOCI_VCN_IP_NATIVE
CNIを使用します。また、ワーカー・ノードおよびAPIエンドポイント用の専用プライベート・サブネットも提供します。さらに、ロード・バランサのパブリック・サブネットが作成されます。ただし、この手動アプローチは時間がかかり、大規模または反復可能なデプロイメントではスケーラブルではありません。
手動デプロイメントの制限を克服するために、このチュートリアルでは、3つのステップでOKEクラスタ設定全体を自動化する、簡略化されたフラットなTerraformベースのソリューションを提供します。
- ネットワーク・リソースの作成。
- OKEクラスタのプロビジョニング。
- ワーカー・ノード・プールの作成。
このチュートリアルでは、コアOKEクラスタ・インフラストラクチャのデプロイに焦点を当てます。アプリケーション・レベルのカスタマイズとワークロード固有の構成は、その範囲外です。プロビジョニングを合理化するために、Terraformコマンドの実行を自動化するBashスクリプトが含まれています。これらのスクリプトは、3フェーズのJenkinsパイプラインへのシームレスな統合のために設計されており、OKE環境全体のOne-Click
自動デプロイメントを可能にします。
Terraform CLIとOracle Resource Managerの両方を使用して、ネットワーキング・リソース(VCN、ゲートウェイ、サブネット)、OKEクラスタおよびそのノード・プールの作成を自動化する方法を学習します。また、Bash、OCI CLI、Jenkinsを使用してこの自動化を拡張し、手作業を軽減し、一貫したインフラストラクチャの提供を実現する方法についても説明します。
目的
- Terraform for Infrastructure as Codeを使用してOKEクラスタを作成し、Oracle Resource Managerを使用してデプロイメントを管理するプロセスについて説明します。途中で、基本的なOKEの概念についても説明します。
前提条件
-
初期設定用のOCIテナンシ・ルート管理者ロール。本番ではお薦めしません。
- 必要なネットワーキングおよびOKE OCI IAMポリシーを持つ管理者以外のOCIユーザー。詳細は、クラスタの作成とデプロイメントのためのポリシー構成に関する項を参照してください。
-
Infrastructure as Codeの原則および次のようなTerraform (コミュニティ・バージョン)に精通しています:
- Oracle クラウド・シェル
- Oracle コマンドライン・インターフェース(CLI)、
- Oracle Resource Manager、
- Visual Studio Code
OKEクラスタ作成のためのTerraform自動化
VCN (OKE-VCN
)およびOKEクラスタを作成するには、2つの自動化オプションがあります: 子モジュールを利用するフラット・モジュールまたは標準モジュール。後者のアプローチはこの記事の範囲外ですが、大規模で複雑なデプロイメントの組織性とスケーラビリティが向上し、コードの再利用性とメンテナンス性が促進されるため、本番環境に最適です。開発のユースケース、テスト・シナリオ、または1回かぎりのVCNデプロイメントのデモンストレーションに適した、フラットでシンプルなアプローチを使用します。詳細は、terraform-oci-okeを参照してください。
タスク1: Terraformを使用したOKEリソースのデプロイ(Community Edition)
Terraformコマンドを実行してTerraform CLIを使用してインフラストラクチャを計画およびデプロイする前に、ローカル・マシンから、またはOCI Cloud Shellを使用して、環境固有の詳細を使用して、提供されたTerraform構成を更新します。
完全なTerraformソース・コードは、oke_terraform_for_beginners.zipからダウンロードできます。フラット・ディレクトリ構造を使用しています。パッケージを解凍する場合は、すべてのTerraformテンプレート・ソース・コード(.tf、.tfvars、sshキーなど)がルート・ディレクトリにあることを確認します。
-
Terraformにメイン・リソース(
VCN
、OKE_Cluser
またはNode_Pool
)の作成を指示するには、terraform.tfvars
で適切なフラグ(is_vcn_created
、is_k8cluster_created
またはis_pool_created
)をtrue
に設定する必要があります。次に、ネットワーク、OKEクラスタおよびノード・プールの残りのパラメータをそれぞれのコード・ブロック内に指定します。-
まず、
is_vcn_created
をtrue
に設定して、Terraformに新しいVCNを作成するように指示するか、または既存のVCNを使用するようにfalse
を指定します(OCIDを指定する必要があります)。新しいVCNを作成する場合は、必ずCIDRブロック変数vcn_cidr_block
を指定してください。 -
次の3つのサブネットのCIDRブロックを指定します。
- K8 APIエンドポイント・プライベート・サブネット(
k8apiendpoint_private_subnet_cidr_block
)。 - ワーカー・ノードのプライベート・サブネット(
workernodes_private_subnet_cidr_block
)。 - サービス・ロード・バランサのパブリック・サブネット(
serviceloadbalancers_public_subnet_cidr_block
)。
- K8 APIエンドポイント・プライベート・サブネット(
-
is_k8cluster_created
フラグを設定して、TerraformにKubernetesクラスタの作成を指示し、compartment_id
を使用してターゲット・コンパートメントを指定します。ワーカー・ノード・プールが必要な場合は、それに応じてis_nodepool_created
フラグを設定します。 -
OKEでは、VCNネイティブ(デフォルト)の2つのCNIタイプがサポートされており、各ポッドは、パフォーマンスと完全なOCIネットワーク統合のために独自のIPを取得し、ポッドがノードのVNICを共有するより単純なオーバーレイ・ネットワークであるFlannel-Overlayをサポートしています。この設定では、
cni_type
は、OCIコンソールのクイック作成ワークフローによって作成されたデフォルトのクラスタ構成と一致するようにOCI_VCN_IP_NATIVE
に設定されます。 -
OKEには、「基本」と「拡張」の2つのクラスタ・タイプがあります。柔軟性を高めるために、
cluster_type
をENHANCED_CLUSTER
に設定します。- 拡張クラスタは、アドオン管理、セキュリティの向上、ライフサイクル管理の改善などの高度な機能を提供します。
- 基本クラスタは、重要な機能を備えた簡単なKubernetes環境を提供します
-
ノード・サイクル構成
node_cycle_config
は、特に更新、アップグレードまたは自動スケーリング・イベント中に、ノード・プール内でワーカー・ノードを作成、置換または更新する方法を定義します。構成では、次の属性を定義します。is_node_cycling_enabled (bool):
更新またはアップグレード中のノードの自動サイクリング(置換)を有効にします。安全なノードローテーションを有効にするには、trueに設定します。maximum_surge (int)
:更新中に追加できる追加ノードの最大数(必要な数を超える)。これにより、停止時間なしで古いノードを削除する前に新しいノードを作成できます。maximum_unavailable (int)
:更新中に使用できないノードの最大数。ローリング更新中の中断を制御するために使用されます。cycle_modes (list)
(オプション):ノード・サイクリングのアクションの順序付きリストを提供します。使用可能なサイクル・モードは次のとおりです。REPLACE_BOOT_VOLUME
:ノードを終了せずにブート・ボリュームを更新します。REPLACE_NODES
:更新された構成でノードをコードン、ドレイン、終了および再作成します。
-
-
必要に応じて、デフォルト値を変更します。このパッケージには、環境設定、実行ステップ、およびネットワークとセキュリティに関連する主要な概念に関する明確な手順が含まれています。
次に、ご使用の環境で実行するようにカスタマイズする必要がある
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" } }
-
次のTerraformコマンドを実行します。
terraform init terraform validate terraform plan terraform apply
terraform apply
が正常に実行されると、次の構成を使用して、OKEクラスタが作業コンパートメントおよびリージョンに作成されます:OCI_VCN_IP_NATIVE
cni_type
および指定されたOKEバージョンを持つENHANCED_CLUSTER
。- ワーカー・ノードとAPIエンドポイントの両方の専用プライベート・サブネット。
- クラスタ・サービスにアクセスするためのロード・バランサのパブリック・サブネット。
- 目的のシェイプ、イメージおよびノード数で構成された管理対象ノード・プール。
-
OCIコンソールに移動して、クラスタのデプロイメントおよび構成を確認します。
次の図は、Terraformが正常に実行されたことと、生成されたログを示しています。
-
テストが完了したら、
terraform destroy
を実行して環境をクリーン・アップします。このコマンドは、デプロイメント中に作成されたすべてのOKEリソースを削除し、テナンシでの不要なリソース消費を防止するのに役立ちます。
タスク2: Jenkins CI/CDパイプラインによるTerraform CLI実行の自動化
このタスクでは、Jenkinsによる後のオーケストレーション用に設計された、前述の詳細なステップを4つのプライマリ・ステージに抽象化します。この集計パイプラインは、Terraform CLIコマンドを実行する一連のBashスクリプトを介して実装されます。
タスク2.1: ネットワーキング・リソースの作成
次のスクリプトは、一連の複数のTerraformコマンドを実行してネットワーク・リソースを作成します。
-
Bashスクリプト:
create_network_resources.sh
。#!/bin/bash # Change directory to your working directory cd ~/oke_terraform_for_beginners # Run terraform init (at least once) /usr/local/bin/terraform init # Create the OKE Cluster Network resources (VCN, Gateways, RT, K8 API Endpoint Subnet, Worker Node Subnet and LB subnet) /usr/local/bin/terraform apply \ --var is_vcn_created=true \ # Create OKE Cluster Networking Resources --auto-approve
残りのスクリプトについては、terraform init
がすでに実行されていること、および作業ディレクトリからコマンドを実行していることを確認します。たとえば、~/oke_terraform_for_beginners
です。
タスク2.2: OKEクラスタの作成
このスクリプトは、terraform apply
コマンドを実行してOKEクラスタを作成します。
-
Bashスクリプト:
create_oke_cluster.sh
。#!/bin/bash ..... # Create OKE Cluster (auto-approve - not advised for production) /usr/local/bin/terraform apply \ --var is_vcn_created=true \ # Use the created network --var is_k8cluster_created=false \ # Create a new OKE cluster --auto-approve
タスク 2.3OKEワーカー・ノード・プールの作成
次のスクリプトは、terraform apply
コマンドを実行して、OKEクラスタのワーカー・ノード・プールを作成します。
-
Bashスクリプト:
create_worker_node_pool.sh
#!/bin/bash # Create Worker Node Pool (auto-approve - not advised for production) /usr/local/bin/terraform apply \ --var is_vcn_created=true \ # Use the created network --var is_k8cluster_created=true \ # For the existing OKE cluster --var is_nodepool_created=true \ # Create new Worker Node Pool --auto-approve
タスク2.4: すべてのリソースの破棄
このスクリプトは、destroy
コマンドを実行し、すべてのOKEクラスタ・リソース(ネットワーキング・リソース、OKEクラスタおよびワーカー・ノード・プール)をパージします。
-
Bashスクリプト:
destroy_all_cluster_resources.sh
。#!/bin/bash # Run terraform destroy (for testing purposes only, not for production) /usr/local/bin/terraform destroy --auto-approve
Jenkinsパイプラインのエンドツーエンド・プロセスを自動化し、4つのJenkinsビルド・タスク(タスク2.1、2.2、2.3)に統合しました。この集計済パイプラインは、Terraform CLIコマンドを実行するBashスクリプトを介して実行されます。次のイメージは、最初の3つのタスクのワンクリック自動化を示しています。簡略化のためにdestroy
ステップは含まれていません。
タスク3: Oracle Resource ManagerによるOKEデプロイメントの編成
Oracle Resource Managerのフロー(図):
次の図は、Oracle Resource Managerコード・マネージャを示す7つのステップを示しています。
- ソース構成: OCIのコンパートメント、OCIオブジェクト・ストレージ・バケット、Zipファイル、Bitbucket、GitHubなど、IaC構成の起点を定義します。
- Terraformテンプレート:インフラストラクチャ構成は、テンプレート・ファイルのHashiCorp Terraformを使用して定義されます。
- Oracle Resource Manager: OCI Terraform as a Service製品では、Terraformテンプレートを入力として取得し、インフラストラクチャ・プロビジョニング・プロセスを管理します。
- スタックの作成: Oracle Resource Managerは、テンプレートを使用して、OCIリソースのコレクションであるスタックを作成します。
- 計画:変更を行う前に、Oracle Resource Managerによって計画が生成されます。この計画には、インフラストラクチャのプロビジョニングまたは変更のために実行されるアクションの概要が示されます。
- 適用:計画に基づいて、Oracle Resource Managerは構成を適用し、OCI内で指定されたリソースをプロビジョニングします。
- 破棄: Oracle Resource Managerは、スタックによって以前に作成されたリソースの破棄(プロビジョニング解除)またはパージにも使用できます。
タスク3.1: ソース構成: Oracle Resource Managerスタックの定義
Oracle Resource Managerを使用してOKEクラスタをデプロイするには、最初に使いやすいモジュールoke_terraform_for_beginners_orm.zip
をダウンロードします。フラット・ディレクトリ構造を使用しています。パッケージを解凍する場合は、すべてのTerraformテンプレート・ソース・コード(.tf)がルート・ディレクトリにあることを確認してください。
このバージョンのモジュールは、Oracle Resource Manager用に事前構成されています。terraform.tfvars
は削除され、すべての変数は、variables.tf
の"REPLACE_WITH_YOUR_OWN_VARIABLE_VALUE"のような汎用プレースホルダ値で設定されます。
stack
を作成する前に、リージョン、ネットワーキングCIDRおよびフラグを使用してvariables.tf
を更新し、VCN、OKEクラスタおよびノード・プールの作成を制御します。
OKEクラスタでは、ポッド・ネットワーキングにVCNネイティブCNI (OCI_VCN_IP_NATIVE
)が使用されるため、ポッド・サブネットCIDRを定義するためにcreate_pod_network_subnet
フラグが有効になっていることを確認してください。
Oracle Resource Manager UIでstack
を構成する場合、次を選択してコアOKEリソースの作成を制御できます。
- VCN:
is_vcn_created
を選択します。 - OKEクラスタ:
is_k8cluster_created
を選択します。 - OKEノード・プール:
is_nodepool_created
を選択します。
タスク3.2: Oracle Resource Managerスタックの作成
stack
の作成時に、提供されているTerraformテンプレートを選択し、必要な変数をコンソール内で直接構成します。Oracle Resource Managerは、Terraformファイルに定義されている入力変数を自動的に検出し、簡単に編集できる形式で表示します。この段階では、テナンシOCID、コンパートメントOCID、その他の必要な値など、環境固有の詳細を指定する必要があります。
次の図は、Oracle Cloudコンソールでのstack
の作成および変数構成プロセスを示しています。
タスク3.3: 適用ジョブの実行
わかりやすくするために、Oracle Resource ManagerでApply
を実行すると自動的に実行されるため、Plan
ステップをスキップします。Apply
ジョブを起動することで、Oracle Resource Managerは、前のSource Configuration
ステップで定義された構成を使用して、OCI内で指定されたOKEリソースをプロビジョニングします。
次の図は、stack Apply
ジョブが正常に実行されたことと、生成されたログを示しています。
タスク3.4: 破棄ジョブの実行
アクティビティまたはテストが完了したら、Oracle Resource ManagerでDestroy
ジョブを実行して環境をクリーン・アップできます。このアクションは、OKEクラスタ、ノード・プール、ネットワーキング・コンポーネントおよび関連するサービスを含む、スタックの一部として以前に作成されたすべてのインフラストラクチャ・リソースのプロビジョニング(パージ)をOracle Resource Managerに指示します。Destroy
を実行すると、未使用のリソースが完全に削除されるため、不要なコストを回避し、クリーンなOCIテナンシを維持できます。
次のステップ
Terraformを使用してOKEクラスタをプロビジョニングすると、Oracle Cloud Infrastructure (OCI)でKubernetesインフラストラクチャを管理するための一貫性のある反復可能な自動化されたアプローチが提供されます。Infrastructure as Code(IaC)を使用すると、チームは、クラスタの作成を調整し、ベスト・プラクティスを適用して、CI/CDワークフローをデプロイ・プロセスに統合できます。Oracle Resource Managerは、Terraformの運用を簡素化し、状態を管理し、OCI内でのコラボレーションを可能にすることで、これを強化します。このチュートリアルは初心者向けの概要として役立ち、今後の高度なガイドでは、カスタマイズ可能なモジュール、本番レベルの自動化、モジュラー・アーキテクチャ・パターン、および完全なCI/CD統合について説明します。Kubernetesを大規模に管理するための、よりスケーラブルでセキュア、かつエンタープライズ対応のアプローチに注目してください。
関連リンク
確認
- 著者 - Mahamat Guiagoussou (リード・レジデント・クラウド・アーキテクト)、Payal Sharma (シニア・レジデント・クラウド・アーキテクト)
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Create Oracle Cloud Infrastructure Kubernetes Engine Cluster using Terraform
G38267-01
Copyright ©2025, Oracle and/or its affiliates.