クラスタ・アクセスの基本設定

Container Engine for Kubernetes (OKE)を使用して作成したクラスタにアクセスするための要塞の設定方法を確認します。

kubectlを使用してクラスタで操作を実行する場合、Kubernetes APIエンドポイントにアクセスできる必要があります。同様に、ワーカー・ノードで管理タスクを実行する場合は、ワーカー・ノードへのアクセス権が必要です。ただし、セキュリティ・リスト・ルール、またはKubernetes APIエンドポイントやワーカー・ノード(あるいはその両方)がプライベート・サブネット内にあるため、Kubernetes APIエンドポイントやワーカー・ノードへのアクセスが制限される場合があります。このような状況では、Oracle Cloud Infrastructure Bastionサービスで要塞を設定して、Kubernetes APIエンドポイントまたはワーカー・ノード(あるいはその両方)へのセキュアなアクセスを提供できます。

要塞および要塞セッションの設定には、様々なタスクが含まれます。これらのタスクは、組織に応じて、同じ個人または異なる個人によって次のように実行される場合があります。

  • VCN管理者は、Kubernetesクラスタおよび要塞のVCN、サブネットおよびセキュリティ・ルールの作成を担当します。IAMポリシーにより、VCN管理者はVCNを管理できます。
  • クラスタ管理者は、Kubernetes APIエンドポイントおよびワーカー・ノードにアクセスするための要塞の作成、およびワーカー・ノード・アクセス用の要塞セッションの作成を担当します。IAMポリシーを使用すると、クラスタ管理者はクラスタおよび要塞を管理できます。
  • クラスタ・ユーザーは、Kubernetes APIエンドポイントにアクセスするための要塞セッションの作成を担当します。IAMポリシーにより、クラスタ・ユーザーはクラスタおよび要塞を使用できます。

この図は、クラスタのKubernetes APIエンドポイントおよびワーカー・ノードへのセキュアなアクセスを提供する要塞を含むクラスタ構成の例を示しています。

この図は、Kubernetes APIエンドポイント・サブネット、ワーカー・ノード・サブネットおよびロード・バランサ・サブネットを含むクラスタ構成の例を示しています。サブネットへのアクセスは、それぞれseclist-KubernetesAPIendpoint、seclist-workernodesおよびseclist-loadbalancersセキュリティ・リストによって制御されます。Kubernetes APIエンドポイント・サブネットはVNICによってクラスタ・コントロール・プレーンに接続されます。要塞サブネットの要塞は、クラスタのKubernetes APIエンドポイントおよびワーカー・ノードへのSSHアクセスを提供します。この構成例のその他の機能については、前後のテキストで説明しています。

要塞を作成してクラスタにアクセスするために必要なIAMポリシー

要塞および要塞セッションの作成に必要なIAMポリシーの詳細は、要塞のポリシーを参照してください。

必要に応じて、クラスタ管理者はIAMポリシーを設定して、要塞を使用してクラスタ・ユーザーがアクセスできるリソースを制限することもできます。要塞の使用を制限するためのIAMポリシーの設定を参照してください。

Kubernetes APIエンドポイントにアクセスするための要塞の設定

クラスタ・ユーザーがクラスタのプライベートKubernetes APIエンドポイントにアクセスするには、VCN管理者、クラスタ管理者およびクラスタ・ユーザーはそれぞれ、この項で説明するように、いくつかのステップを実行する必要があります。

VCN管理者のステップ

VCN管理者は、次のステップに従ってエグレスおよびイングレス・セキュリティ・ルールを設定し、要塞がKubernetes APIエンドポイントにアクセスできるようにします:

  1. アクセスを提供するクラスタと同じVCNに、要塞をホストする新しいプライベート・サブネットを作成します。

    ワーカー・ノードにアクセスするための要塞をホストするサブネットをすでに作成している場合は、新しいサブネットを作成するかわりに、そのサブネットを再利用できます。管理対象ノードへのSSHアクセスを提供するための要塞の設定を参照してください。

  2. 次のTCP/6443エグレス・セキュリティ・ルールを、要塞サブネットに関連付けられているセキュリティ・リストに追加します。

    このエグレス・セキュリティ・ルールは、要塞サブネットからクラスタのKubernetes APIエンドポイント・サブネットへのトラフィックを許可します。

    状態: 宛先 プロトコル/宛先ポート 説明:
    ステートフル Kubernetes APIエンドポイントCIDR (たとえば、10.0.0.0/29) TCP/6443 Kubernetes APIエンドポイントへの要塞通信を許可します。
  3. まだ存在しない場合は、次のTCP/6443イングレス・セキュリティ・ルールを、Kubernetes APIエンドポイントをホストするサブネットに関連付けられている新規または既存のセキュリティ・リストに追加します。

    このイングレス・セキュリティ・ルールでは、要塞サブネットからKubernetes APIエンドポイント・サブネットへのトラフィックが許可されます。

    状態: ソース プロトコル/宛先ポート 説明:
    ステートフル 要塞サブネットCIDR TCP/6443 Kubernetes APIエンドポイントへの要塞通信を許可します。
    ノート

    Oracleの推奨設計ではありませんが、要塞とクラスタのKubernetes APIエンドポイントの両方に同じサブネットを使用できます。この場合、Kubernetes APIエンドポイント・サブネットに関連付けられているセキュリティ・リストにTCP/6443エグレス・セキュリティ・ルールを追加します。

