ノート:

Terraformを使用したOKEを使用した異なるOCIリージョンへの複数のKubernetesクラスタのデプロイおよびRPCを使用したフル・メッシュ・ネットワークの作成

イントロダクション

このチュートリアルでは、Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)を使用して複数のKubernetesクラスタを作成する方法を説明し、これらのクラスタを3つの異なる国(リージョン)にデプロイします。デプロイメントを高速化し、構成ミスを最小限に抑えてKubernetesクラスタを一貫してデプロイするには、Terraformおよび一部のカスタムbashスクリプトを使用します。

イメージ

また、クイック作成方法カスタム作成方法を使用して、単一のクラスタを手動でデプロイしました。

このチュートリアルは、このドキュメントに基づく更新です: Oracle Cloudへの複数のKubernetesクラスタのデプロイ

目的

タスク1: トポロジの決定(星とメッシュ)

これらのKubernetesクラスタを構築して、すべてのリージョンにデプロイされるコンテナベースのアプリケーションをデプロイしています。これらのKubernetesクラスタ間の通信を可能にするには、何らかの形のネットワーク通信が必要です。今のところ、これはこのチュートリアルの範囲外ですが、事前にいくつかのアーキテクチャ上の決定を行う必要があります。これらの決定の1つは、すべてのリージョン間の直接通信を許可するか、1つのリージョンをすべての通信のハブとして使用するか、他のリージョンをスポークとして使用するかを決定することです。

スター・トポロジ:スター・トポロジでは、1つのハブ・リージョンを使用してリージョン間の通信が可能です。そのため、サンノゼのKubernetesクラスタがドバイのKubernetesクラスタと通信する場合は、Amsterdamをトランジット・ハブとして使用します。

イメージ

メッシュ・トポロジ:メッシュ・トポロジでは、すべてのリージョン(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アプリケーションのデプロイと、3つの異なるリージョンに3つのKubernetesクラスタをデプロイするための完全なエンドツーエンド・スクリプト・ソリューションのための環境を準備するために必要な複数のステップがあります。

次の図は、従う必要のあるタスクに関するガイダンスを示しています。

イメージ

タスク2.1: Homebrewのインストール

Terraformは、様々な方法を使用してインストールできます。このチュートリアルでは、Homebrewを使用してTerraformをインストールします。

Homebrewは、アプリケーションのインストールに使用できるMacOS (およびLinux)のパッケージ・マネージャで、必要な依存関係はaptまたはyumです。

タスク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キーと秘密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環境に必要な情報の収集

APIを使用して、OCI認証用のTerraformファイルの情報を収集する必要があります。ほとんどの情報は、タスク2.5で作成されたAPI認証構成ファイルですでに提供されています。

これは、Kubernetesクラスタをデプロイするコンパートメントです。

タスク3: Terraformスクリプトおよびファイルの作成

Terraform、RSAおよびSSHキーの設定、OCI環境(API)の構成、OCIでTerraformを認証するために必要なすべての重要な情報の収集など、ローカル・マシンでの準備が完了しました。次に、Terraformスクリプトを作成します。

まず、Kubernetesクラスタをデプロイしているリージョンにサブスクライブしていることを確認する必要があります。サブスクライブされていないリージョンにデプロイする場合、認証エラーが発生し、デプロイメントは失敗します。

このチュートリアルでは、アムステルダム、サンノゼおよびドバイの3つのリージョンをデプロイに使用します。

タスク4: TerraformおよびOKEクラスタと必要なリソース(VCN、サブネット、DRG、RPCなど)の実行

正しいパラメータを持つTerraformスクリプトが用意されています。次に、スクリプトを実行し、3つの異なるリージョンに3つのKubernetesクラスタで構成される環境を構築します。

次の図は、要塞ホストへのSSH接続の設定場所と、要塞ホストからオペレータ・ホストへのSSH接続の設定場所を示しています。

イメージ

これで、異なるリージョンに3つのKubernetesクラスタをデプロイしました。Take a look at the deployed resources from a high level in the OCI Console.

タスク5: RPC接続の確立

さまざまなRPCアタッチメント間の接続を確立します。まずは各地域で見直しましょう。

Collect All the RPC OCIDs

Repeat the process for all remote peering connections on all regions on all DRGs and save them.

Now, we have collected the following remote peering connection OCIDs:

Create the RPC Peerings

Configure the peering on C1 to C2 and C3. This will automatically configure the peering for C1 on the C2 and C3 side, and configuring the peering on C2 to C3 will automatically configure the peering for C2 on the C3 side.

Configure the C1 Peerings (Amsterdam).

C2ピアリング(San Jose)を構成します

Task 6: Use the Network Visualizer to Verify the RPC Connections

Perform an additional check to ensure that the RPC has been configured correctly with Network Visualizer.

  1. 左上隅のハンバーガー・メニューをクリックします。
  2. 「ネットワーキング」をクリックします。
  3. 「ネットワーク・ビジュアライザ」をクリックします。

イメージ

  1. アムステルダム・リージョンに接続していることを確認します。
  2. アムステルダム・リージョンはc1です。
  3. アムステルダムからサンノゼとドバイへの接続に注目してください。

イメージ

  1. 「サンノゼ」リージョンに接続していることを確認します。
  2. サンノゼ・リージョンはc2です。
  3. サンノゼからアムステルダムとドバイへの接続に注目してください。

イメージ

  1. Dubaiリージョンに接続していることを確認します。
  2. ドバイ・リージョンはc3です。
  3. ドバイからアムステルダムとサンノゼへの接続に注目してください。

イメージ

タスク7: 要塞および演算子を使用した接続の作業の確認

Kubernetesクラスタ(3つの異なるリージョンすべて)を作成し、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を参照してください。