OKEクラスタを作成するためのサンプルOpenTofuスクリプト

サンプル・スクリプトにより、次のものが作成されます:

クラスタの新しい仮想クラウド・ネットワーク(VCN)。

セキュリティ・リストが設定された2つのLoadBalancerサブネット。

セキュリティ・リストが設定された3つのワーカー・サブネット。

1つのノード・プールを持つKubernetesクラスタ。

kubectlを使用したアクセスを許可するkubeconfigファイル。

PV使用のためのマウント・ターゲットとFSSベースの2つのファイルシステム(1つはドメイン・ホーム用、もう1つはデータベース・ボリューム用)。

ノードおよびネットワーク設定はSSHアクセスを許可するように構成され、クラスタ・ネットワーキング・ポリシーによってNodePortサービスの公開が許可されます。このクラスタは、テストおよび開発目的でのみ使用できます。提供されているOpenTofuスクリプトのサンプルは、より詳細なレビューを行わないかぎり、本番クラスタの作成には使用しないでください。

すべてのOCIコンテナ・エンジン・マスターは高可用性(HA)を備えており、ロード・バランサが前面に配置されています。

前提条件

OpenTofuスクリプトを使用する前に、次のことを確認してください:

  • 目的のクラスタに十分なコンピュートおよびネットワーキング・リソースを備えた既存のテナンシがあります。
  • OCI Container Engine for Kubernetesサービスがテナンシ・リソースを管理できるように、そのテナンシ内にIdentity and Access Managementポリシーが設定されています。
  • そのテナンシ内にユーザーが定義されています。
  • ここに記載されているように、OCI APIで使用するためにAPIキーが定義されています。
  • クラスタ内のノードへのSSHアクセスを構成するためのSSHキー・ペアがあります。
  • kubectlをインストールします。kubectlバージョンは、コントロール・プレーン・ノードで実行されているkubernetesバージョンの1マイナー・バージョン以内(古いバージョンまたは新しいバージョン)である必要があります。インストール手順については、ここを参照してください。
  • OCI CLIをダウンロード、インストール、構成して使用できるようにしておく必要があります。インストール手順については、ここを参照してください。

oci.props.templateファイルをoci.propsにコピーし、次の必須値をすべて追加します:

  • user.ocid: テナンシ・ユーザーのOCID - OCIコンソールのユーザー設定から取得できます。
  • tfvars.filename: 生成されたtfvarファイルのファイル名。
  • okeclustername: OCI Container Engine for Kubernetesクラスタの名前。
  • tenancy.ocid: ターゲット・テナンシのOCID。
  • region: ターゲット・テナンシのリージョンの名前。
  • compartment.ocid: ターゲット・コンパートメントのOCID。コンパートメントのOCIDを検索するには - https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/contactingsupport_topic-Finding_the_OCID_of_a_Compartment.htm
  • compartment.name: ターゲット・コンパートメントの名前。
  • ociapi.pubkey.fingerprint: OCIユーザーの公開キーのフィンガープリント。
  • ocipk.path: APIキー・ペアの秘密キーへのAPI秘密キー・ローカル・パス。
  • vcn.cidr.prefix: VCN CIDRの接頭辞。サブネットを作成するときに使用します。ターゲット・コンパートメントで、使用可能なCIDRを見つけます。
  • vcn.cidr: VCNのフルCIDR。コンパートメント内で一意である必要があります。最初の2オクテットはvcn_cidr_prefixと一致する必要があります。
  • nodepool.shape: クラスタ・ノードの有効なOCI VMシェイプ。
  • k8s.version: Kubernetesのバージョン。
  • nodepool.ssh.pubkey: SSH公開キー(文字列としてのキー・コンテンツ)。
  • nodepool.imagename: ノード・プール作成用の有効なイメージOCID。イメージのOCIDを検索するには - https://docs.oracle.com/en-us/iaas/Content/ContEng/Reference/contengimagesshapes.htm#images__oke-images
  • tofu.installdir: tofuバイナリをインストールする場所。