クラスタ管理者のステップ

クラスタ管理者は、次のステップに従って、Kubernetes APIエンドポイントにアクセスするための要塞を設定します:

  1. 次のように、要塞を作成します:
    1. コンソールナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします
    2. 「要塞」をクリックします。
    3. 「Bastion」ページで、「Create bastion」をクリックします。
    4. 「要塞の作成」ダイアログで、次のプロパティを設定します:
      • 要塞名:要塞の名前。機密情報の入力は避けてください。サポートされているのは、英数字のみです。
      • ターゲットVirtual Cloudネットワーク:アクセスを提供するKubernetesクラスタのVCNを指定します。
      • ターゲット・サブネット:要塞をホストするサブネット。設定したイングレスおよびエグレス・セキュリティ・ルールが含まれます。
      • CIDRブロック許可リスト:この要塞でホストされるセッションへの接続を許可する1つ以上のアドレス範囲(CIDR表記)。たとえば、インターネットからのアクセスを許可する0.0.0.0/0、またはより限定されたアドレス範囲です。例: 203.0.113.0/24
    5. (オプション)この要塞の任意のセッションをアクティブなままにできる最大時間を変更するには、「拡張オプションの表示」をクリックし、「最大セッション稼働時間」の値を入力します。
    6. 「要塞の作成」をクリックします。
    7. 要塞が作成されたら、要塞の名前をクリックして、そのOCIDを含む要塞に関する情報を表示します。

    要塞の作成の詳細は、要塞を作成するにはを参照してください。

  2. クラスタ・ユーザーに要塞のOCIDを指定します。
  3. クラスタ・ユーザーによる要塞の使用を認可するために、適切なIAMポリシーが設定されていることを確認します。要塞を作成してクラスタにアクセスするために必要なIAMポリシーを参照してください。

    必要に応じて、IAMポリシーを設定して、要塞を使用してクラスタ・ユーザーがアクセスできるリソースを制限することもできます。要塞の使用を制限するためのIAMポリシーの設定を参照してください。

クラスタ・ユーザーのステップ

