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への送信です。

詳細は、次を参照してください:

開始前

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

要件

1. 必要な情報の収集

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

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

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

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

OCI 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. compute.tfファイルをtf-clusterディレクトリから削除します。
    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. スクリプトの作成

クラスタ、ノード・プールおよび出力の印刷用のスクリプトを作成します。

クラスタの宣言
  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ファイルを保存します。
説明

引数参照(oci_containerengine_cluster)で、必要なすべての引数を検索します。

  • compartment_id
  • kubernetes_version
  • 名前
  • vcn_id
このURLに移動するには

引数参照(oci_containerengine_cluster)にナビゲートするには:

  1. Oracle Cloud Infrastructureプロバイダに移動します。
  2. 左上の「フィルタ」ボックスに、container engineと入力します。

    結果は、データ・ソースとリソースの両方に対して返されます。

  3. 「コンテナ・エンジン」で、「リソース」に移動し、oci_containerengine_clusterを選択します。
  4. 「引数参照」を選択します。

    「引数参照」が開きます。

リソース・ブロックを作成します:

  • キーワード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ブロックおよびKubernetesエンジン(OKE)を参照してください。

    • 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ファイルを保存します。
説明

アラーム参照(oci_containerengine_node_pool)で、必要なすべての引数を検索します。

  • cluster_id
  • compartment_id
  • kubernetes_version
  • 名前
  • node_config_details
    • placement_configs
      • availability_domain
      • subnet_id
  • node_shape
  • node_source_details
    • image_id
    • source_type
このURLに移動するには

アラーム参照(oci_containerengine_node_pool)にナビゲートするには:

  1. Oracle Cloud Infrastructureプロバイダに移動します。
  2. 左上の「フィルタ」ボックスに、container engineと入力します。

    結果は、データ・ソースとリソースの両方に対して返されます。

  3. 「コンテナ・エンジン」で、「リソース」に移動し、oci_containerengine_node_poolを選択します。
  4. 「引数参照」を選択します。

    「引数参照」が開きます。

リソース・ブロックを作成します:

  • キーワード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)thアイテムの場合は[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
    ノート

    トラブルシューティング:
    • terraform initの実行後
    • エラー・メッセージ: Failed to query available provider packages:
      • VPNを使用している場合は、プロキシ設定を確認してください。
これで、ociプロバイダのプラグインを含む.terraformというフォルダが作成されました。
プラン
  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.
適用

Terraformスクリプトを実行します:

terraform apply

確認を求められた場合は、作成するリソースにyesを入力します。

クラスタの作成には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製品を使用した開発の詳細を確認するには、次のサイトを参照してください: