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つの主要コンポーネント(管理コントロール・プレーンと顧客管理データ・プレーン)があります。

詳細は、「異なる容量タイプでのOCI Kubernetesエンジンの管理と、プリエンプティブル・ノードでの一般的な問題の解決」を参照してください。

アーキテクチャ

次のリファレンス・アーキテクチャを使用して、OKEクラスタの作成を示します。

OKEArchitecture

この図は、複数のフォルト・ドメイン(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クラスタ・インフラストラクチャのデプロイに焦点を当てます。アプリケーション・レベルのカスタマイズとワークロード固有の構成は、その範囲外です。プロビジョニングを合理化するために、Terraformコマンドの実行を自動化するBashスクリプトが含まれています。これらのスクリプトは、3フェーズのJenkinsパイプラインへのシームレスな統合のために設計されており、OKE環境全体のOne-Click自動デプロイメントを可能にします。

Terraform CLIとOracle Resource Managerの両方を使用して、ネットワーキング・リソース(VCN、ゲートウェイ、サブネット)、OKEクラスタおよびそのノード・プールの作成を自動化する方法を学習します。また、Bash、OCI CLI、Jenkinsを使用してこの自動化を拡張し、手作業を軽減し、一貫したインフラストラクチャの提供を実現する方法についても説明します。

目的

前提条件

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キーなど)がルート・ディレクトリにあることを確認します。

  1. Terraformにメイン・リソース(VCNOKE_CluserまたはNode_Pool)の作成を指示するには、terraform.tfvarsで適切なフラグ(is_vcn_createdis_k8cluster_createdまたはis_pool_created)をtrueに設定する必要があります。次に、ネットワーク、OKEクラスタおよびノード・プールの残りのパラメータをそれぞれのコード・ブロック内に指定します。

    1. まず、is_vcn_createdtrueに設定して、Terraformに新しいVCNを作成するように指示するか、または既存のVCNを使用するようにfalseを指定します(OCIDを指定する必要があります)。新しいVCNを作成する場合は、必ずCIDRブロック変数vcn_cidr_blockを指定してください。

    2. 次の3つのサブネットの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では、VCNネイティブ(デフォルト)の2つのCNIタイプがサポートされており、各ポッドは、パフォーマンスと完全なOCIネットワーク統合のために独自のIPを取得し、ポッドがノードのVNICを共有するより単純なオーバーレイ・ネットワークであるFlannel-Overlayをサポートしています。この設定では、cni_typeは、OCIコンソールのクイック作成ワークフローによって作成されたデフォルトのクラスタ構成と一致するようにOCI_VCN_IP_NATIVEに設定されます。

    5. OKEには、「基本」「拡張」の2つのクラスタ・タイプがあります。柔軟性を高めるために、cluster_typeENHANCED_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クラスタが作業コンパートメントおよびリージョンに作成されます:

    • OCI_VCN_IP_NATIVE cni_typeおよび指定されたOKEバージョンを持つENHANCED_CLUSTER
    • ワーカー・ノードとAPIエンドポイントの両方の専用プライベート・サブネット。
    • クラスタ・サービスにアクセスするためのロード・バランサのパブリック・サブネット。
    • 目的のシェイプ、イメージおよびノード数で構成された管理対象ノード・プール。
  4. OCIコンソールに移動して、クラスタのデプロイメントおよび構成を確認します。

    OKECluster

    次の図は、Terraformが正常に実行されたことと、生成されたログを示しています。

    OKETFLogs

  5. テストが完了したら、terraform destroyを実行して環境をクリーン・アップします。このコマンドは、デプロイメント中に作成されたすべてのOKEリソースを削除し、テナンシでの不要なリソース消費を防止するのに役立ちます。

タスク2: Jenkins CI/CDパイプラインによるTerraform CLI実行の自動化

このタスクでは、Jenkinsによる後のオーケストレーション用に設計された、前述の詳細なステップを4つのプライマリ・ステージに抽象化します。この集計パイプラインは、Terraform CLIコマンドを実行する一連のBashスクリプトを介して実装されます。