ノードのシェイプを変更するオプションのステップ。node-pool.tfを編集します。

node_shape_config {
        #Optional
        memory_in_gbs = 48.0
        ocpus = 4.0
  }

クラスタにノードを追加するためのオプションのステップ(デフォルトでは2つのワーカー・ノードが作成されます)。vcn.tfを変更してワーカー・サブネットを追加します:

resource "oci_core_subnet" "oke-subnet-worker-3" {
  availability_domain = data.oci_identity_availability_domains.ADs.availability_domains[2]["name"]
  cidr_block          = "${var.vcn_cidr_prefix}.12.0/24"
  display_name        = "${var.cluster_name}-WorkerSubnet03"
  dns_label           = "workers03"
  compartment_id      = var.compartment_ocid
  vcn_id              = oci_core_virtual_network.oke-vcn.id
  security_list_ids   = [oci_core_security_list.oke-worker-security-list.id]
  route_table_id      = oci_core_virtual_network.oke-vcn.default_route_table_id
  dhcp_options_id     = oci_core_virtual_network.oke-vcn.default_dhcp_options_id
}

ワーカー・サブネットに対応するegress_security_rulesおよびingress_security_rulesを追加します:

 egress_security_rules {
    destination = "${var.vcn_cidr_prefix}.12.0/24"
    protocol    = "all"
    stateless   = true
  }
  ingress_security_rules {
    stateless = true
    protocol  = "all"
    source    = "${var.vcn_cidr_prefix}.12.0/24"
  }

node-pool.tf subnet_idsを変更して、新しいワーカー・サブネットをプールに追加します。

subnet_ids = [oci_core_subnet.oke-subnet-worker-1.id, oci_core_subnet.oke-subnet-worker-2.id,
        oci_core_subnet.oke-subnet-worker-3.id]

スクリプトを実行するには、次のコマンドを使用します:

$ kubernetes/oke/samples/opentofu/oke.create.sh oci.props

このスクリプトは、oci.propsファイルから値を収集し、次のステップを実行します:

  • 指定されたoci.propsファイルの値に基づいて、新しいtfvarsファイルを作成します。
  • OSシステム(macOSまたはLinux)に基づいて、OpenTofu、OpenTofu OCIプロバイダに必要なすべてのバイナリをダウンロードしてインストールします。
  • 構成を適用し、OpenTofuを使用してOKEクラスタを作成し、oci.propsファイルに定義されているokeclusternameプロパティに基づいてkubeconfigファイルを生成します。

oke.create.shスクリプトの出力。構成にエラーがある場合、出力は次のようになります:

If you ever set or change modules or backend configuration for tofu,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
\u2577
\u2502 Error: Reference to undeclared resource
\u2502 
\u2502   on node-pool.tf line 12, in resource "oci_containerengine_node_pool" "fmw_node_pool":
\u2502   12:   subnet_ids = [oci_core_subnet.oke-subnet-worker-1.id, oci_core_subnet.oke-subnet-worker-2.id, oci_core_subnet.oke-subnet-worker-3.id, oci_core_subnet.oke-subnet-worker-4.id, oci_core_subnet.oke-subnet-worker-5.id]
\u2502 
\u2502 A managed resource "oci_core_subnet" "oke-subnet-worker-5" has not been declared in the root module.
\u2575
\u2577
\u2502 Error: Reference to undeclared resource
\u2502 
\u2502   on node-pool.tf line 12, in resource "oci_containerengine_node_pool" "fmw_node_pool":
\u2502   12:   subnet_ids = [oci_core_subnet.oke-subnet-worker-1.id, oci_core_subnet.oke-subnet-worker-2.id, oci_core_subnet.oke-subnet-worker-3.id, oci_core_subnet.oke-subnet-worker-4.id, oci_core_subnet.oke-subnet-worker-5.id]
\u2502 
\u2502 A managed resource "oci_core_subnet" "oke-subnet-worker-5" has not been declared in the root module.
\u2575

