注意:
- 此教程需要访问 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 和一些定制散列脚本。
本教程是基于以下文档的更新:在 Oracle Cloud 上部署多个 Kubernetes 集群。
目标
- 我们将为本地计算机准备在 Oracle Cloud Infrastructure (OCI) 环境中执行 Terraform 操作所需的工具。我们还将配置 OCI 环境来验证本地计算机的 Terraform 执行请求,并创建 Terraform 和 shell 脚本,以便在 OKE 上跨不同区域部署三个 Kubernetes 集群。我们将通过在动态路由网关 (DRG) 上配置远程对等连接 (Remote Peering Connections,RPC) 来确保群集间通信。
任务 1:确定拓扑(星形与网格)
我们正在构建这些 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 添加到您的 path 变量。
-
-
运行以下命令将 Homebrew 添加到您的 path 变量。
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 账户
-
我们在任务 2.3 中创建了 RSA 密钥,可以使用该公共 RSA 密钥在 OCI 控制台中创建 API 密钥以进行 OCI 验证。
- 单击概要信息。
- 选择我的概要文件。
-
向下滚动。
- 选择 API 密钥。
- 单击添加 API 密钥。
- 选择 Paste in the public key 。
- 粘贴在任务 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 验证配置的最后一行,并添加在任务 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 (Yes) 以保存文件。
-
确认要用于保存 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 集群的区域。如果部署到未订阅的区域,我们将收到验证错误,部署将失败。
在本教程中,我们将使用以下三个区域进行部署:阿姆斯特丹、圣何塞和迪拜。
-
单击区域选择菜单。
- 向下滚动。
- 单击管理区域。
- 向下滚动。
- 单击 arrow 可查看接下来的 10 项。
- 请注意,我们已订阅阿姆斯特丹。
- 单击 arrow 可查看接下来的 10 项。
- 请注意,我们已订阅迪拜。
- 请注意,我们已订阅圣何塞。
- 单击 arrow 可查看接下来的 10 项。
-
请注意,我们有一些未订阅的区域。例如,如果我们要将其中一个 Kubernetes 集群部署到波哥大,我们首先需要订阅波哥大区域。
-
下图显示了我们尝试使用 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 分钟。
- 请注意, apply 已完成,并添加了 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 连接以及从堡垒主机到操作员主机的 SSH 连接。
现在,我们在不同的区域部署了三个 Kubernetes 集群。深入了解 OCI 控制台中部署的资源。
-
OCI 控制台验证(阿姆斯特丹)。
- 选择阿姆斯特丹作为区域。
- 导航到 Networking(网络)和 VCN 。
- 查看此处创建的 c1 VCN。
- 导航到 Developer Services(开发人员服务)和 Kubernetes Clusters(OKE) 。
- 查看此处创建的 c1 Kubernetes 集群。
- 导航到计算和实例。
- 请检查是否在此处创建了堡垒主机和属于 c1 Kubernetes 集群的两个 worker 节点。
- 导航到网络、客户连接和动态路由网关。
- 查看此处创建的 DRG。
- 导航到身份和策略。
- 查看此处创建的三个身份策略。
-
OCI Console Verification (San Jose) 。
- 选择 San Jose 作为区域。
- 导航到 Networking(网络)和 VCN 。
- 查看此处创建的 c2 VCN。
- 导航到 Developer Services(开发人员服务)和 Kubernetes Clusters(OKE) 。
- 查看此处创建的 c2 Kubernetes 集群。
- 导航到计算和实例。
- 检查是否在此处创建了属于 c2 Kubernetes 集群的两个 worker 节点。
- 导航到网络、客户连接和动态路由网关。
- 查看此处创建的 DRG。
- 导航到身份和策略。
- 查看此处创建的三个身份策略。
-
OCI 控制台验证(迪拜)
- 选择迪拜作为区域。
- 导航到 Networking(网络)和 VCN 。
- 查看此处创建的 c3 VCN。
- 导航到 Developer Services(开发人员服务)和 Kubernetes Clusters(OKE) 。
- 查看此处创建的 c3 Kubernetes 集群。
- 导航到计算和实例。
- 检查是否在此处创建了属于 c3 Kubernetes 集群的两个 worker 节点。
- 导航到网络、客户连接和动态路由网关。
- 查看此处创建的 DRG。
- 导航到身份和策略。
- 查看此处创建的三个身份策略。
任务 5:建立 RPC 连接
在各种 RPC 附件之间建立连接。让我们首先在不同的地区回顾一下。
-
阿姆斯特丹中的远程对等连接附加。
确保您已连接到 Amsterdam 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c1 。
- 单击 Remote peering connection attachments 。
- 请注意,配置了两个远程对等连接附加。
- 请注意,两个远程对等连接附加都是新的,而不是对等连接。
-
San Jose 中的远程对等连接附加。
确保您已连接到 San Jose 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c2 。
- 单击 Remote peering connection attachments 。
- 请注意,配置了两个远程对等连接附加。
- 请注意,两个远程对等连接附加都是新的,而不是对等连接。
-
迪拜的远程对等连接附加。
确保您已连接到 Dubai 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c3 。
- 单击 Remote peering connection attachments 。
- 请注意,配置了两个远程对等连接附加。
- 请注意,两个远程对等连接附加都是新的,而不是对等连接。
收集所有 RPC OCID
-
要配置所有区域之间的 RPC 对等连接,我们需要收集这些 RPC 对等连接附加的 OCID。
- 确保您已连接到 Amsterdam 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c1 。
- 单击 Remote peering connection attachments 。
- 单击远程对等连接 (
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。
- 确保您已连接到 Amsterdam 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c1 。
- 单击 Remote peering connection attachments 。
- 单击第一个远程对等连接连接附加 (
rpc-to-c2
)。在这里,您将配置到圣何塞的连接。
-
单击建立连接。
- 选择 San Jose 区域。
- 输入为 c1(阿姆斯特丹)创建的圣何塞一方的 RPC OCID。
- 单击建立连接。
- 对等连接状态将更改为待定,完成此操作需要一分钟。
- 单击第二个远程对等连接连接附加 (
rpc-to-c3
)。在这里,您将配置到迪拜的连接。
-
单击建立连接。
- 选择 Dubai 区域。
- 输入为 c1(阿姆斯特丹)创建的迪拜端的 RPC OCID。
- 单击建立连接。
配置 C2 对等连接 (San Jose) 。
-
下图显示了我们正在配置哪些 RPC。
- 对等连接状态将更改为待定,完成此操作需要一分钟。
- 单击“Region(区域)”菜单,然后从“Amsterdam(阿姆斯特丹)”切换到“San Jose(圣何塞)”区域。
- 选择 San Jose 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c2 。
- 单击 Remote peering connection attachments 。
- 请注意,阿姆斯特丹和圣何塞之间的连接现在处于对等状态。这是从阿姆斯特丹方面完成的。
- 请注意,从圣何塞 (c2) 到迪拜 (c3) 的对等连接状态仍然是新的。
- 单击第二个远程对等连接连接附加 (
rpc-to-c3
)。在这里,您将配置到迪拜的连接。
-
单击建立连接。
- 选择 Dubai 区域。
- 输入为 c2 (San Jose) 创建的迪拜端的 RPC OCID。
- 单击建立连接。
-
对等连接状态将更改为待定,完成此操作需要一分钟。
下图显示了我们所做的完整网格 RPC 对等连接。
-
验证连接对等连接。
- 确保您已连接到 San Jose 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c1 。
- 单击 Remote peering connection attachments 。
- 请注意,两个远程对等连接附件都具有对等状态。
- 确保您已连接到 San Jose 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c2 。
- 单击 Remote peering connection attachments 。
- 请注意,两个远程对等连接附件都具有对等状态。
- 确保您已连接到 Dubai 区域。
- 导航到 Networking(网络)、 Customer Connectivity(客户连接)、 Dynamic Routing Gateways(动态路由网关)和 c3 。
- 单击 Remote peering connection attachments 。
- 请注意,两个远程对等连接附件都具有对等状态。
任务 6:使用网络可视化工具验证 RPC 连接
执行其他检查以确保已使用网络可视化工具正确配置 RPC。
- 单击左上角的汉堡菜单。
- 单击网络。
- 单击网络可视化工具。
- 确保您已连接到 Amsterdam 区域。
- 请注意,阿姆斯特丹地区为 c1。
- 请注意从阿姆斯特丹到圣何塞和迪拜的航班。
- 确保您已连接到 San Jose 区域。
- 请注意,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 ~]$
-
运行以下命令,通过每个 Kubernetes 集群(c1、c2 和 c3)使用 for 循环迭代,并检索 worker 节点的状态。
[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 帮助中心。
Use Terraform to Deploy Multiple Kubernetes Clusters across different OCI Regions using OKE and Create a Full Mesh Network using RPC
F96822-01
April 2024