クラスタ・ユーザーとして、次のステップに従って要塞セッションを作成し、Kubernetes APIエンドポイントにアクセスします:

  1. まだ作成していない場合は、次を実行して、アクセスするクラスタのkubeconfigファイルを作成します:
    oci ce cluster create-kubeconfig \
      --cluster-id <cluster OCID> \
      --file $HOME/.kube/config \
      --region <region> \
      --token-version 2.0.0
    
  2. クラスタのkubeconfigファイルを編集し、serverに指定されたIPアドレスを変更して、SSHトラフィックをリスニングするIPアドレスおよびポートを指定します:
    1. 次の行を見つけます:
      server: https://x.x.x.x:6443
    2. 行を次のように変更します:
      server: https://127.0.0.1:6443

      例:

      apiVersion: v1
      clusters:
      - cluster:
          certificate-authority-data:______
          server: https://127.0.0.1:6443
      - name: cluster-xxxxxxx
      …
      
  3. コンソールまたはCLIを使用して、次のように要塞セッションを作成します:

    コンソールの使用
    1. 「要塞」ページで、クラスタ管理者が作成した要塞の名前をクリックします。
    2. 「セッション」ページで、「セッションの作成」をクリックします。
    3. 「セッションの作成」ダイアログで、次のプロパティを設定します:
      • セッション・タイプ: 「SSHポート転送セッション」を選択します。
      • セッション名:新しいセッションの表示名。機密情報の入力は避けてください。
      • 次を使用してターゲット・ホストに接続します: 「IPアドレス」を選択します。
      • IPアドレス: クラスタのKubernetes APIプライベート・エンドポイントのIPアドレス部分を指定します(「クラスタの詳細」ページを参照)。
      • ポート:クラスタのKubernetes APIプライベート・エンドポイントのポート部分を指定します(「クラスタの詳細」ページを参照)。例: 6443
      • SSHキー:セッションに使用する既存のSSHキー・ペアの公開キー・ファイルを指定するか、新しいSSHキー・ペアを生成して秘密キーを保存します。
    4. (オプション)セッションをアクティブなままにできる最大時間を変更するには、「拡張オプションの表示」をクリックし、「最大セッション存続時間」の値を入力します。
    5. 「セッションの作成」をクリックします。
    CLIの使用
    oci bastion session create-port-forwarding \
     --bastion-id <bastion OCID> \
     --ssh-public-key-file <ssh public key> \
     --target-private-ip <API Private IP endpoint> \
     --target-port 6443
    

    要塞セッションの作成の詳細は、セッションを作成するにはを参照してください。

  4. 次のように、コンソールまたはCLIを使用してSSHトンネルを作成するコマンドを取得します:

    コンソールの使用

    「セッション」ページで、作成したセッションの横にある「アクション」メニュー(アクション・メニュー)から「SSHコマンドのコピー」を選択します。

    CLIの使用
    oci bastion session get --session-id <session OCID> | jq '.data."ssh-metadata".command'

    取得したSSHトンネル・コマンドの形式は次のとおりです。

    ssh -i <privateKey> -N -L <localPort>:<session-IP>:<session-port> -p 22 <session-ocid>

    ここでは:

    • <session-IP>:<session-port>は、要塞セッションの作成時に指定したKubernetes APIエンドポイントのIPアドレスおよびポート番号です。例: 10.0.0.6:6443
    • <session-ocid>は、作成した要塞セッションのOCIDです。
  5. 次のように、コマンドを実行して、ローカル・ワークステーションまたはクラウド・シェルにSSHトンネルを作成します:
    1. 取得したSSHトンネル・コマンドを次のように編集します。

      • <privateKey>を、セッションに指定したSSHキー・ペアの秘密キーを含むファイルへのパスに置き換えます。たとえば、/home/johndoe/.ssh/id_rsaなどです。
      • <localPort>6443、またはシステム上の空きポート(ネットワークがクラスタのVCNとピアリングされている場合はローカル・ワークステーション、クラウド・シェル)に置き換えます
      • コマンドの最後に&を追加して、コマンドをバックグラウンドで実行します。
    2. 編集したSSHトンネル・コマンドは、ローカル・ワークステーションまたはクラウド・シェル・ウィンドウで実行します。

      例:

      ssh -i /home/johndoe/.ssh/id_rsa -N -L 6443:10.0.0.6:6443 -p 22 ocid1.bastionsession_______oraclecloud.com &

SSHトンネルまたは要塞セッションがタイムアウトするまで、クラスタでkubectl操作を実行できるようになりました。

管理対象ノードへのSSHアクセスを提供するための要塞の設定

クラスタ・ユーザーが管理対象ノードにSSHアクセスできるようにするには、VCN管理者、クラスタ管理者およびクラスタ・ユーザーがそれぞれ、この項で説明するように、いくつかのステップを実行する必要があります。

VCN管理者のステップ

VCN管理者として、次のステップに従ってエグレスおよびイングレス・セキュリティ・ルールを設定し、要塞が管理対象ノードへのSSHアクセスを提供できるようにします:

  1. アクセスを提供するクラスタと同じVCNに、要塞をホストする新しいサブネットを作成します。

    Kubernetes APIエンドポイントにアクセスするための要塞をホストするサブネットをすでに作成している場合は、新しいサブネットを作成するかわりに、そのサブネットを再利用できます。Kubernetes APIエンドポイントにアクセスするための要塞の設定を参照してください。

  2. 次のTCP/22エグレス・セキュリティ・ルールを、要塞サブネットに関連付けられているセキュリティ・リストに追加します。

    このエグレス・セキュリティ・ルールは、要塞サブネットからワーカー・ノード・サブネットへのトラフィックを許可します。

    状態: 宛先 プロトコル/宛先ポート 説明:
    ステートフル ワーカー・ノードCIDR(たとえば、10.0.1.0/24) TCP/22 ワーカー・ノードへの要塞通信を許可します。
  3. まだ存在しない場合は、次のTCP/22イングレス・セキュリティ・ルールを、ワーカー・ノードをホストしているサブネットに関連付けられている新規または既存のセキュリティ・リストに追加します。

    このイングレス・セキュリティ・ルールでは、要塞サブネットからワーカー・ノード・サブネットへのトラフィックが許可されます。

    状態: ソース プロトコル/宛先ポート 説明:
    ステートフル 要塞サブネットCIDR TCP/22 ワーカー・ノードへの要塞通信を許可します。
    ノート

    Oracleの推奨設計ではありませんが、要塞とワーカー・ノードの両方に同じサブネットを使用できます。この場合、ワーカー・ノード・サブネットに関連付けられているセキュリティ・リストにTCP/22エグレス・セキュリティ・ルールを追加します。