クラスタが正常に作成された場合は、次の出力が表示されます:

cluster_id = "ocid1.cluster.oc1.phx.axxxxxxx.....jlxa"
fmw1_export_path = "/fmw1"
fmw1_fs_ocid = "ocid1.filesystem.oc1.phx.aaaxxxxxx....fuzaaaaa"
fmw2_export_path = "/fmw2"
fmw2_fs_ocid = "ocid1.filesystem.oc1.phx.aaaaxxxxx....xxxxxxaaaa"
fmw_mount_target_ip = "10.1.11.43"
Confirm access to cluster...
NotReady
echo '[ERROR] Some Nodes in the Cluster are not in the Ready Status , sleep 10s more ...
Status is Ready Iter [1/100]
- able to access cluster
okecluster6 cluster is up and running

クラスタにアクセスするには、KUBECONFIG環境変数を設定するか、oci.propsファイルに定義されているokeclusternameプロパティに基づいて生成されたkubeconfigファイルで--kubeconfigオプションを使用します。例: okeclustername6_kubeconfig

$ kubectl get nodes --kubeconfig=okecluster6_kubeconfig
NAME          STATUS   ROLES   AGE     VERSION
10.1.10.2    Ready    node    2d11h   v1.29.1
10.1.11.3    Ready    node    2d11h   v1.29.1

新規ノードを作成後にクラスタに追加するには、vcn.tfファイルおよびnode-pool.tfファイルを変更して、次のコマンドを実行します。

${tofu.installdir}/tofu plan -var-file=<tfvars.filename>
${tofu.installdir}/tofu apply -var-file=<tfvars.filename>

クラスタを削除するには、oke.delete.shスクリプトを実行します。現在のディレクトリからoci.propsファイルを読み取り、クラスタを削除します。

$ kubernetes/oke/samples/opentofu/oke.delete.sh oci.props

Helmfileを使用したOKEクラスタへのSOAのデプロイ

詳細な手順は、OracleSOASuite/helm-charts/README.mdを参照してください。

OCI NFSボリュームの静的プロビジョニング

SOAを使用する場合、ファイル・システムは、domain.storageセクションのvalues.yamlファイルで直接参照できます。例:

storage:
     capacity: 10Gi
     reclaimPolicy: Retain
     type: nfs 
     path: /fmw1   #Export Path
     nfs:
      server: 10.0.10.156 #Mount Target IP Address

DB使用の場合、ファイル・システム(FS)およびマウント・ターゲットIPを使用した永続ボリューム(PV)定義の例を次に示します:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: fmw2-pv-db
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: fss.csi.oraclecloud.com
    volumeHandle: "<OCID of the file system>:<Mount Target IP Address>:/<Export Path>"

作成されたPVをボリュームとして使用するようvalues.yamlファイルのoracledb.persistenceセクションを更新します。例:

   persistence:
     storageClass: ""
     size: 10Gi
     accessMode: "ReadWriteOnce"
     volumeName: "fmw2-pv-db"

ノート:

  • 前述の構成ファイルのvolumeHandleの例:
    volumeHandle:"ocid1.filesystem.oc1.phx.aaaaanoxxxxx....aaaa:10.0.10.156:/fmw2"
  • クラスタが正常に作成されたら、コンソール出力からvolumeHandleの詳細を取得します。
  • OCIでマウント・ターゲットがプロビジョニングされると、Reported Size (GiB)値は非常に大きくなります。OCIコンソールにログインしている場合、これはマウント・ターゲットのページで確認できます。領域要件チェックの結果、使用可能なディスク領域が多すぎると、アプリケーションのインストールに失敗します。OCIコンソールで、マウント・ターゲットの「レポートされたサイズ」パラメータの横にある小さな「鉛筆」アイコンをクリックして、このマウント・ターゲットを介してエクスポートされたファイル・システムによってレポートされる最大容量をギガバイト(GiB)で指定します。この設定では、格納できる実際のデータ量は制限されません。ファイル・システムのレポートされたサイズの設定については、ここを参照してください。