注意:

使用 Terraform 使用 OKE 在不同的 OCI 区域中部署多个 Kubernetes 集群,并使用 RPC 创建全网状网络

简介

在本教程中,我们将解释如何使用 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 创建多个 Kubernetes 集群,并将在三个不同的国家/地区(地区)部署这些集群。为了加快部署速度以及始终如一地部署 Kubernetes 集群并减少配置错误,我们将使用 Terraform 和一些定制散列脚本。

图像

我们还使用快速创建方法定制创建方法手动部署了单个集群。

本教程是基于以下文档的更新:在 Oracle Cloud 上部署多个 Kubernetes 集群

目标

任务 1:确定拓扑(星形与网格)

我们正在构建这些 Kubernetes 集群,以部署跨所有区域的基于容器的应用。为了允许这些 Kubernetes 集群之间的通信,我们需要某种形式的网络通信。就目前而言,这不在本教程的范围内,但我们需要提前做出一些架构决策。其中一项决定是确定我们是否希望在所有区域之间进行直接通信,还是希望将一个区域用作所有通信的中心,将其他区域用作通话中心。

星型拓扑:星型拓扑允许使用单个集线器区域在区域之间进行通信。因此,如果圣何塞的 Kubernetes 集群想要与迪拜的 Kubernetes 集群通信,它将使用阿姆斯特丹作为交通枢纽。

图像

网格拓扑:网格拓扑允许与所有区域(Kubernetes 集群)直接通信。因此,如果圣何塞的 Kubernetes 集群想要与迪拜的 Kubernetes 集群通信,则可以直接通信。

图像

在本教程中,我们将构建网格拓扑,此连接将使用 DRG 和 RPC 完成。

任务 2:准备环境以进行验证并运行 Terraform 脚本

在使用 Terraform 之前,我们需要准备环境。要使用 Terraform,请打开终端。在本教程中,我们使用的是 OS X 终端应用程序。

图像

  1. 运行以下命令以验证 Terraform 是否已安装、已添加到您的路径以及版本是什么。

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. 您可以看到找不到该命令,这意味着未安装 Terraform,也未将其添加到路径变量中。

图像

如您所见,Terraform 未安装,因此我们需要安装它。您会注意到,它不仅在安装 Terraform,而且在部署 Terraform 应用以及为完整的端到端脚本解决方案准备环境时,需要在三个不同的区域中部署三个 Kubernetes 集群。

下图提供了有关要遵循的必要任务的指导。

图像

任务 2.1:安装 Homebrew

可以使用不同的方法安装 Terraform。在本教程中,我们将使用 Homebrew 安装 Terraform。

Homebrew 是 MacOS(和 Linux)的软件包管理器,可用于安装应用程序,其所需的依赖项类似于 aptyum

任务 2.2:使用 Homebrew 安装 Terraform

在本任务中,我们将使用 Homebrew 安装 Terraform 程序包。

任务 2.3:创建用于 OCI 验证的本地 RSA 密钥

要允许使用 API 密钥通过 OCI 进行身份验证,我们需要仅为此目的生成新的私有密钥和公共密钥。

  1. 运行以下命令将目录切换到主目录。

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. 运行以下命令以验证您是否在主目录中。

    iwhooge@iwhooge-mac ~ % pwd
    
  3. 验证主目录是否正确。

    /Users/iwhooge
    
  4. 运行以下命令以创建一个新目录,该目录将包含要通过 OCI 进行验证的信息。

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. 运行以下命令以生成专用 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)
    
  6. 运行以下命令以使私钥文件可读。

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. 运行以下命令以从私钥生成公共 RSA 密钥。

    iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
    
  8. 验证密钥写入是否已完成。

    writing RSA key
    
  9. 运行以下命令可查看专用 RSA 密钥的内容。

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. 验证专用 RSA 密钥的内容。

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. 运行以下命令可查看公共 RSA 密钥的内容。

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. 验证公共 RSA 密钥的内容。

    ----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA52+LJ+gp3MAJGtXTeQ/d
    XXX
    mtHVtjLM1ftjYlaRSG5Xl/xdKMC8LH0bxpy3XXzLmDrYCP3LrhrIG8Xmuzsji6Hw
    TQIDAQAB
    -----END PUBLIC KEY-----
    iwhooge@iwhooge-mac ~ %
    

