Terraform: Kubernetesクラスタの作成

このチュートリアルでは、Terraformを使用して、Oracle Cloud InfrastructureアカウントにKubernetesクラスタを設定します。

主なタスクは:

  • Terraformの開始チュートリアルから既存のスクリプトをコピーします。
  • 既存のスクリプトを編集して再利用します。
  • Kubernetesクラスタ用の新しいスクリプトを記述します。
Terraformを使用してKubernetesクラスタを作成するために必要なコンポーネントのダイアグラム。ローカルのLinux環境から、ユーザーはOracle Cloud Infrastructureアカウントに接続してクラスタを作成します。クラスタの作成には、ネットワーク・リソースの作成が含まれます。ネットワーク・リソースには、ワーカー・ノード用の1つのプライベート・リージョナル・サブネットが含まれます。これらのノードはコンピュート・ノードです。ロード・バランサに使用するために作成されたパブリック・リージョナル・サブネットもあります。各リージョナル・サブネットは、AD1、AD2およびAD3の3つの可用性ドメインにまたがっています。パブリック・サブネットは、双方向矢印でインターネットに接続されています。プライベート・サブネットには、一方向の送信矢印が2つあり、1つはインターネットへの送信、もう1つはOracle Services Networkへの送信です。

その他の情報については、次のWebサイトを参照してください。

開始する前に

このチュートリアルを正常に実行するには、次が必要です:

要件

1. 必要な情報の収集

ノード・プール内のコンピュート・インスタンスの情報を収集します。

ノード・シェイプの取得
このチュートリアルでは、ノード・プール内のコンピュート・インスタンスにVM.Standard2.1を使用します。
  1. <node-shape>, VM.Standard2.1をメモ帳に保存します。
  2. シェイプの詳細は、VM Standardシェイプを参照してください。
イメージIDの取得
  1. コンソールの上部のナビゲーション・バーで、リージョンを検索します。
  2. Oracle提供のイメージに移動します。
  3. Oracle Linux 7.xをクリックします。
  4. 最新のOracle Linux 7.x-<date>をクリックします。Gen2-GPUというラベルの付いたイメージは選択しないでください
  5. リージョンのイメージOCIDをコピーします。
  6. <image-ocid>をメモ帳に保存します。
    ノート

    OCIDにgovない商用OCIDを選択していることを確認してください。

2. 既存のスクリプトのコピー

Terraform: 単純なインフラストラクチャの設定チュートリアルのスクリプトをコピーします。次に、コンピュート・インスタンスに関連するスクリプトおよび出力を削除します。次の項では、コンピュート・インスタンスを使用してノード・プールを宣言します。

