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

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. 「要塞」ページで、「要塞の作成」をクリックします。
    4. 「要塞の作成」ダイアログで、次のプロパティを設定します。
      • 要塞名:要塞の名前。機密情報を入力しないでください。サポートされているのは、英数字のみです。
      • ターゲット仮想クラウド・ネットワーク:アクセスを提供するKubernetesクラスタのVCNを指定します。
      • ターゲット・サブネット:設定したイングレスおよびエグレス・セキュリティ・ルールを使用して、要塞をホストするサブネット。
      • CIDRブロック許可リスト:この要塞によってホストされているセッションへの接続を許可するCIDR表記の1つ以上のアドレス範囲。たとえば、インターネットからのアクセスを許可する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. 次のようにコマンドを実行して、ローカル・ワークステーションまたはCloud Shellで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. Bastionプラグインの「ステータス」「実行中」と表示されるまで待機してから、次のステップに進みます。
  2. 次のように要塞を作成します。
    1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。
    2. 「要塞」をクリックします。
    3. 「要塞」ページで、「要塞の作成」をクリックします。
    4. 「要塞の作成」ダイアログで、次のプロパティを設定します。
      • 要塞名:要塞の名前。機密情報を入力しないでください。サポートされているのは、英数字のみです。
      • ターゲット仮想クラウド・ネットワーク:アクセスを提供するKubernetesクラスタのVCNを指定します。
      • ターゲット・サブネット:設定したイングレスおよびエグレス・セキュリティ・ルールを使用して、要塞をホストするサブネット。
      • CIDRブロック許可リスト:この要塞によってホストされているセッションへの接続を許可するCIDR表記の1つ以上のアドレス範囲。たとえば、インターネットからのアクセスを許可する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セッション」を選択します。
      • セッション名:新しいセッションの表示名。機密情報を入力しないでください。
      • ユーザー名: opcと入力します。
      • <コンパートメント名>のコンピュート・インスタンス:コンパートメント内のコンピュート・インスタンスのリストから、ワーカー・ノードのコンピュート・インスタンスの名前を選択します。必要に応じて、コンパートメントを変更してインスタンスを検索します。アクティブ・インスタンスのみがリストされます。
      • 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. 次のようにコマンドを実行して、ローカル・ワークステーションまたはCloud Shellで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ポリシーを設定して、クラスタ・ユーザーが要塞を使用してアクセスできるリソースを制限できます。たとえば、一般的な要件は、クラスタ・ユーザーが要塞を使用してクラスタのKubernetes APIエンドポイントのみにアクセスするように制限することです。SSHを介してワーカー・ノードにアクセスすることもできません。

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

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

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

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