附註:

使用 Terraform 使用 OKE 在不同的 OCI 區域部署多個 Kubernetes 叢集,並使用 RPC 建立完整網狀網路

簡介

在本教學課程中,我們將說明如何使用 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 建立多個 Kubernetes 叢集,並將在三個不同的國家 (區域) 部署這些叢集。為了加快部署速度,並一致地部署 Kubernetes 叢集,發生的組態錯誤最少,我們將使用 Terraform 和一些自訂的 bash 命令檔。

圖像

我們也使用快速建立方法自訂建立方法手動部署單一叢集。

本教學課程是根據本文件所做的更新:在 Oracle Cloud 上部署多個 Kubernetes 叢集

目標

工作 1:決定拓樸 (星體 vs 網狀組織)

我們正在建立這些 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 連線,以及從堡壘主機到操作員主機。

圖像

現在,我們在不同的區域部署了三個 Kubernetes 叢集。查看 OCI 主控台中高階部署的資源。

作業 5:建立 RPC 連線

建立各種 RPC 附件之間的連線。讓我們先在不同的區域複查這些項目。

收集所有 RPC OCID

針對所有 DRG 上所有區域上的所有遠端對等互連連線重複此程序並加以儲存。

現在我們收集了下列遠端對等互連連線 OCID:

建立 RPC 對等

設定 C1 到 C2 和 C3 的對等互連。這會自動設定 C2 和 C3 端的 C1 對等互連,並將 C2 上的對等互連設定為 C3 會自動設定 C3 端的 C2 對等互連。

設定 C1 對等 (阿姆斯特丹)

設定 C2 對等互連 (聖荷西)

作業 6:使用網路視覺化程式來驗證 RPC 連線

執行額外的檢查,以確保已使用「網路視覺化程式」正確設定 RPC。

  1. 按一下左上角的漢堡功能表
  2. 按一下網路
  3. 按一下網路視覺化程式

圖像

  1. 請確定您已連線至阿姆斯特丹區域。
  2. 請注意,阿姆斯特丹區域為 c1。
  3. 請注意從阿姆斯特丹到聖荷西和杜拜的連線。

圖像

  1. 請確定您已連線至聖荷西區域。
  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. 執行下列命令,以便使用 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
    
  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 Help Center