附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用 Oracle Cloud Infrastructure Kubernetes Engine 使用 Terraform 部署 Kubernetes 叢集
簡介
在 Oracle Cloud Infrastructure Kubernetes Engine (OCI Kubernetes 引擎或 OKE) 上部署 Kubernetes 與 Terraform,提供簡化且可擴展的方式來管理雲端中的容器化應用程式。Oracle Cloud Infrastructure 管理的 Kubernetes 服務 OKE 可簡化 Kubernetes 叢集的部署、管理及調整規模。
透過使用 Terraform (基礎架構即程式碼 (IaC) 工具,您可以將 OKE 叢集的佈建和組態自動化,以確保一致性和效率。這個組合允許重複部署、基礎架構版本控制和簡易更新,因此適用於想要運用 Oracle Cloud Infrastructure 生態系統的雲端原生和 DevOps 導向團隊。
在本教學課程中,我們將使用 Terraform 在 OCI OKE 上部署非常具體的 Kubernetes 架構。
我們將部署下列元件:
- 網際網路閘道
- NAT 閘道
- 服務閘道
- 7 x 子網路 (私有與公開)
- 2 x 節點集區
- 4 x 工作節點 (執行處理)
- 堡壘主機 (執行處理)
- 運算子 (執行處理)
目標
- 使用 OKE 在 Terraform 部署 Kubernetes 叢集。
必要條件
- 若要使用 Terraform 在 OCI 上部署物件,您必須先準備環境以進行認證和執行 Terraform 命令檔。如需詳細資訊,請參閱工作 2:準備環境以進行認證並執行 Terraform 命令檔。
作業 1:使用 Terraform 命令檔複製儲存區域
-
從此處複製
terraform-oci-oke
儲存區域: terraform-oci-oke 。- 撰寫此教學課程時,最新版本為
5.1.8
。 - 您可以使用完整的儲存區域下載完整的壓縮檔,或使用
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 區域 阿布達比 -1 私密金鑰路徑 ~/.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、子網路等) 建立一個 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 中建立的開機 Kubernetes 叢集。
-
向下捲動。
- 按一下節點集區。
- 按一下 np1 節點集區。
-
向下捲動。
-
請注意,np1 節點集區中有一個工作節點。
-
移至上一頁,然後按一下 np2 節點集區。
-
向下捲動。
-
請注意,np2 節點集區中有三個工作節點。
-
-
執行處理
-
前往 OCI 主控台。
- 瀏覽至計算,然後按一下例項。
- 複查 Kubernetes 叢集的四個工作者節點。
- 複查 Kubernetes 叢集的操作員。
- 複查 Kubernetes 叢集所屬的堡壘主機主機。
-
-
虛擬雲端網路
-
前往 OCI 主控台,瀏覽至網路、虛擬雲端網路,然後按一下呼叫 VCN。
-
按一下子網路,即可查看 Kubernetes 叢集的所有七個子網路。
-
下圖說明到目前為止,我們已使用 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 兩次,然後執行
kubectl get nodes
命令取得 Kubernetes Worker 節點。 -
若要讓 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
-
輸入是。
毀棄處理作業完成後,您將會見到已完成毀棄的訊息。
接下來的步驟
使用 Terraform 在 OCI Kubernetes 引擎上部署 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
G18108-01
October 2024