图像

任务 2.4:为堡垒主机验证生成本地 SSH 密钥

我们还需要创建本地 SSH 密钥以向堡垒主机进行验证。这是用于通过 OCI 控制台 (API) 进行验证的另一个密钥。

  1. 运行以下命令将目录更改为 SSH 目录。

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. 运行以下命令以验证您是否具有可使用的公共和专用 SSH 密钥。

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. 请注意,我们没有任何 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
    
  4. 运行以下命令以生成新的 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):
    
  5. 将口令短语留空,然后单击 ENTER

    Enter passphrase (empty for no passphrase):
    
  6. 将口令短语留空,然后单击 ENTER

    Enter same passphrase again:
    
  7. 请注意,新的 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.6:收集 OCI 环境的必需信息

我们需要为 Terraform 文件收集一些信息,以便使用 API 进行 OCI 验证。大多数信息已在任务 2.5 中创建的 API 验证配置文件中提供。

这是您将部署 Kubernetes 集群的区间。

任务 3:创建 Terraform 脚本和文件

我们已在本地计算机上完成了准备工作,包括设置 Terraform、RSA 和 SSH 密钥、配置 OCI 环境 (API),以及收集使用 OCI 验证 Terraform 所需的所有基本信息。现在创建 Terraform 脚本。

首先,我们需要验证我们是否订阅了部署 Kubernetes 集群的区域。如果部署到未订阅的区域,我们将收到验证错误,部署将失败。

在本教程中,我们将使用以下三个区域进行部署:阿姆斯特丹、圣何塞和迪拜。

任务 4:运行 Terraform 和 OKE 集群以及必要的资源(VCN、子网、DRG、RPC 等)

我们提供的 Terraform 脚本具有正确的参数。现在,执行脚本并构建我们的环境,该环境由三个不同区域的三个 Kubernetes 集群组成。

下图显示了从何处设置到堡垒主机的 SSH 连接以及从堡垒主机到操作员主机的 SSH 连接。

图像

现在,我们在不同的区域部署了三个 Kubernetes 集群。深入了解 OCI 控制台中部署的资源。

任务 5:建立 RPC 连接

在各种 RPC 附件之间建立连接。让我们首先在不同的地区回顾一下。

收集所有 RPC OCID

对所有 DRG 上所有区域上的所有远程对等连接重复该过程并保存它们。

现在,我们收集了以下远程对等连接 OCID:

创建 RPC 对等端

在 C1 上配置到 C2 和 C3 的对等连接。这将自动为 C2 和 C3 端的 C1 配置对等连接,在 C2 上为 C3 配置对等连接将自动为 C3 端的 C2 配置对等连接。

配置 C1 对等点(阿姆斯特丹)

配置 C2 对等连接 (San Jose)

任务 6:使用网络可视化工具验证 RPC 连接

执行其他检查以确保已使用网络可视化工具正确配置 RPC。

  1. 单击左上角的汉堡菜单
  2. 单击网络
  3. 单击网络可视化工具

图像

  1. 确保您已连接到 Amsterdam 区域。
  2. 请注意,阿姆斯特丹地区为 c1。
  3. 请注意从阿姆斯特丹到圣何塞和迪拜的航班。

图像

  1. 确保您已连接到 San Jose 区域。
  2. 请注意,San Jose 区域为 c2。
  3. 请注意从圣何塞到阿姆斯特丹和迪拜的航班。

图像

  1. 确保您已连接到 Dubai 区域。
  2. 请注意,迪拜区域为 c3。
  3. 请注意从迪拜到阿姆斯特丹和圣何塞的连接。

图像

任务 7:使用堡垒和运算符检查连接的工作

我们创建了 Kubernetes 集群(在所有三个不同的区域上),并使用 RPC 连接了各个区域。现在,我们可以使用操作员主机来验证操作员是否可以管理 Kubernetes 集群。

  1. 运行以下命令(该命令是在 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 ~]$
    
  2. 运行以下命令,通过每个 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
    
  3. 请注意使用 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 删除完整的部署。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心