クラスタ管理者のステップ

クラスタ管理者は、次のステップに従って、管理対象ノードへのSSHアクセスを提供する要塞を設定します。

  1. 次のように、SSHを介して接続するワーカー・ノードで要塞エージェントを有効にします。
    1. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「コンテナとアーティファクト」で、「Kubernetesクラスタ(OKE)」をクリックします。
    2. 「クラスタ・リスト」ページで、接続先のワーカー・ノードを含むクラスタの名前をクリックします。
    3. 「リソース」で、「ノード・プール」をクリックし、接続先のワーカー・ノードを含むノード・プールの名前をクリックします。
    4. 「リソース」で、「ノード」をクリックし、接続先のワーカー・ノードの名前をクリックします。
    5. 「インスタンスの詳細」ページで、「Oracle Cloud Agent」タブを表示し、「要塞」プラグインを「有効」に切り替えます。

      この変更が有効になるまで最大10分かかる場合があります。

    6. 要塞プラグインの「ステータス」「実行中」と表示されるまで待ってから、次のステップに進みます。
  2. 次のように、要塞を作成します:
    1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。
    2. 「要塞」をクリックします。
    3. 「Bastion」ページで、「Create bastion」をクリックします。
    4. 「要塞の作成」ダイアログで、次のプロパティを設定します:
      • 要塞名:要塞の名前。機密情報の入力は避けてください。サポートされているのは、英数字のみです。
      • ターゲットVirtual Cloudネットワーク:アクセスを提供するKubernetesクラスタのVCNを指定します。
      • ターゲット・サブネット:要塞をホストするサブネット。設定したイングレスおよびエグレス・セキュリティ・ルールが含まれます。
      • CIDRブロック許可リスト:この要塞でホストされるセッションへの接続を許可する1つ以上のアドレス範囲(CIDR表記)。たとえば、インターネットからのアクセスを許可する0.0.0.0/0、またはより限定されたアドレス範囲です。例: 203.0.113.0/24
    5. (オプション)この要塞の任意のセッションをアクティブなままにできる最大時間を変更するには、「拡張オプションの表示」をクリックし、「最大セッション稼働時間」の値を入力します。
    6. 「要塞の作成」をクリックします。
    7. 要塞が作成されたら、要塞の名前をクリックして、そのOCIDを含む要塞に関する情報を表示します。

    要塞の作成の詳細は、要塞を作成するにはを参照してください。

  3. クラスタ・ユーザーに要塞のOCIDを指定します。
  4. クラスタ・ユーザーによる要塞の使用を認可するために、適切なIAMポリシーが設定されていることを確認します。要塞を作成してクラスタにアクセスするために必要なIAMポリシーを参照してください。

    必要に応じて、IAMポリシーを設定して、要塞を使用してクラスタ・ユーザーがアクセスできるリソースを制限することもできます。要塞の使用を制限するためのIAMポリシーの設定を参照してください。

クラスタ・ユーザーのステップ