タスク2.1: ネットワーキング・リソースの作成

次のスクリプトは、一連の複数のTerraformコマンドを実行してネットワーク・リソースを作成します。

残りのスクリプトについては、terraform initがすでに実行されていること、および作業ディレクトリからコマンドを実行していることを確認します。たとえば、~/oke_terraform_for_beginnersです。

タスク2.2: OKEクラスタの作成

このスクリプトは、terraform applyコマンドを実行してOKEクラスタを作成します。

タスク 2.3OKEワーカー・ノード・プールの作成

次のスクリプトは、terraform applyコマンドを実行して、OKEクラスタのワーカー・ノード・プールを作成します。

タスク2.4: すべてのリソースの破棄

このスクリプトは、destroyコマンドを実行し、すべてのOKEクラスタ・リソース(ネットワーキング・リソース、OKEクラスタおよびワーカー・ノード・プール)をパージします。

Jenkinsパイプラインのエンドツーエンド・プロセスを自動化し、4つのJenkinsビルド・タスク(タスク2.1、2.2、2.3)に統合しました。この集計済パイプラインは、Terraform CLIコマンドを実行するBashスクリプトを介して実行されます。次のイメージは、最初の3つのタスクのワンクリック自動化を示しています。簡略化のためにdestroyステップは含まれていません。

OKEArchitecture

タスク3: Oracle Resource ManagerによるOKEデプロイメントの編成

Oracle Resource Managerのフロー(図):

OKEArchitecture

次の図は、Oracle Resource Managerコード・マネージャを示す7つのステップを示しています。

  1. ソース構成: OCIのコンパートメント、OCIオブジェクト・ストレージ・バケット、Zipファイル、Bitbucket、GitHubなど、IaC構成の起点を定義します。
  2. Terraformテンプレート:インフラストラクチャ構成は、テンプレート・ファイルのHashiCorp Terraformを使用して定義されます。
  3. Oracle Resource Manager: OCI Terraform as a Service製品では、Terraformテンプレートを入力として取得し、インフラストラクチャ・プロビジョニング・プロセスを管理します。
  4. スタックの作成: Oracle Resource Managerは、テンプレートを使用して、OCIリソースのコレクションであるスタックを作成します。
  5. 計画:変更を行う前に、Oracle Resource Managerによって計画が生成されます。この計画には、インフラストラクチャのプロビジョニングまたは変更のために実行されるアクションの概要が示されます。
  6. 適用:計画に基づいて、Oracle Resource Managerは構成を適用し、OCI内で指定されたリソースをプロビジョニングします。
  7. 破棄: 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リソースの作成を制御できます。

タスク3.2: Oracle Resource Managerスタックの作成

stackの作成時に、提供されているTerraformテンプレートを選択し、必要な変数をコンソール内で直接構成します。Oracle Resource Managerは、Terraformファイルに定義されている入力変数を自動的に検出し、簡単に編集できる形式で表示します。この段階では、テナンシOCID、コンパートメントOCID、その他の必要な値など、環境固有の詳細を指定する必要があります。

次の図は、Oracle Cloudコンソールでのstackの作成および変数構成プロセスを示しています。

OKEArchitecture

OKEArchitecture

タスク3.3: 適用ジョブの実行

わかりやすくするために、Oracle Resource ManagerでApplyを実行すると自動的に実行されるため、Planステップをスキップします。Applyジョブを起動することで、Oracle Resource Managerは、前のSource Configurationステップで定義された構成を使用して、OCI内で指定されたOKEリソースをプロビジョニングします。

次の図は、stack Applyジョブが正常に実行されたことと、生成されたログを示しています。

OKEArchitecture

OKEArchitecture

タスク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を大規模に管理するための、よりスケーラブルでセキュア、かつエンタープライズ対応のアプローチに注目してください。

確認

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。