スクリプトのコピー
  1. $HOMEディレクトリにtf-clusterというディレクトリを作成し、そのディレクトリに移動します。
    mkdir tf-cluster
    cd tf-cluster
  2. .tfで終了するすべてのファイルをtf-simple-infrastructureディレクトリからコピーします。
    cp ../tf-simple-infrastructure/*.tf .
  3. ディレクトリに次のファイルがあることを確認します。
    ls
    availability-domains.tf
    compartment.tf
    compute.tf
    outputs.tf
    private-security-list.tf
    private-subnet.tf
    provider.tf
    public-security-list.tf
    public-subnet.tf
    vcn-module.tf
    ノート

    terraform.tfstateおよびterraform.tfstate.backupファイルはコピーしないでください。これらには、配置されているディレクトリ内のリソースの状態が含まれています。新しいディレクトリでスクリプトを実行すると、新しい状態ファイルが取得されます。
関連のないスクリプトの削除
  1. tf-clusterディレクトリからcompute.tfファイルを削除します。
    rm compute.tf
  2. outputs.tfファイルで、コンピュート・インスタンスのすべての出力を削除します。
    
    
    # Outputs for compute instance
    
    output "public-ip-for-compute-instance" {
      value = oci_core_instance.ubuntu_instance.public_ip
    }
    output "instance-name" {
      value = oci_core_instance.ubuntu_instance.display_name
    }
    
    output "instance-OCID" {
      value = oci_core_instance.ubuntu_instance.id
    }
    
    output "instance-region" {
      value = oci_core_instance.ubuntu_instance.region
    }
    
    output "instance-shape" {
      value = oci_core_instance.ubuntu_instance.shape
    }
    
    output "instance-state" {
      value = oci_core_instance.ubuntu_instance.state
    }
    
    output "instance-OCPUs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].ocpus
    }
    
    output "instance-memory-in-GBs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].memory_in_gbs
    }
    
    output "time-created" {
      value = oci_core_instance.ubuntu_instance.time_created
    }

3. スクリプトの作成

3つのスクリプトを作成します: 1つはクラスタ用、もう1つはノード・プール用、もう1つは出力の印刷用です。

クラスタの宣言
  1. cluster.tfというファイルを作成します。
  2. cluster.tfに、次のコードを追加します。
    • <your-cluster-name>を任意の名前に置き換えます。例: tf-cluster
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_cluster
    
    resource "oci_containerengine_cluster" "oke-cluster" {
        # Required
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "<your-cluster-name>"
        vcn_id = module.vcn.vcn_id
    
        # Optional
        options {
            add_ons{
                is_kubernetes_dashboard_enabled = false
                is_tiller_enabled = false
            }
            kubernetes_network_config {
                pods_cidr = "10.244.0.0/16"
                services_cidr = "10.96.0.0/16"
            }
            service_lb_subnet_ids = [oci_core_subnet.vcn-public-subnet.id]
        }  
    }
  3. cluster.tfファイルを保存します。
説明
  • Oracle Cloud Infrastructureプロバイダに移動します。
  • 左側のナビゲーション・フィルタで、container engineと入力します。
  • 「コンテナ・エンジン」で、「リソース」に移動し、「oci_containerengine_cluster」をクリックします。
  • ページのタイトルからリソース・タイプを検索します:
    • タイプ: oci_containerengine_cluster
  • 引数リファレンスの項で、(必須)というラベルの付いたすべての引数(入力)を見つけます
    • compartment_id
    • kubernetes_version
    • name
    • vcn_id
  • リソース・ブロックを作成します:
    • キーワードresourceを使用してリソース・ブロックを宣言します
    • リソース・タイプ"oci_containerengine_cluster"のラベルを追加します
    • ローカルのラベルを追加します(任意):
      • ラベルには、文字、数字、アンダースコア(_)およびハイフン(-)を含めることができます。最初の文字は数字にできません。
      • 例: "oke-cluster"
    • コード・ブロック内で、必要な引数の値を指定します。デフォルト値はありません:
      • compartment_id: compartment.tfで宣言されているコンパートメントを指します: oci_identity_compartment.tf-compartment.id
      • kubernetes_version: このチュートリアルでは、バージョンv1.21.5を使用します。最新バージョンのコンソールで「クイック作成」オプションを選択できます。
      • name: 任意の名前を割り当てます。
      • vcn_id: vcn-module.tfで宣言されているコンパートメントを指します: module.vcn.vcn_id
    • 次のオプションの引数に値を指定して、デフォルト値をオーバーライドします。
      • add_ons: 次の引数にtrueまたはfalseを割り当てます:
        • is_kubernetes_dashboard_enabled
        • is_tiller_enabled
      • kubernetes_network_config: CIDRブロックを次の引数の文字列として割り当てます:
        • pods_cidr
        • services_cidr
        ノート

        ポッドのCIDRブロックは、ワーカー・ノードおよびロード・バランサ・サブネットのCIDRブロックと重複できません

        KubernetesサービスのCIDRブロックは、VCN CIDRブロックと重複できません

        このチュートリアルのサンプル・コードでは、コンソールのクイック作成オプションと同じCIDRブロックを使用します。

        詳細は、CIDRブロックおよびContainer Engine for Kubernetesを参照してください。

      • service_lb_subnet_ids: public-subnet.tfで宣言したパブリック・サブネットを割り当てます
        ノート

        引数service_lb_subnet_idsは、サブネットIDのリストを受け入れます:
        • サブネットが1つある場合でも、大カッコを使用してリストを示します。
        • 例: [oci_core_subnet.vcn-public-subnet.id]
ノード・プールの宣言
  1. node-pool.tfというファイルを作成します。
  2. node-pool.tfに、次のコードを追加します。
    • 次のフィールドを、1項で収集した情報に置き換えます:
      • <node-shape>VM.Standard2.1
      • <image-ocid>
    • 次のフィールドを、クラスタの宣言時に選択した名前に置き換えます:
      • <your-cluster-name>
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_node_pool
    
    resource "oci_containerengine_node_pool" "oke-node-pool" {
        # Required
        cluster_id = oci_containerengine_cluster.oke-cluster.id
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "pool1"
        node_config_details{
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            } 
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[1].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
             placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[2].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
            size = 3
        }
        node_shape = "<node-shape>"
    
        # Using image Oracle-Linux-7.x-<date>
        # Find image OCID for your region from https://docs.oracle.com/iaas/images/ 
        node_source_details {
             image_id = "<image-ocid>"
             source_type = "image"
        }
     
        # Optional
        initial_node_labels {
            key = "name"
            value = "<your-cluster-name>"
        }    
    }
  3. node-pool.tfファイルを保存します。
説明
  • Oracle Cloud Infrastructureプロバイダに移動します。
  • 左側のナビゲーション・フィルタで、container engineと入力します。
  • 「コンテナ・エンジン」で、「リソース」に移動し、「oci_containerengine_node_pool」をクリックします。
  • ページのタイトルからリソース・タイプを検索します:
    • タイプ: oci_containerengine_node_pool
  • 引数リファレンスの項で、(必須)というラベルの付いたすべての引数(入力)を見つけます
    • cluster_id
    • compartment_id
    • kubernetes_version
    • name
    • node_config_details
      • placement_configs
        • availability_domain
        • subnet_id
    • node_shape
    • node_source_details
      • image_id
      • source_type
  • リソース・ブロックを作成します:
    • キーワードresourceを使用してリソース・ブロックを宣言します
    • リソース・タイプのラベルを追加します:
      "oci_containerengine_node_pool"
    • ローカルのラベルを追加します(任意):
      • ラベルには、文字、数字、アンダースコア(_)およびハイフン(-)を含めることができます。最初の文字は数字にできません。例:
        "oke-node-pool"
    • コード・ブロック内で、必要な引数の値を指定します:
      • cluster_id: cluster.tfで宣言されているクラスタを指定します:
        oci_containerengine_cluster.oke-cluster.id
      • compartment_id compartment.tfで宣言されているコンパートメントを指します:
        oci_identity_compartment.tf-compartment.id
      • kubernetes_version: このチュートリアルでは、コンソールのクラスタの作成ウィザードと同じバージョンを使用します。
      • name: 任意の名前を割り当てます。クラスタの作成ウィザードでは、pool1という名前を使用します。
      • node_shape: 1項で収集した情報を入力します。
      • node_source_details:
        • image_id: 1項で収集した情報を入力します。
        • source_type: "image"に設定します。
    • 次のオプションの引数に値を指定して、デフォルト値をオーバーライドします。
      • initial_node_labels: ノードにキー/値のペアを割り当てます。
        • key: 任意のキーを割り当てます。コンソールの「クイック作成」オプションでは、キー"name"が作成されます。
        • value: キーに値を割り当てます。コンソールの「クイック作成」オプションは、"<your-cluster-name>""name"キーに割り当てます。
出力の追加

この項では、クラスタおよびノード・プールの出力を宣言します。

  1. outputs.tfに、次のコードを追加します。
    # Outputs for k8s cluster
    
    output "cluster-name" {
      value = oci_containerengine_cluster.oke-cluster.name
    }
    output "cluster-OCID" {
      value = oci_containerengine_cluster.oke-cluster.id
    }
    output "cluster-kubernetes-version" {
      value = oci_containerengine_cluster.oke-cluster.kubernetes_version
    }
    output "cluster-state" {
      value = oci_containerengine_cluster.oke-cluster.state
    }
    
    # Outputs for k8s node pool
    
    output "node-pool-name" {
      value = oci_containerengine_node_pool.oke-node-pool.name
    }
    output "node-pool-OCID" {
      value = oci_containerengine_node_pool.oke-node-pool.id
    }
    output "node-pool-kubernetes-version" {
      value = oci_containerengine_node_pool.oke-node-pool.kubernetes_version
    }
    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }
    output "node-shape" {
      value = oci_containerengine_node_pool.oke-node-pool.node_shape
    }
  2. outputs.tfファイルを保存します。
説明
リスト・アイテムの出力
  • 通常、リスト属性は複数形(末尾はs)です。
  • ノード・プールリスト属性の例:
    • node_config_details
  • リスト内のすべての属性を出力するには、リスト属性を単独でカッコなしで使用します。
  • 例:
    output "node-configuration-details"{
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details
    }

    サンプル出力:

    node-configuration-details = [
      {
        "placement_configs" = [
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-1"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-2"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-3"
            "subnet_id" = "ocid1.subnet.xxx"
          },
        ]
        "size" = 3
      },
    ]
  • リストからアイテムを出力またはコールするには:
    • 次のフォーマットを使用します:

      <list-attribute-name>[index].<attribute-from-list>

    • [index]を次のように置き換えます:
      • 1つ目のアイテムの場合は[0]
      • 2つ目のアイテムの場合は[1]
      • ...
      • (n+1)個目のアイテムの場合は[n]
  • 例:

    size属性の値:

    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }

4. スクリプトの実行

Terraformスクリプトを実行して、コンパートメント、仮想クラウド・ネットワーク、Kubernetesクラスタおよびノード・プールを作成します。

初期化
  1. tf-clusterディレクトリの作業ディレクトリを初期化します。
    terraform init

    出力例:

    Initializing the backend...
    
    Initializing provider plugins...
    - Finding hashicorp/oci versions matching ">= 4.41.0"...
    - Installing hashicorp/oci v4.59.0...
    - Installed hashicorp/oci v4.59.0 (signed by HashiCorp)
    
    Terraform has been successfully initialized!
  2. tf-clusterディレクトリの内容を確認します。
    ls -a

    これで、ociプロバイダのプラグインを含む.terraformというフォルダが作成されました。

    ノート

    トラブルシューティング:
    • terraform initの実行後
    • エラー・メッセージ: Failed to query available provider packages:
      • VPNを使用している場合は、プロキシ設定を確認してください。
計画
  1. 実行計画を作成します:
    terraform plan
  2. Terraformがアカウントに対して行う予定の変更を確認します。

    出力例:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
    Plan: 14 to add, 0 to change, 0 to destroy.
適用
  1. Terraformスクリプトを実行します:
    terraform apply
  2. 確認を求められた場合は、作成するリソースにyesを入力します。
  3. クラスタの作成には15分以上かかる場合があります。Terraformによってリソースが作成されたら、ターミナルで出力を確認します。
    Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
    
    Outputs:
    ...
    cluster-OCID = ocid1.cluster.xxx
    cluster-kubernetes-version = "v1.21.5"
    cluster-name = <your-cluster-name>
    cluster-state = ACTIVE
    ...
    node-pool-OCID = ocid1.nodepool.xxx
    node-pool-kubernetes-version = "v1.21.5"
    node-pool-name = "pool1"
    node-shape = "VM.Standard2.1"
    node-size = 3
    ...
トラブルシューティング
  • 401エラー - (Service error:NotAuthenticated):
    • 次のいずれかの値が正しくありません:
      • テナンシOCID
      • ユーザーOCID
      • フィンガープリント
      • RSA秘密キー(パスまたはキー)
  • そのようなホストはありません:
    • 次の値が正しくありません:
      • リージョン識別子

参照:

次の手順

完了しました。Terraformを使用して、Oracle Cloud InfrastructureアカウントにKubernetesクラスタが作成されました。

Kubernetesクラスタができたので、Kubernetesチュートリアルを試してみます。

Oracle製品を使用した開発の詳細を確認するには、次のサイトを参照してください: