附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特有的值。
使用 Terraform 使用 OKE 在不同的 OCI 區域部署多個 Kubernetes 叢集,並使用 RPC 建立完整網狀網路
簡介
在本教學課程中,我們將說明如何使用 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 建立多個 Kubernetes 叢集,並將在三個不同的國家 (區域) 部署這些叢集。為了加快部署速度,並一致地部署 Kubernetes 叢集,發生的組態錯誤最少,我們將使用 Terraform 和一些自訂的 bash 命令檔。
本教學課程是根據本文件所做的更新:在 Oracle Cloud 上部署多個 Kubernetes 叢集。
目標
- 我們將為本機電腦準備 Oracle Cloud Infrastructure (OCI) 環境中 Terraform 動作的必要工具。我們也會設定 OCI 環境,以驗證來自本機電腦的 Terraform 執行要求,並建立 Terraform 和 Shell 命令檔,以跨不同區域在 OKE 上部署三個 Kubernetes 叢集。我們將在動態路由閘道 (DRG) 上設定遠端對等互連連線 (RPC),以確保叢集間的通訊。
工作 1:決定拓樸 (星體 vs 網狀組織)
我們正在建立這些 Kubernetes 叢集,以部署跨所有區域部署的容器型應用程式。為了允許這些 Kubernetes 叢集之間的通訊,我們需要某種形式的網路通訊。目前,這是本自學課程的範疇,但我們需要事先做一些架構決策。這些決策之一是決定是否允許所有區域間的直接通訊,或者我們想要使用一個區域作為所有通訊的中心,而其他區域則作為軸輻。
星形拓樸:星形拓樸可讓您使用單一集線器區域,在區域之間進行通訊。因此,如果聖荷西的 Kubernetes 叢集想要與杜拜的 Kubernetes 叢集通訊,它將使用阿姆斯特丹作為在途中樞。
網狀拓樸:網狀拓樸可直接與所有區域 (Kubernetes 叢集) 進行通訊。因此,如果聖荷西的 Kubernetes 叢集想要與杜拜的 Kubernetes 叢集通訊,則可以直接進行通訊。
在本教學課程中,我們將建置網格拓樸,此連線將使用 DRG 和 RPC 進行。
作業 2:準備環境以進行認證及執行 Terraform 命令檔
在使用 Terraform 之前,我們需要準備環境。若要使用 Terraform,請開啟終端機。在本教學課程中,我們正在使用 OS X 終端機應用程式。
-
執行下列命令以確認 Terraform 已安裝、新增至您的路徑,以及版本為何。
Last login: Thu Apr 4 08:50:38 on ttys000 iwhooge@iwhooge-mac ~ % terraform -v zsh: command not found: terraform iwhooge@iwhooge-mac ~ %
-
您可以看到找不到指令,這表示未安裝 Terraform,或未將它新增至路徑變數。
如您所見,尚未安裝 Terraform,因此我們需要安裝它。您會注意到,不僅安裝 Terraform,還需要執行多個步驟來部署 Terraform 應用程式,並為我們的完整端對端指令碼解決方案做好環境準備,以便在三個不同的區域部署三個 Kubernetes 叢集。
下列影像提供後續必要作業的指引。
作業 2.1:安裝 Homebrew
Terraform 可以使用不同的方法進行安裝。在本教學課程中,我們將使用 Homebrew 安裝 Terraform。
Homebrew 是 MacOS (和 Linux) 的套裝軟體管理員,可以用來安裝應用程式及其必要的相依性,例如 apt
或 yum
。
-
安裝 Homebrew 。
-
請執行下列命令以安裝 Homebrew。
iwhooge@iwhooge-mac ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ==> Checking for `sudo` access (which may request your password)... Password: ==> This script will install: /opt/homebrew/bin/brew /opt/homebrew/share/doc/homebrew /opt/homebrew/share/man/man1/brew.1 /opt/homebrew/share/zsh/site-functions/_brew /opt/homebrew/etc/bash_completion.d/brew /opt/homebrew ==> The following new directories will be created: /opt/homebrew/Caskroom Press RETURN/ENTER to continue or any other key to abort: ==> /usr/bin/sudo /bin/mkdir -p /opt/homebrew/Caskroom ==> /usr/bin/sudo /bin/chmod ug=rwx /opt/homebrew/Caskroom ==> /usr/bin/sudo /usr/sbin/chown iwhooge /opt/homebrew/Caskroom ==> /usr/bin/sudo /usr/bin/chgrp admin /opt/homebrew/Caskroom ==> /usr/bin/sudo /usr/sbin/chown -R iwhooge:admin /opt/homebrew ==> Downloading and installing Homebrew... remote: Enumerating objects: 8902, done. remote: Counting objects: 100% (4704/4704), done. remote: Compressing objects: 100% (931/931), done. remote: Total 8902 (delta 3862), reused 4508 (delta 3719), pack-reused 4198 Receiving objects: 100% (8902/8902), 4.72 MiB | 11.67 MiB/s, done. Resolving deltas: 100% (5474/5474), completed with 597 local objects. From https://github.com/Homebrew/brew * [new branch] analytics_command_run_test_bot -> origin/analytics_command_run_test_bot * [new branch] brew_runtime_error_restore -> origin/brew_runtime_error_restore * [new branch] bump_skip_repology -> origin/bump_skip_repology * [new branch] bye-byebug -> origin/bye-byebug * [new branch] dependabot/bundler/Library/Homebrew/json_schemer-2.2.1 -> origin/dependabot/bundler/Library/Homebrew/json_schemer-2.2.1 * [new branch] load-internal-cask-json-v3 -> origin/load-internal-cask-json-v3 392cc15a7d..2fe08b139e master -> origin/master * [new branch] neon-proxy-5201 -> origin/neon-proxy-5201 * [new branch] strict-parser -> origin/strict-parser * [new tag] 4.2.10 -> 4.2.10 * [new tag] 4.2.11 -> 4.2.11 * [new tag] 4.2.12 -> 4.2.12 * [new tag] 4.2.13 -> 4.2.13 * [new tag] 4.2.15 -> 4.2.15 * [new tag] 4.2.16 -> 4.2.16 * [new tag] 4.2.7 -> 4.2.7 * [new tag] 4.2.8 -> 4.2.8 * [new tag] 4.2.9 -> 4.2.9 remote: Enumerating objects: 15, done. remote: Counting objects: 100% (9/9), done. remote: Total 15 (delta 9), reused 9 (delta 9), pack-reused 6 Unpacking objects: 100% (15/15), 2.23 KiB | 104.00 KiB/s, done. From https://github.com/Homebrew/brew * [new tag] 4.2.14 -> 4.2.14 Reset branch 'stable' ==> Updating Homebrew... Updated 2 taps (homebrew/core and homebrew/cask). ==> Installation successful! ==> Homebrew has enabled anonymous aggregate formulae and cask analytics. Read the analytics documentation (and how to opt-out) here: https://docs.brew.sh/Analytics No analytics data has been sent yet (nor will any be during this install run). ==> Homebrew is run entirely by unpaid volunteers. Please consider donating: https://github.com/Homebrew/brew#donations ==> Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/iwhooge/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" - Run brew help to get started - Further documentation: https://docs.brew.sh iwhooge@iwhooge-mac ~ %
-
按一下 RETURN/ENTER 以繼續進行安裝。
- 請注意,已順利完成安裝。
- 複製其他指令,將 Homebrew 增加到路徑變數中。
-
-
執行下列指令,將 Homebrew 新增至路徑變數。
iwhooge@iwhooge-mac ~ % (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/iwhooge/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)"
作業 2.2:使用 Homebrew 安裝 Terraform
在這項任務中,我們將使用 Homebrew 來安裝 Terraform 套件。
-
請執行下列指令以安裝 Terraform 套裝軟體。
iwhooge@iwhooge-mac ~ % brew install terraform ==> Downloading https://ghcr.io/v2/homebrew/core/terraform/manifests/1.5.7 ######################################################################### 100.0% ==> Fetching terraform ==> Downloading https://ghcr.io/v2/homebrew/core/terraform/blobs/sha256:f43afa7c ######################################################################### 100.0% ==> Pouring terraform--1.5.7.arm64_sonoma.bottle.tar.gz 🍺 /opt/homebrew/Cellar/terraform/1.5.7: 6 files, 69.7MB ==> Running `brew cleanup terraform`... Disable this behavior by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). iwhooge@iwhooge-mac ~ %
-
執行下列命令以驗證 Terraform 是否已安裝且版本。
iwhooge@iwhooge-mac ~ % terraform -v Terraform v1.5.7 on darwin_arm64 Your version of Terraform is out of date! The latest version is 1.7.5. You can update by downloading from https://www.terraform.io/downloads.html iwhooge@iwhooge-mac ~ %
-
請注意,Homebrew 與 Terraform 版本
1.5.7
一起安裝。 -
請注意,這是舊的版本。若要升級 Terraform 版本,請參閱安裝 Terraform 。
-
若要升級 Terraform,我們需要將 Hashicorp 儲存區域新增至 Homebrew。執行下列命令。
iwhooge@iwhooge-mac ~ % brew tap hashicorp/tap
-
請執行下列命令,從 Hashicorp 儲存區域安裝 Terraform。
iwhooge@iwhooge-mac ~ % brew install hashicorp/tap/terraform terraform 1.5.7 is already installed but outdated (so it will be upgraded). ==> Fetching hashicorp/tap/terraform ==> Downloading https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_d ######################################################################### 100.0% ==> Upgrading hashicorp/tap/terraform 1.5.7 -> 1.7.5 🍺 /opt/homebrew/Cellar/terraform/1.7.5: 3 files, 88.7MB, built in 4 seconds ==> Running `brew cleanup terraform`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). Removing: /opt/homebrew/Cellar/terraform/1.5.7... (6 files, 69.7MB) Removing: /Users/iwhooge/Library/Caches/Homebrew/terraform_bottle_manifest--1.5.7... (9KB) Removing: /Users/iwhooge/Library/Caches/Homebrew/terraform--1.5.7... (19.6MB) iwhooge@iwhooge-mac ~ %
-
請注意,Terraform 正在從
1.5.7
升級至1.7.5
版本。
-
執行下列命令以確認 Terraform 版本為最新版本。
iwhooge@iwhooge-mac ~ % terraform -v Terraform v1.7.5 on darwin_arm64 iwhooge@iwhooge-mac ~ %
-
請注意,新版本為
1.7.5
。
-
作業 2.3:建立 OCI 認證的本機 RSA 金鑰
為了允許使用 API 金鑰與 OCI 進行認證,我們只需要為此目的產生新的私密金鑰和公用金鑰。
-
執行下列命令,將目錄變更為您的本位目錄。
iwhooge@iwhooge-mac ~ % cd ~/
-
執行下列命令以確認您位於您的本位目錄中。
iwhooge@iwhooge-mac ~ % pwd
-
檢查您的本位目錄是否正確。
/Users/iwhooge
-
執行下列命令以建立將包含要與 OCI 進行認證之資訊的新目錄。
iwhooge@iwhooge-mac ~ % mkdir .oci
-
執行下列命令以產生私密 RSA 金鑰。
iwhooge@iwhooge-mac ~ % openssl genrsa -out ~/.oci/4-4-2023-rsa-key.pem 2048 Generating RSA private key, 2048 bit long modulus .........................................................................................................................................+++++ ......+++++ e is 65537 (0x10001)
-
執行下列命令,將私密金鑰檔案設為可讀取。
iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
-
執行下列命令,從私密金鑰產生公開 RSA 金鑰。
iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
-
確認金鑰寫入已完成。
writing RSA key
-
執行下列命令來查看私密 RSA 金鑰的內容。
iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
-
確認專用 RSA 金鑰的內容。
-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo XXX w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI= -----END RSA PRIVATE KEY-----
-
執行下列命令來查看公用 RSA 金鑰的內容。
iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
-
驗證公用 RSA 金鑰的內容。
----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA52+LJ+gp3MAJGtXTeQ/d XXX mtHVtjLM1ftjYlaRSG5Xl/xdKMC8LH0bxpy3XXzLmDrYCP3LrhrIG8Xmuzsji6Hw TQIDAQAB -----END PUBLIC KEY----- iwhooge@iwhooge-mac ~ %
作業 2.4:產生堡壘主機認證的本機 SSH 金鑰
我們也需要建立本機 SSH 金鑰,以與堡壘主機進行認證。這是我們用於 OCI 主控台 (API) 認證的另一個金鑰。
-
執行下列命令,將目錄變更為您的 SSH 目錄。
iwhooge@iwhooge-mac ~ % cd ~/.ssh/
-
執行下列命令以確認您有可使用的公用和專用 SSH 金鑰。
iwhooge@iwhooge-mac .ssh % ls -l -a
-
請注意,我們沒有任何 SSH 金鑰組。在本教學課程中,我們將產生新的 SSH 金鑰組。
total 16 drwx------ 4 iwhooge staff 128 Feb 8 12:48 . drwxr-x---+ 30 iwhooge staff 960 Apr 4 11:03 .. -rw-------@ 1 iwhooge staff 2614 Feb 28 11:49 known_hosts -rw-------@ 1 iwhooge staff 1773 Feb 8 12:48 known_hosts.old
-
執行下列命令以產生新的 SSH 金鑰組。
iwhooge@iwhooge-mac .ssh % ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/Users/iwhooge/.ssh/id_rsa):
-
將密碼詞組保留空白,然後按一下 ENTER 。
Enter passphrase (empty for no passphrase):
-
將密碼詞組保留空白,然後按一下 ENTER 。
Enter same passphrase again:
-
請注意,新的 SSH 金鑰組會儲存在提供的位置。
Your identification has been saved in /Users/iwhooge/.ssh/id_rsa Your public key has been saved in /Users/iwhooge/.ssh/id_rsa.pub The key fingerprint is: SHA256:2E7jD5Cvt0C3pArp+u5Q3BWDBDwfbtxp5T6eez75DPc iwhooge@iwhooge-mac The key's randomart image is: +---[RSA 3072]----+ | ..o..o | | o o o. | | = o.+ | | . .=.++. | | o...=.S | | . . . Xoo | |. o o.*o... | | o . . o+o++ . | |.== . ..o=ooo E | +----[SHA256]-----+ iwhooge@iwhooge-mac .ssh %
作業 2.5:在 OCI 主控台中建立 API 金鑰,然後將公開金鑰新增至您的 OCI 帳戶
-
我們在 Task 2.3 中建立了 RSA 金鑰,可以使用該公用 RSA 金鑰在 OCI 主控台中建立用於 OCI 認證的 API 金鑰。
- 按一下設定檔。
- 選取我的設定檔。
-
向下拉清單。
- 選取 API 金鑰。
- 按一下新增 API 金鑰。
- 選取貼到公開金鑰。
- 貼上在作業 2.3 中建立的公開金鑰。
- 按一下新增。
- 請注意需要貼上產生之 API 認證組態的路徑和檔案。
- 請注意您剛才建立之 API 金鑰的 API 金鑰指紋。
- 請注意 API 驗證組態。
- 按一下複製。
- 按一下關閉。
-
在暫時文字檔中貼上 API 認證組態。
[DEFAULT] user=ocid1.user.oc1..aaaaaaaavgrXXX23aq fingerprint=30:XXX:ba:ee tenancy=ocid1.tenancy.oc1..aaaaaaaabh2XXXvq region=eu-frankfurt-1 key_file=<path to your private keyfile> # TODO
-
更新 API 認證組態的最後一行,並新增在 Task 2.3 中建立之私密金鑰檔案的正確路徑。
[DEFAULT] user=ocid1.user.oc1..aaaaaaaavgxxxXX23aq fingerprint=30:XXX:ba:ee tenancy=ocid1.tenancy.oc1..aaaaaaaabh2XXXvq region=eu-frankfurt-1 key_file=~/.oci/4-4-2023-rsa-key.pem
-
建立 OCI API 認證組態檔。
iwhooge@iwhooge-mac ~ % nano ~/.oci/config iwhooge@iwhooge-mac ~ %
-
複製檔案中的 API 驗證組態。使用
CTRL + X
結束此檔案。 -
輸入 Y (是) 以儲存檔案。
-
確認您要用來儲存 API 認證組態的檔案。
-
順利儲存檔案後,您將返回終端機提示。
作業 2.6:收集您 OCI 環境的必要資訊
我們需要收集一些 Terraform 檔案資訊,以便使用 API 進行 OCI 認證。在任務 2.5 中建立的 API 驗證組態檔中已提供大部分的資訊。
-
儲存下列資訊以供日後使用。
租用戶 OCID ocid1.tenancy.oc1..aaaaaaaabh2XXXvq 使用者 OCID ocid1.user.oc1..aaaaaaaavgrXXX23aq 指紋 30:XXX:ba:ee 區域 eu-frankfurt-1 線上手冊 私密金鑰路徑 ~/.oci/4-4-2023-rsa-key.pem 區間 OCID ocid1.compartment.oc1..aaaaaaaabgXXXnuq -
我們唯一需要的條件不在 API 認證組態檔中,就是區間 OCID。
-
若要取得區間 OCID,請瀏覽至識別、區間、區間詳細資訊。
-
您可以查看區間 OCID。
-
按一下複製即可複製區間 OCID。儲存以供稍後使用。
-
這是您將在其中部署 Kubernetes 叢集的區間。
工作 3:建立 Terraform 命令檔和檔案
我們已完成本機機器的準備工作,包括設定 Terraform、RSA 和 SSH 金鑰、設定 OCI 環境 (API),以及收集與 OCI 認證 Terraform 所需的所有必要資訊。現在請建立 Terraform 命令檔。
首先,我們必須確認已訂閱正在部署 Kubernetes 叢集的區域。如果部署至未訂閱的區域,將會發生認證錯誤,部署將會失敗。
本教學課程使用下列三個區域進行部署:阿姆斯特丹、聖荷西及杜拜。
-
按一下區域選取功能表。
- 向下拉清單。
- 按一下管理區域。
- 向下拉清單。
- 按一下窄即可查看接下來的 10 個項目。
- 請注意,我們已訂閱阿姆斯特丹。
- 按一下窄即可查看接下來的 10 個項目。
- 請注意,我們已訂閱杜拜。
- 請注意,我們已訂閱聖荷西。
- 按一下窄即可查看接下來的 10 個項目。
-
請注意,我們有一些未訂閱的區域。例如,如果我們想要將其中一個 Kubernetes 叢集部署至 Bogota,則必須先訂閱 Bogota 區域。
-
下圖說明我們嘗試使用 Terraform 達成的目標。
- 我們正在將遠端電腦與 Terraform 搭配使用。
- 此遠端電腦將使用 OCI 進行認證。
- 認證之後,我們將使用 Terraform 使用 OKE 部署下列三個 Kubernetes 叢集。
- c1:阿姆斯特丹
- c2:聖荷西
- c3:杜拜
我們使用 c1、c2 和 c3 別名讓 OCI 中的元件命名變得更容易,因此能夠更輕鬆地根據名稱來辨識叢集,而不是根據唯一產生的名稱。
-
執行下列命令以確定您位於您的本位目錄中
iwhooge@iwhooge-mac ~ % pwd /Users/iwhooge
-
執行下列指令,在
terraform-multi-oke
目錄內建立名為terraform-multi-oke
和scripts
目錄的新目錄。iwhooge@iwhooge-mac ~ % mkdir terraform-multi-oke iwhooge@iwhooge-mac ~ % mkdir terraform-multi-oke/scripts
-
執行下列命令以確認
terraform-multi-oke
目錄已建立。iwhooge@iwhooge-mac ~ % ls -l total 0 drwx------@ 5 iwhooge staff 160 Jan 2 06:25 Applications drwx------+ 4 iwhooge staff 128 Mar 27 08:15 Desktop drwx------@ 10 iwhooge staff 320 Mar 29 08:39 Documents drwx------@ 90 iwhooge staff 2880 Apr 3 14:16 Downloads drwx------@ 93 iwhooge staff 2976 Mar 16 15:49 Library drwx------ 5 iwhooge staff 160 Feb 14 08:18 Movies drwx------+ 4 iwhooge staff 128 Feb 21 20:00 Music drwxr-xr-x@ 6 iwhooge staff 192 Feb 9 08:36 Oracle Content drwx------+ 7 iwhooge staff 224 Feb 28 12:03 Pictures drwxr-xr-x+ 4 iwhooge staff 128 Dec 30 16:31 Public drwxr-xr-x 2 iwhooge staff 64 Apr 4 12:39 terraform-multi-oke
-
執行下列命令來變更新
terraform-multi-oke
目錄的路徑,並確定目錄是空的。iwhooge@iwhooge-mac ~ % cd terraform-multi-oke iwhooge@iwhooge-mac terraform-multi-oke % ls -l total 0 iwhooge@iwhooge-mac terraform-multi-oke %
-
在
terraform-multi-oke
和terraform-multi-oke/scripts
目錄中建立檔案。檔案與資料夾結構應如下所示。iwhooge@iwhooge-mac terraform-multi-oke % tree . ├── c1.tf ├── c2.tf ├── c3.tf ├── contexts.tf ├── locals.tf ├── outputs.tf ├── providers.tf ├── scripts │ ├── cloud-init.sh │ ├── generate_kubeconfig.template.sh │ ├── kubeconfig_set_credentials.template.sh │ ├── set_alias.template.sh │ └── token_helper.template.sh ├── templates.tf ├── terraform.tfstate ├── terraform.tfstate.backup ├── terraform.tfvars ├── variables.tf └── versions.tf
注意:您也可以從 GitHub 儲存區域下載檔案: oci-oke-terraform 。
-
使用任務 2.6 中收集的參數更新
terraform.tfvars
檔案。# ===================================================================== # START - UPDATE THIS SECTION WITH OWN PARAMETERS # provider api_fingerprint = "<use your own API fingerprint>" api_private_key_path = "<use your own OCI RSA private key path>" home_region = "<use your own home region>" # Use short form e.g. Ashburn from location column https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm tenancy_id = "<use your own Tenancy OCID>" user_id = "<use your own User OCID>" compartment_id = "<use your own Compartement OCID>" # ssh ssh_private_key_path = "<use your own SSH private key path>" ssh_public_key_path = "<use your own SSH public key path>" # END - UPDATE THIS SECTION WITH OWN PARAMETERS # =====================================================================
-
如果您想要部署較少或更多的 Kubernetes 叢集,或者想要變更區域,也可以透過更改
terraform.tfvars
、contexts.tf
和providers.tf
檔案中的區域來執行此操作。尋找 c1、c2 和 c3 並進行變更。-
terraform.tfvars
(在此處新增或移除叢集,請確定何時新增叢集,使用唯一的 CIDR 區塊)。clusters = { c1 = { region = "amsterdam", vcn = "10.1.0.0/16", pods = "10.201.0.0/16", services = "10.101.0.0/16", enabled = true } c2 = { region = "bogota", vcn = "10.2.0.0/16", pods = "10.202.0.0/16", services = "10.102.0.0/16", enabled = true } c3 = { region = "sanjose", vcn = "10.3.0.0/16", pods = "10.203.0.0/16", services = "10.103.0.0/16", enabled = true } }
-
contexts.tf
(在depends_on
參數中新增或移除叢集)。resource "null_resource" "set_contexts" { depends_on = [module.c1, module.c2, module.c3] for_each = local.all_cluster_ids connection { host = local.operator_ip private_key = file(var.ssh_private_key_path) timeout = "40m" type = "ssh" user = "opc" bastion_host = local.bastion_ip bastion_user = "opc" bastion_private_key = file(var.ssh_private_key_path) }
-
providers.tf
(以提供者身分新增或移除叢集,確定您更改區域和別名參數)。provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = lookup(local.regions,var.home_region) tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "home" ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"] } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = lookup(local.regions,lookup(lookup(var.clusters,"c1"),"region")) tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "c1" ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"] } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = lookup(local.regions,lookup(lookup(var.clusters,"c2"),"region")) tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "c2" ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"] } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = lookup(local.regions,lookup(lookup(var.clusters,"c3"),"region")) tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "c3" ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"] }
注意:您也可以從 GitHub 儲存區域下載檔案: oci-oke-terraform 。
-
作業 4:執行 Terraform 和 OKE 叢集,以及必要的資源 (VCN、子網路、DRG、RPC 等等)
我們使用正確的參數來安裝 Terraform 命令檔。現在,請執行命令檔,並建立由三個不同區域中的三個 Kubernetes 叢集組成的環境。
-
執行下列命令,將目錄變更為
terraform-multi-oke
目錄。Last login: Fri Apr 5 09:01:47 on ttys001 iwhooge@iwhooge-mac ~ % cd terraform-multi-oke
-
執行
terraform init
命令以起始 Terraform 並下載必要的 Terraform 模組以部署 Terraform 命令檔。確定 Terraform 已順利起始。
-
執行
terraform plan
命令來規劃 Terraform,以執行預先檢查您的 Terraform 程式碼是否有效,並驗證將部署的項目 (這還不是實際部署)。 -
請注意,Terraform 將在 OCI 中新增 229 個新資源,這些物件全都與規劃部署的三個 Kubernetes 叢集相關。
-
執行
terraform apply
命令以套用 Terraform 並部署三個 Kubernetes 叢集。 -
輸入 yes 即可核准建置。Terraform 指令碼大約需要 30 分鐘的時間才能完成。
- 請注意,套用已完成並新增 229 個新資源。
- 複製 SSH 命令輸出,以存取 Kubernetes 叢集管理作業的堡壘主機和操作員主機。
-
下圖說明使用 Terraform 的目前部署。
-
執行 SSH 命令以登入 Kubernetes 操作員主機。
iwhooge@iwhooge-mac terraform-multi-oke % ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@143.47.183.243' -i ~/.ssh/id_rsa opc@10.1.0.12 The authenticity of host '143.47.183.243 (143.47.183.243)' can't be established. ED25519 key fingerprint is SHA256:hMVDzms+n0nEmsh/rTe0Y/MLSSSk6OKMSipoVlQyNfU. This key is not known by any other names.
-
輸入 yes 即可繼續處理堡壘主機。
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '143.47.183.243' (ED25519) to the list of known hosts. The authenticity of host '10.1.0.12 (<no hostip for proxy command>)' can't be established. ED25519 key fingerprint is SHA256:AIUmsHHGONNxuJsnCDDSyPCrJyoJPKYgdODX3qGe0Tw. This key is not known by any other names.
-
輸入 yes 即可為操作員主機繼續作業。
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.1.0.12' (ED25519) to the list of known hosts. Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Apr 5 07:31:38 2024 from 10.1.0.2
-
請注意,您現在已經登入操作員。
-
-
執行下列命令,以驗證從操作員主機部署並執行 Kubernetes 叢集。
[opc@o-tmcntm ~]$ kubectx c1 c2 c3 [opc@o-tmcntm ~]$
下圖說明您從何處設定堡壘主機的 SSH 連線,以及從堡壘主機到操作員主機。
現在,我們在不同的區域部署了三個 Kubernetes 叢集。查看 OCI 主控台中高階部署的資源。
-
OCI 主控台驗證 (阿姆斯特丹) 。
- 選取阿姆斯特丹作為區域。
- 瀏覽至網路和 VCN 。
- 檢閱此處建立的 c1 VCN。
- 瀏覽至開發人員服務和 Kubernetes 叢集 (OKE) 。
- 檢閱此處建立 c1 Kubernetes 叢集。
- 瀏覽至運算和執行處理。
- 請複查此處建立屬於 c1 Kubernetes 叢集的堡壘主機和兩個工作節點。
- 導覽至網路、客戶連線及動態路由閘道。
- 請複查此處已建立 DRG。
- 瀏覽至識別和原則。
- 請複查此處建立三個識別原則。
-
OCI 主控台驗證 (聖荷西) 。
- 選取 San Jose 作為區域。
- 瀏覽至網路和 VCN 。
- 檢閱此處建立的 c2 VCN。
- 瀏覽至開發人員服務和 Kubernetes 叢集 (OKE) 。
- 檢閱此處建立 c2 Kubernetes 叢集。
- 瀏覽至運算和執行處理。
- 請複查此處建立屬於 c2 Kubernetes 叢集的兩個工作節點。
- 導覽至網路、客戶連線及動態路由閘道。
- 請複查此處已建立 DRG。
- 瀏覽至識別和原則。
- 請複查此處建立三個識別原則。
-
OCI 主控台驗證 (杜拜)
- 選取 Dubai 作為區域。
- 瀏覽至網路和 VCN 。
- 檢閱此處建立的 c3 VCN。
- 瀏覽至開發人員服務和 Kubernetes 叢集 (OKE) 。
- 檢閱此處建立 c3 Kubernetes 叢集。
- 瀏覽至運算和執行處理。
- 請複查此處建立屬於 c3 Kubernetes 叢集的兩個工作節點。
- 導覽至網路、客戶連線及動態路由閘道。
- 請複查此處已建立 DRG。
- 瀏覽至識別和原則。
- 請複查此處建立三個識別原則。
作業 5:建立 RPC 連線
建立各種 RPC 附件之間的連線。讓我們先在不同的區域複查這些項目。
-
阿姆斯特丹中的遠端對等互連連線附件。
請確定您已連線至阿姆斯特丹區域。
- 導覽至網路、客戶連線、動態路由閘道及 c1 。
- 按一下遠端對等互連連線附件。
- 請注意,已設定兩個遠端對等連線附件。
- 請注意,遠端對等互連連線連附項都是新的,而不是對等互連。
-
聖荷西中的遠端對等互連連線附件。
請確定您已連線至聖荷西區域。
- 導覽至網路、客戶連線、動態路由閘道及 c2 。
- 按一下遠端對等互連連線附件。
- 請注意,已設定兩個遠端對等連線附件。
- 請注意,遠端對等互連連線連附項都是新的,而不是對等互連。
-
杜拜中的遠端對等互連連線附件。
請確定您已連線至 Dubai 區域。
- 導覽至網路、客戶連線、動態路由閘道及 c3 。
- 按一下遠端對等互連連線附件。
- 請注意,已設定兩個遠端對等連線附件。
- 請注意,遠端對等互連連線連附項都是新的,而不是對等互連。
收集所有 RPC OCID
-
若要設定所有區域之間的 RPC 對等互連連線,我們必須收集這些 RPC 對等互連連線連附項的 OCID。
- 請確定您已連線至阿姆斯特丹區域。
- 導覽至網路、客戶連線、動態路由閘道及 c1 。
- 按一下遠端對等互連連線附件。
- 按一下遠端對等互連連線 (
rpc-to-c2
)。
-
按一下顯示。
-
按一下複製。
針對所有 DRG 上所有區域上的所有遠端對等互連連線重複此程序並加以儲存。
現在我們收集了下列遠端對等互連連線 OCID:
-
c1 DRG RPC
本地 RPC 本機 RPC OCID 遠端 RPC C1:rpc-to-c2 ocid1.remotepeeringconnection.oc1.eu-amsterdam-1.aaaaaxxxxxxuxfq C2:rpc-to-c1 C1:rpc-to-c3 ocid1.remotepeeringconnection.oc1.eu-amsterdam-1.aaaaaaaxxxxxXs4ya C3:rpc-to-c1 -
c2 DRG RPC
本地 RPC 本機 RPC OCID 遠端 RPC C2:rpc-to-c1 ocid1.remotepeeringconnection.oc1.us-sanjose-1.aaaaaaaxxxxXXXvmya C1:rpc-to-c2 C2:rpc-to-c3 ocid1.remotepeeringconnection.oc1.us-sanjose-1.aaaaaaaaxxxxXXen2a C3:rpc-to-c2 -
c3 DRG RPC
本地 RPC 本機 RPC OCID 遠端 RPC C3:rpc-to-c1 ocid1.remotepeeringconnection.oc1.me-dubai-1.aaaaaaaapxxxXXXcosq C1:rpc-to-c3 C3:rpc-to-c2 ocid1.remotepeeringconnection.oc1.me-dubai-1.aaaaaaaaxxxpXXXs5tq C2:rpc-to-c3
建立 RPC 對等
設定 C1 到 C2 和 C3 的對等互連。這會自動設定 C2 和 C3 端的 C1 對等互連,並將 C2 上的對等互連設定為 C3 會自動設定 C3 端的 C2 對等互連。
設定 C1 對等 (阿姆斯特丹) 。
-
下列影像顯示正在設定的 RPC。
- 請確定您已連線至阿姆斯特丹區域。
- 導覽至網路、客戶連線、動態路由閘道及 c1 。
- 按一下遠端對等互連連線附件。
- 按一下第一個遠端對等互連連線連附項 (
rpc-to-c2
)。這裡讓您設定與聖荷西的連線 。
-
按一下建立連線。
- 選取 San Jose 區域。
- 輸入為 c1 (阿姆斯特丹) 建立之 San Jose 端的 RPC OCID。
- 按一下建立連線。
- 對等互連狀態將會變更為擱置中,而且需要一分鐘的時間才能完成。
- 按一下第二個遠端對等互連連線連附項 (
rpc-to-c3
)。在這裡您可以設定到杜拜的連線 。
-
按一下建立連線。
- 選取 Dubai 區域。
- 輸入為 c1 (阿姆斯特丹) 建立之杜拜端的 RPC OCID。
- 按一下建立連線。
設定 C2 對等互連 (聖荷西) 。
-
下列影像顯示正在設定的 RPC。
- 對等互連狀態將會變更為擱置中,而且需要一分鐘的時間才能完成。
- 按一下區域功能表,然後從阿姆斯特丹切換至聖荷西區域。
- 選取聖荷西區域。
- 導覽至網路、客戶連線、動態路由閘道及 c2 。
- 按一下遠端對等互連連線附件。
- 請注意,阿姆斯特丹與聖荷西之間的連接現在已對等。這是從阿姆斯特丹的邊完成。
- 請注意,從聖荷西 (c2) 到杜拜 (c3) 的對等互連狀態仍然是新的。
- 按一下第二個遠端對等互連連線連附項 (
rpc-to-c3
)。在這裡您可以設定到杜拜的連線 。
-
按一下建立連線。
- 選取 Dubai 區域。
- 輸入為 c2 (聖荷西) 建立之杜拜端的 RPC OCID。
- 按一下建立連線。
-
對等互連狀態將會變更為擱置中,而且需要一分鐘的時間才能完成。
下圖說明我們已完成的完整網格 RPC 對等互連。
-
驗證連線對等互連。
- 請確定您已連線至聖荷西區域。
- 導覽至網路、客戶連線、動態路由閘道及 c1 。
- 按一下遠端對等互連連線附件。
- 請注意,兩個遠端對等互連連線連附項都具有對等互連狀態。
- 請確定您已連線至聖荷西區域。
- 導覽至網路、客戶連線、動態路由閘道及 c2 。
- 按一下遠端對等互連連線附件。
- 請注意,兩個遠端對等互連連線連附項都具有對等互連狀態。
- 請確定您已連線至 Dubai 區域。
- 導覽至網路、客戶連線、動態路由閘道及 c3 。
- 按一下遠端對等互連連線附件。
- 請注意,兩個遠端對等互連連線連附項都具有對等互連狀態。
作業 6:使用網路視覺化程式來驗證 RPC 連線
執行額外的檢查,以確保已使用「網路視覺化程式」正確設定 RPC。
- 按一下左上角的漢堡功能表。
- 按一下網路。
- 按一下網路視覺化程式。
- 請確定您已連線至阿姆斯特丹區域。
- 請注意,阿姆斯特丹區域為 c1。
- 請注意從阿姆斯特丹到聖荷西和杜拜的連線。
- 請確定您已連線至聖荷西區域。
- 請注意,San Jose 區域為 c2。
- 請注意從聖荷西到阿姆斯特丹和杜拜的連線。
- 請確定您已連線至 Dubai 區域。
- 請注意,杜拜地區是 c3。
- 請注意從杜拜到阿姆斯特丹和聖荷西的連線。
工作 7:使用堡壘主機和運算子檢查連線工作
我們建立了 Kubernetes 叢集 (在所有三個不同的區域上),並使用 RPC 連接區域。我們現在可以使用操作員主機來驗證操作員是否可以管理 Kubernetes 叢集。
-
執行下列指令 (在完成
terraform plan
指令之後提供)。Last login: Fri Apr 5 09:10:01 on ttys000 iwhooge@iwhooge-mac ~ % ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@143.47.183.243' -i ~/.ssh/id_rsa opc@10.1.0.12 Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Apr 5 07:34:13 2024 from 10.1.0.2 [opc@o-tmcntm ~]$
-
執行下列命令,以便使用 for 迴圈重複執行每個 Kubernetes 叢集 (c1、c2 和 c3),並擷取工作節點的狀態。
[opc@o-tmcntm ~]$ for c in c1 c2 c3; do > kubectx $c > kubectl get nodes > done Switched to context "c1". NAME STATUS ROLES AGE VERSION 10.1.113.144 Ready node 76m v1.28.2 10.1.125.54 Ready node 76m v1.28.2 Switched to context "c2". NAME STATUS ROLES AGE VERSION 10.2.65.174 Ready node 78m v1.28.2 10.2.98.54 Ready node 78m v1.28.2 Switched to context "c3". NAME STATUS ROLES AGE VERSION 10.3.118.212 Ready node 73m v1.28.2 10.3.127.119 Ready node 73m v1.28.2 [opc@o-tmcntm ~]$
連接至操作員主機後,在終端機中執行下列指令。
for c in c1 c2 c3; do kubectx $c kubectl get nodes done
-
請注意,所有使用 Terraform 命令檔部署之 Kubernetes 叢集的所有節點輸出。
以 for 迴圈執行 kubectl get all -n kube-system
指令。
[opc@o-tmcntm ~]$ for c in c1 c2 c3; do
> kubectx $c
> kubectl get all -n kube-system
> done
Switched to context "c1".
NAME READY STATUS RESTARTS AGE
pod/coredns-844b4886f-8b4k6 1/1 Running 0 118m
pod/coredns-844b4886f-g8gbm 1/1 Running 0 122m
pod/csi-oci-node-5xzdg 1/1 Running 0 119m
pod/csi-oci-node-nsdg4 1/1 Running 1 (118m ago) 119m
pod/kube-dns-autoscaler-74f78468bf-l9644 1/1 Running 0 122m
pod/kube-flannel-ds-5hsp7 1/1 Running 0 119m
pod/kube-flannel-ds-wk7xl 1/1 Running 0 119m
pod/kube-proxy-gpvv2 1/1 Running 0 119m
pod/kube-proxy-vgtf7 1/1 Running 0 119m
pod/proxymux-client-nt59j 1/1 Running 0 119m
pod/proxymux-client-slk9j 1/1 Running 0 119m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.101.5.5 <none> 53/UDP,53/TCP,9153/TCP 122m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/csi-oci-node 2 2 2 2 2 <none> 122m
daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 122m
daemonset.apps/kube-proxy 2 2 2 2 2 beta.kubernetes.io/os=linux 122m
daemonset.apps/node-termination-handler 0 0 0 0 0 oci.oraclecloud.com/oke-is-preemptible=true 122m
daemonset.apps/nvidia-gpu-device-plugin 0 0 0 0 0 <none> 122m
daemonset.apps/proxymux-client 2 2 2 2 2 node.info.ds_proxymux_client=true 122m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/coredns 2/2 2 2 122m
deployment.apps/kube-dns-autoscaler 1/1 1 1 122m
NAME DESIRED CURRENT READY AGE
replicaset.apps/coredns-844b4886f 2 2 2 122m
replicaset.apps/kube-dns-autoscaler-74f78468bf 1 1 1 122m
Switched to context "c2".
NAME READY STATUS RESTARTS AGE
pod/coredns-84bd9cd884-4fqvr 1/1 Running 0 120m
pod/coredns-84bd9cd884-lmgz2 1/1 Running 0 124m
pod/csi-oci-node-4zl9l 1/1 Running 0 122m
pod/csi-oci-node-xjzfd 1/1 Running 1 (120m ago) 122m
pod/kube-dns-autoscaler-59575f8674-m6j2z 1/1 Running 0 124m
pod/kube-flannel-ds-llhhq 1/1 Running 0 122m
pod/kube-flannel-ds-sm6fg 1/1 Running 0 122m
pod/kube-proxy-7ppw8 1/1 Running 0 122m
pod/kube-proxy-vqfgb 1/1 Running 0 122m
pod/proxymux-client-cnkph 1/1 Running 0 122m
pod/proxymux-client-k5k6n 1/1 Running 0 122m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.102.5.5 <none> 53/UDP,53/TCP,9153/TCP 124m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/csi-oci-node 2 2 2 2 2 <none> 124m
daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 124m
daemonset.apps/kube-proxy 2 2 2 2 2 beta.kubernetes.io/os=linux 124m
daemonset.apps/node-termination-handler 0 0 0 0 0 oci.oraclecloud.com/oke-is-preemptible=true 124m
daemonset.apps/nvidia-gpu-device-plugin 0 0 0 0 0 <none> 124m
daemonset.apps/proxymux-client 2 2 2 2 2 node.info.ds_proxymux_client=true 124m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/coredns 2/2 2 2 124m
deployment.apps/kube-dns-autoscaler 1/1 1 1 124m
NAME DESIRED CURRENT READY AGE
replicaset.apps/coredns-84bd9cd884 2 2 2 124m
replicaset.apps/kube-dns-autoscaler-59575f8674 1 1 1 124m
Switched to context "c3".
NAME READY STATUS RESTARTS AGE
pod/coredns-56c7ffc89c-jt85k 1/1 Running 0 115m
pod/coredns-56c7ffc89c-lsqcg 1/1 Running 0 121m
pod/csi-oci-node-gfswn 1/1 Running 0 116m
pod/csi-oci-node-xpwbp 1/1 Running 0 116m
pod/kube-dns-autoscaler-6b69bf765c-fxjvc 1/1 Running 0 121m
pod/kube-flannel-ds-2sqbk 1/1 Running 0 116m
pod/kube-flannel-ds-l7sdz 1/1 Running 0 116m
pod/kube-proxy-4qcmb 1/1 Running 0 116m
pod/kube-proxy-zcrk4 1/1 Running 0 116m
pod/proxymux-client-4lgg7 1/1 Running 0 116m
pod/proxymux-client-zbcrg 1/1 Running 0 116m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.103.5.5 <none> 53/UDP,53/TCP,9153/TCP 121m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/csi-oci-node 2 2 2 2 2 <none> 122m
daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 121m
daemonset.apps/kube-proxy 2 2 2 2 2 beta.kubernetes.io/os=linux 121m
daemonset.apps/node-termination-handler 0 0 0 0 0 oci.oraclecloud.com/oke-is-preemptible=true 121m
daemonset.apps/nvidia-gpu-device-plugin 0 0 0 0 0 <none> 122m
daemonset.apps/proxymux-client 2 2 2 2 2 node.info.ds_proxymux_client=true 122m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/coredns 2/2 2 2 121m
deployment.apps/kube-dns-autoscaler 1/1 1 1 121m
NAME DESIRED CURRENT READY AGE
replicaset.apps/coredns-56c7ffc89c 2 2 2 121m
replicaset.apps/kube-dns-autoscaler-6b69bf765c 1 1 1 121m
[opc@o-tmcntm ~]$
作業 8:使用 Terraform 刪除 OKE 叢集
我們已使用 Terraform 進行部署,因此也可以使用 Terraform 刪除完整的部署。
-
執行
terraform destroy
命令,以刪除與三個 Kubernetes 叢集相關的所有資源。 -
輸入 yes 即可核准刪除處理作業。完成時間需要幾分鐘。
-
請注意,毀棄已經完成,並毀棄所有 229 個資源。
認可
-
作者 - Iwan Hoogendoorn (OCI 網路專家)
-
貢獻者 - Ali Mukadam
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Use Terraform to Deploy Multiple Kubernetes Clusters across different OCI Regions using OKE and Create a Full Mesh Network using RPC
F96823-01
April 2024