ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
Oracle Cloud Infrastructure Kubernetes Engineを使用したTerraformでのKubernetesクラスタのデプロイ
イントロダクション
Oracle Cloud Infrastructure Kubernetes Engine(OCI Kubernetes EngineまたはOKE)にTerraformを使用してKubernetesをデプロイすると、クラウドでコンテナ化されたアプリケーションを管理するための合理化されたスケーラブルなアプローチが提供されます。Oracle Cloud InfrastructureのマネージドKubernetesサービスであるOKEは、Kubernetesクラスタのデプロイメント、管理およびスケーリングを簡素化します。
Infrastructure as Code (IaC)ツールであるTerraformを使用すると、OKEクラスタのプロビジョニングおよび構成を自動化して、一貫性と効率性を確保できます。この組み合わせにより、繰り返し可能なデプロイメント、インフラストラクチャのバージョン管理、簡単な更新が可能になり、Oracle Cloud Infrastructureエコシステムの活用を検討しているクラウドネイティブおよびDevOpsに焦点を当てたチームに最適です。
このチュートリアルでは、Terraformを使用して、OCI OKEに非常に固有のKubernetesアーキテクチャをデプロイします。
次のコンポーネントをデプロイします。
- インターネット・ゲートウェイ
- NATゲートウェイ
- サービス・ゲートウェイ
- 7 xサブネット(プライベートおよびパブリック)
- 2つのノード・プール
- 4つのワーカー・ノード(インスタンス)
- 要塞(インスタンス)
- 演算子(インスタンス)
目的
- OKEを使用して、TerraformでKubernetesクラスタをデプロイします。
前提条件
- Terraformを使用してOCIにオブジェクトをデプロイするには、まずTerraformスクリプトを認証および実行するための環境を準備する必要があります。詳細は、タスク2: 認証のための環境の準備およびTerraformスクリプトの実行を参照してください。
タスク1: Terraformスクリプトを使用したリポジトリのクローニング
-
terraform-oci-okeから
terraform-oci-oke
リポジトリをクローニングします。- このチュートリアルを書くとき、最新バージョンは
5.1.8
です。 - 完全なzipファイルを完全なリポジトリでダウンロードするか、
git clone
コマンドを使用してリポジトリをクローニングできます。 - バージョンをクリックして、5.1.8ブランチにアクセスします。
- 5.1.8ブランチにいることに注意してください。
- 「docs」フォルダをクリックします。
- このチュートリアルを書くとき、最新バージョンは
-
srcフォルダをクリックします。
-
SUMMARY.mdファイルをクリックします。
-
「開始」をクリックします。
- まだ5.1.8ブランチにいることに注意してください。他のブランチには、コード・バージョンに応じて異なるタイプのドキュメント・ステップが含まれる場合があります。
- 「開始」ページが表示されており、このページでタイトルの表示内容が正確に行われることに注意してください。
次の出力では、「スタート・ガイド」ページを使用してこのチュートリアルを作成する方法を確認できます。
-
git clone
コマンドを実行して、リポジトリをクローニングします。iwhooge@iwhooge-mac ~ % git clone https://github.com/oracle-terraform-modules/terraform-oci-oke.git tfoke
-
次のコマンドを実行して、フォルダをリポジトリ・フォルダに変更します。
-
次のコマンドを実行して、フォルダのコンテンツをリストします。
-
リポジトリのすべてのファイルを表示できます。
-
このディレクトリ内に、次の内容の
providers.tf
ファイルを作成します。providers.tf
:provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.region tenancy_ocid = var.tenancy_id user_ocid = var.user_id } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.home_region tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "home" }
- 次のコマンドを実行して、フォルダ・コンテンツをリストします。
providers.tf
ファイルが作成されることに注意してください。
-
次のコマンドを実行してTerraformを初期化し、必要なモジュールをアップグレードします。
iwhooge@iwhooge-mac tfoke % terraform init --upgrade
-
「Terraformは正常に初期化されました」というメッセージが表示されます。
-
terraform.tfvars
ファイルを作成するには、次の情報が使用可能であることを確認してください。この情報は、タスク2: 認証のための環境の準備およびTerraformスクリプトの実行のステップを使用して取得できます。テナンシOCID ocid1.tenancy.oc1..aaaaaaaaXXX ユーザーOCID ocid1.user.oc1..aaaaaaaaXXX フィンガープリント 30:XXX 領域 me-abudhabi-1 Private Key Path ~/.oci/4-4-2023-rsa-key.pem コンパートメントのOCID ocid1.compartment.oc1..aaaaaaaaXXX -
このディレクトリ内に、次の内容の
terraform.tfvars
ファイルを作成する必要があります。terraform.tfvars
:# Identity and access parameters api_fingerprint = "30:XXX" api_private_key_path = "~/.oci/4-4-2023-rsa-key.pem" home_region = "me-abudhabi-1" region = "me-abudhabi-1" tenancy_id = "ocid1.tenancy.oc1..aaaaaaaaXXX" user_id = "ocid1.user.oc1..aaaaaaaaXXX" # general oci parameters compartment_id = "ocid1.compartment.oc1..aaaaaaaaXXX" timezone = "Australia/Sydney" # ssh keys ssh_private_key_path = "~/.ssh/id_rsa" ssh_public_key_path = "~/.ssh/id_rsa.pub" # networking create_vcn = true assign_dns = true lockdown_default_seclist = true vcn_cidrs = ["10.0.0.0/16"] vcn_dns_label = "oke" vcn_name = "oke" # Subnets subnets = { bastion = { newbits = 13, netnum = 0, dns_label = "bastion", create="always" } operator = { newbits = 13, netnum = 1, dns_label = "operator", create="always" } cp = { newbits = 13, netnum = 2, dns_label = "cp", create="always" } int_lb = { newbits = 11, netnum = 16, dns_label = "ilb", create="always" } pub_lb = { newbits = 11, netnum = 17, dns_label = "plb", create="always" } workers = { newbits = 2, netnum = 1, dns_label = "workers", create="always" } pods = { newbits = 2, netnum = 2, dns_label = "pods", create="always" } } # bastion create_bastion = true bastion_allowed_cidrs = ["0.0.0.0/0"] bastion_user = "opc" # operator create_operator = true operator_install_k9s = true # iam create_iam_operator_policy = "always" create_iam_resources = true create_iam_tag_namespace = false // true/*false create_iam_defined_tags = false // true/*false tag_namespace = "oke" use_defined_tags = false // true/*false # cluster create_cluster = true cluster_name = "oke" cni_type = "flannel" kubernetes_version = "v1.29.1" pods_cidr = "10.244.0.0/16" services_cidr = "10.96.0.0/16" # Worker pool defaults worker_pool_size = 0 worker_pool_mode = "node-pool" # Worker defaults await_node_readiness = "none" worker_pools = { np1 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 1, boot_volume_size = 50, kubernetes_version = "v1.29.1" } np2 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 3, boot_volume_size = 150, kubernetes_version = "v1.30.1" } } # Security allow_node_port_access = false allow_worker_internet_access = true allow_worker_ssh_access = true control_plane_allowed_cidrs = ["0.0.0.0/0"] control_plane_is_public = false load_balancers = "both" preferred_load_balancer = "public"
- 次のコマンドを実行して、フォルダ・コンテンツをリストします。
terraform.tfvars
ファイルが作成されることに注意してください。
タスク2: Terraform適用の実行および必要なリソース(VCN、サブネットなど)を使用した1つのOKEクラスタの作成
-
次のコマンドを実行して、Terraformを使用してOKEでのKubernetesクラスタ・デプロイメントを計画します。
iwhooge@iwhooge-mac tfoke % terraform plan
- このTerraformコードでは77個のオブジェクトがデプロイされることに注意してください。
terraform apply
コマンドを実行します。
-
次のコマンドを実行して、Terraformを使用してOKEにKubernetesクラスタ・デプロイメントを適用します。
iwhooge@iwhooge-mac tfoke % terraform apply
- このTerraformコードでは77個のオブジェクトがデプロイされることに注意してください。
- デプロイメントを続行するには、
yes
を入力します。
デプロイメントが終了すると、適用が完了したというメッセージが表示されます。
-
参照に必要な有用な情報が提供されている出力に注意してください。
出力:
apiserver_private_host = "10.0.0.22" availability_domains = tomap({ "1" = "cAtJ:ME-ABUDHABI-1-AD-1" }) bastion_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkxxxxxx5chephxjadkxqa2ekxksb5gokj4q" bastion_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaxxxxxxxxxxxy5qm22odw7by37h77ki6cosoqd7pzwq" bastion_public_ip = "129.151.149.237" bastion_subnet_cidr = "10.0.0.0/29" bastion_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxxxxxmyzp6f2czibfr6534evfkt7m2a" cluster_endpoints = tomap({ "kubernetes" = "" "private_endpoint" = "10.0.0.22:6443" "public_endpoint" = "" "vcn_hostname_endpoint" = "cbyedhyevbq.cp.oke.oraclevcn.com:6443" }) cluster_id = "ocid1.cluster.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxx57gz5q26hmpzkbcbyedhyevbq" control_plane_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaavxvgoewcgxxxxxxxxxxxxx6psycdz6zz5gaf6re4kcxa" control_plane_subnet_cidr = "10.0.0.16/29" control_plane_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaajvvpdmuixxxxxxxxxxxjkpx77hqu3v2s4qilnp56a" dynamic_group_ids = tolist([ "ocid1.dynamicgroup.oc1..aaaaaaaafsikvwgexxxxxxxxx5tx2u4c2s2eic4sslwyabva", ]) ig_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaalxxxxxxxxxxxxxxcyzrl2af4ihrkhcjttu2w7aq" int_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaanwppaafc7fyiwcoyhjxxxxxxxxxxxxxxxxx6a6752l7547gxg7ea" int_lb_subnet_cidr = "10.0.2.0/27" int_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaawo5xmcwwbzk3gxxxxxxxxxxxxxxxxxxjjfllbvsdauaq" lpg_all_attributes = {} nat_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaapqn3uqtszdcxxxxxxxxxxxxxxxxxliwveow232xgffigq" operator_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac5exxxxxxxxxxxxxxxxxxxxxxxrfdxsjdfzmq56jja" operator_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaao5kh3z3eaf4zhbtxixxxxxxxxxxxxxxxxxxxxxevyds3cbrjqzthv5ja" operator_private_ip = "10.0.0.14" operator_subnet_cidr = "10.0.0.8/29" operator_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaa6vnirazbox2edmtnxrzhxxxxxxxxxxxxxxxxxxxishk7556iw6zyq" pod_subnet_cidr = "10.0.128.0/18" pod_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaasfnwg3lnyphk5h275r46ksi3xxxxxxxxxxxxxxxxxxxxxxxqz25iwkcinxa" policy_statements = tolist([ "Allow dynamic-group oke-operator-lccwyk to MANAGE clusters in compartment id ocid1.compartment.oc1..aaaaaaaa323ijv54zwkwbz2hhr2nnqoywlpxxxxxxxxxxxxxxxxxxxxxxxtecokaq4h4a", ]) pub_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaae5stez5u26g6x75dy5nf72mfcixxxxxxxxxxxxxxxxxxxxxxxx2nwkwv5nkaa" pub_lb_subnet_cidr = "10.0.2.32/27" pub_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaagr5j2l6tu3rmroejg6t4nrixxxxxxxxxx6oar6xcirvq" ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx" ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14" state_id = "lccwyk" vcn_id = "ocid1.vcn.oc1.me-abudhabi-1.amaaaaaapkbrwsaatndqrw3xq7e7krqfxxxxxxxxxxxxxxxpywz4qvhida" worker_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaazbpfavygiv4xy3khfi7cxunixxxxxxxxxxxxxxxxjvsm6jqtja" worker_pool_ids = { "np1" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaauo57ekyoiiaif25gq7uwrpxxxxxxxxxxxxxxpsnygeam7t2wa" "np2" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaa7423cp6zyntxwxokol3kmdxxxxxxxxxxxxx3wnayv2xq6nyq" } worker_pool_ips = { "np1" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac3t3smjsyxjgen4zqjpxxxxxxxxxxxxx663igu7cznla" = "10.0.90.37" } "np2" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac2eayropnzgazrxxxxxxxxxxxxxxxxpiykrq4r5pbga" = "10.0.125.238" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsace4aup47ukjcedxxxxxxxxxxxxxxxxxx2hdxbsyiitva" = "10.0.92.136" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsacojjri4b7qsaxxxxxxxxxxxxxxxxxnarf75ejv7a2a" = "10.0.111.157" } } worker_subnet_cidr = "10.0.64.0/18" worker_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaarrnazbrmwbiyl3ljmdxhgmxxxxxxxxxxxxxxxxxxxv3wtgmiucnsa" iwhooge@iwhooge-mac tfoke %
タスク3: OCIコンソールでのTerraformデプロイメントの確認
OCIコンソールに移動し、次のTerraformデプロイメントを確認します。
-
OCI Kubernetesエンジン・クラスタ
-
OCIコンソールに移動します。
- 「開発者サービス」に移動し、「Kubernetesクラスタ(OKE)」をクリックします。
- タスク2で作成したoke Kubernetesクラスタをクリックします。
-
下へスクロール
- 「ノード・プール」をクリックします。
- np1ノード・プールをクリックします。
-
下へスクロール
-
np1ノード・プールには1つのワーカー・ノードがあることに注意してください。
-
前のページに移動し、np2ノード・プールをクリックします。
-
下へスクロール
-
np2ノード・プールには3つのワーカー・ノードがあります。
-
-
インスタンス
-
OCIコンソールに移動します。
- 「コンピュート」に移動し、「インスタンス」をクリックします。
- Kubernetesクラスタの4つのワーカー・ノードを確認します。
- Kubernetesクラスタのオペレータを確認します。
- Kubernetesクラスタの要塞ホストを確認します。
-
-
仮想クラウド・ネットワーク
-
OCIコンソールに移動し、「ネットワーキング」、「仮想クラウド・ネットワーク」に移動して、「OK」VCNをクリックします。
-
「サブネット」をクリックすると、Kubernetesクラスタの7つのサブネットがすべて表示されます。
-
次の図は、Terraformスクリプトでこれまでに作成した内容を示しています。
-
タスク4: 要塞および演算子を使用した接続性のチェック
出力には、Terraformデプロイメントが完了したときにKubernetes環境に接続するためのコマンドがいくつかあります。
-
次のコマンドを実行して、要塞ホストに接続します。
ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx"
-
次のコマンドを実行して、要塞ホストを介してKubernetesオペレータに接続します。
ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14"
-
オペレータからKubernetesクラスタを管理します。yesを2回入力し、
kubectl get nodes
コマンドを実行してKubernetesワーカー・ノードを取得します。 -
SSH接続を容易にするには、
~/.ssh/config
ファイルに次のコマンドを追加します。Host bastion47 HostName 129.xxx.xxx.xxx user opc IdentityFile ~/.ssh/id_rsa UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 Host operator47 HostName 10.0.0.14 user opc IdentityFile ~/.ssh/id_rsa ProxyJump bastion47 UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50
~/.ssh/config
ファイルに次のコンテンツを追加すると、SSHコマンドで単純名を使用できます。iwhooge@iwhooge-mac tfoke % ssh operator47
タスク5: Terraformを使用したKubernetesクラスタの削除
-
terraform destroy
コマンドを実行して、OKEでKubernetesクラスタを削除します。iwhooge@iwhooge-mac tfoke % terraform destroy
-
yesと入力します。
破棄プロセスが終了すると、破棄が完了したことを示すメッセージが表示されます。
次のステップ
Terraformを使用してOCI Kubernetes EngineにKubernetesクラスタをデプロイすると、クラウド内のコンテナ化されたアプリケーションを管理するための効率的で自動化されたスケーラブルなソリューションが提供されます。
TerraformのIaC機能を利用することで、Kubernetesクラスタが一貫してデプロイされ、時間の経過とともに簡単にメンテナンスまたは更新できるようになります。
この統合により、プロセスが合理化され、バージョン管理、自動スケーリングおよび繰返し可能なインフラストラクチャ設定が向上します。単一クラスタを管理している場合でも、環境間でスケーリングしている場合でも、このアプローチにより、チームはOracle Cloud Infrastructureで信頼性と簡単さでKubernetesワークロードを管理できます。
承認
- 作成者 - Iwan Hoogendoorn (OCIネットワーク・スペシャリスト)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Deploy a Kubernetes Cluster with Terraform using Oracle Cloud Infrastructure Kubernetes Engine
G18104-01
October 2024