クラスタ・ユーザーとして、次のステップに従って要塞セッションを作成し、管理対象ノードへのSSHアクセスを提供します:

  1. コンソールまたはCLIを使用して、次のように要塞セッションを作成します:

    CLIの使用
    1. 「要塞」ページで、クラスタ管理者が作成した要塞の名前をクリックします。
    2. 「セッション」ページで、「セッションの作成」をクリックします。
    3. 「セッションの作成」ダイアログで、次のプロパティを設定します:
      • セッション・タイプ: 「管理対象SSHセッション」を選択します。
      • セッション名:新しいセッションの表示名。機密情報の入力は避けてください。
      • Username: opcと入力します。
      • <compartment name>のコンピュート・インスタンス:コンパートメント内のコンピュート・インスタンスのリストから、ワーカー・ノード・コンピュート・インスタンスの名前を選択します。必要な場合は、コンパートメントを変更してインスタンスを探します。リストされるのは、アクティブ・インスタンスのみです。
      • SSHキー:セッションに使用する既存のSSHキー・ペアの公開キー・ファイルを指定するか、新しいSSHキー・ペアを生成して秘密キーを保存します。
    4. (オプション)セッションをアクティブなままにできる最大時間を変更するには、「拡張オプションの表示」をクリックし、「最大セッション存続時間」の値を入力します。

      「ターゲット・コンピュート・インスタンス・ポート」フィールドのデフォルト値は変更しないことに注意してください(デフォルト・ポートはすでに22に設定されています)。また、コンピュート・インスタンスをすでに選択しているため、「ターゲット・コンピュート・インスタンスのIPアドレス」フィールドにはIPアドレスを指定しません。

    5. 「セッションの作成」をクリックします。
    CLIの使用
    oci bastion session create-managed-ssh \
      --bastion-id <bastion OCID> \
      --ssh-public-key-file <ssh public key> \
      --target-resource-id <worker node instance OCID> \
      --target-os-username <instance_username>

    要塞セッションの作成の詳細は、セッションを作成するにはを参照してください。

  2. 次のように、コンソールまたはCLIを使用してSSHトンネルを作成するコマンドを取得します:

    コンソールの使用

    「セッション」ページで、作成したセッションの横にある「アクション」メニュー(アクション・メニュー)から「SSHコマンドのコピー」を選択します。

    CLIの使用
    oci bastion session get --session-id <session OCID> | jq '.data."ssh-metadata".command'

    取得したSSHトンネル・コマンドの形式は次のとおりです。

    ssh -i <privateKey> -o ProxyCommand="ssh -i <privateKey> -W %h:%p -p 22 <session-ocid>" -p 22 opc@<node-private-ip>

    ここでは:

    • <session-ocid>は、作成した要塞セッションのOCIDです。
    • <node-private-ip>は、要塞セッションの作成時に指定したワーカー・ノードのプライベートIPアドレスです。例: 10.0.10.99
  3. 次のように、コマンドを実行して、ローカル・ワークステーションまたはクラウド・シェルにSSHトンネルを作成します:
    1. 取得したSSHトンネル・コマンドを次のように編集します。

      • <privateKey>を、セッションに指定したSSHキー・ペアの秘密キーを含むファイルへのパスに置き換えます。たとえば、/home/johndoe/.ssh/id_rsaなどです。
      • コマンドの最後に&を追加して、コマンドをバックグラウンドで実行します。
    2. 編集したSSHトンネル・コマンドは、ローカル・ワークステーションまたはクラウド・シェル・ウィンドウで実行します。

      例:

      ssh -i /home/johndoe/.ssh/id_rsa -o ProxyCommand="ssh -i /home/johndoe/.ssh/id_rsa -W %h:%p -p 22 ocid1.bastionsession_______oraclecloud.com" -p 22 opc@10.0.10.99 &

SSHトンネルまたは要塞セッションがタイムアウトするまで、ワーカー・ノードで操作を実行できるようになりました。

要塞の使用を制限するためのIAMポリシーの設定

クラスタ管理者は、IAMポリシーを設定して、要塞を使用してクラスタ・ユーザーがアクセスできるリソースを制限できます。たとえば、一般的な要件は、クラスタ・ユーザーがSSHを介してワーカー・ノードにアクセスできるようにするのではなく、クラスタのKubernetes APIエンドポイントのみにアクセスするように要塞の使用を制限することです。

次のポリシーの例では、グループcluster-usersのユーザーが、コンパートメントABC内のKubernetes APIエンドポイント(サブネット10.0.0.11/32、ポート6443)の要塞セッションのみを作成、接続および終了できます:

Allow group cluster-users to use bastion in compartment ABC 
Allow group cluster-users to manage bastion-session in compartment ABC where ALL {target.bastion.ocid='ocid1.bastion.xxx', target.bastion-session.type='port_forwarding', target.bastion-session.ip in ['10.0.0.11/32'], target.bastion-session.port='6443'}
Allow group cluster-users to read vcn in compartment ABC
Allow group cluster-users to read subnet in compartment ABC

この例では、次のことを想定しています。

  • 要塞はすでに作成されています。
  • ネットワークおよびワーカー・ノードは、要塞と同じコンパートメントにあります。
  • ネットワーク・アクセスは、最小限必要な値に設定する必要があります。