クラスター接続を使用して Azure Arc 対応 Kubernetes クラスターに安全に接続する

クラスター接続を使用すると、ファイアウォールでどの受信ポートも有効にすることなく、Azure Arc 対応 Kubernetes クラスターにどこからでも安全に接続できます。

Azure Arc 対応 Kubernetes クラスターの apiserver にアクセスすると、次のシナリオが可能になります。

  • 対話型デバッグとトラブルシューティング
  • カスタムの場所やその上に作成されたその他のリソースの Azure サービスへのクラスター アクセス

開始する前に、クラスター接続機能の概念的概要を確認してください。

前提条件

  • Azure CLI をインストールするか、最新バージョンにアップグレードします。

  • 最新バージョンの connectedk8s Azure CLI 拡張機能をインストールします。

    az extension add --name connectedk8s
    

    connectedk8s 拡張機能が既にインストールされている場合は、その拡張機能を最新バージョンに更新します。

    az extension update --name connectedk8s
    
  • プレースホルダーを置き換えて下記のコマンドを実行し、このドキュメントで使用する環境変数を設定します。

    CLUSTER_NAME=<cluster-name>
    RESOURCE_GROUP=<resource-group-name>
    ARM_ID_CLUSTER=$(az connectedk8s show -n $CLUSTER_NAME -g $RESOURCE_GROUP --query id -o tsv)
    
  • Arc 対応 Kubernetes のネットワーク要件を満たすだけでなく、送信アクセス用に次のエンドポイントを有効にします。

    エンドポイント Port
    *.servicebus.windows.net 443
    guestnotificationservice.azure.com*.guestnotificationservice.azure.com 443

    Note

    *.servicebus.windows.net ワイルドカードを特定のエンドポイントに変換するには、コマンド \GET https://guestnotificationservice.azure.com/urls/allowlist?api-version=2020-01-01&location=<location> を使用します。 このコマンド内で、<location> プレースホルダーにリージョンを指定する必要があります。

リージョン エンドポイントのリージョン セグメントを取得するには、Azure リージョン名からすべてのスペースを削除します。 たとえば、米国東部 2 リージョンのリージョン名は eastus2 となります。

たとえば、*.<region>.arcdataservices.com は、米国東部 2 リージョンでは *.eastus2.arcdataservices.com となります。

すべてのリージョンの一覧を表示するには、このコマンドを実行します。

az account list-locations -o table
Get-AzLocation | Format-Table

認証の設定

既存の Arc 対応クラスターで、Microsoft Entra 認証またはサービス アカウント トークンを使用して ClusterRoleBinding を作成します。

Microsoft Entra 認証オプション

  1. お使いの Microsoft Entra エンティティに関連付けられている objectId を取得します。

    • Microsoft Entra ユーザー アカウントの場合:

      AAD_ENTITY_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)
      
    • Microsoft Entra アプリケーションの場合:

      AAD_ENTITY_OBJECT_ID=$(az ad sp show --id <id> --query id -o tsv)
      
  2. 適切なアクセス許可を持っているエンティティを承認します。

    • クラスターでの認可チェックのために Kubernetes ネイティブの ClusterRoleBinding または RoleBinding を使用している場合は、直接アクセスのためにクラスターの apiserver を指し示す kubeconfig ファイルを使用して、このクラスターにアクセスする必要がある Microsoft Entra エンティティ (サービス プリンシパルまたはユーザー) にマップされるバインドを作成できます。 次に例を示します。

      kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --user=$AAD_ENTITY_OBJECT_ID
      
    • クラスターでの認可チェックのための Azure RBAC を使用している場合は、Microsoft Entra エンティティにマップされる適用可能な Azure ロールの割り当てを作成できます。 次に例を示します。

      az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee $AAD_ENTITY_OBJECT_ID --scope $ARM_ID_CLUSTER
      az role assignment create --role "Azure Arc Enabled Kubernetes Cluster User Role" --assignee $AAD_ENTITY_OBJECT_ID --scope $ARM_ID_CLUSTER
      

サービス アカウント トークン認証オプション

  1. Kubernetes クラスターの apiserver を指し示す kubeconfig ファイルを使用して、このコマンドを実行してサービス アカウントを作成します。 この例では、既定の名前空間にサービス アカウントを作成しますが、default の他の名前空間に置き換えることができます。

    kubectl create serviceaccount demo-user -n default
    
  2. ClusterRoleBinding を作成して、このサービス アカウントにクラスターに対する適切なアクセス許可を付与します。 最初のコマンドで別の名前空間を使用した場合は、ここで default に置き換えます。

    kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --serviceaccount default:demo-user
    
  3. 次のようにサービス アカウント トークンを作成します。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: demo-user-secret
      annotations:
        kubernetes.io/service-account.name: demo-user
    type: kubernetes.io/service-account-token
    EOF
    
    TOKEN=$(kubectl get secret demo-user-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
    
  4. コンソールに出力するトークンを取得する

    echo $TOKEN
    

クライアント デバイスからクラスターにアクセスする

これで、別のクライアントからクラスターにアクセスできます。 もう一方のクライアント デバイスで次のステップを実行します。

  1. Microsoft Entra 認証またはサービス アカウント トークン認証を使用してサインインします。

  2. 使用する認証オプションに基づき、任意の場所から (クラスターを囲むファイアウォールの外側からでも) クラスターと通信するために必要なクラスター接続の kubeconfig を取得します。

    • Microsoft Entra 認証を使用している場合:

      az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP
      
    • サービス アカウント トークン認証を使用している場合:

      az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP --token $TOKEN
      

      Note

      このコマンドを実行すると、プロキシが開き、現在のシェルがブロックされます。

  3. 別のシェル セッションで、kubectl を使用してクラスターに要求を送信します。

    kubectl get pods -A
    

これで、default 名前空間の下にあるすべてのポッドの一覧が含まれている、クラスターからの応答が表示されます。

既知の制限事項

az connectedk8s show を使用して、Arc 対応 Kubernetes エージェントのバージョンを確認します。

Kubernetes クラスターへの要求を行うときに、使用する Microsoft Entra エンティティが 200 を超えるグループに属している場合、次のエラーが発生する場合があります。

You must be logged in to the server (Error:Error while retrieving group info. Error:Overage claim (users with more than 200 group membership) is currently not supported.

これは、既知の制限です。 このエラーを回避するには:

  1. サービス プリンシパルを作成します。これは、200 を超えるグループのメンバーになる可能性が高くありません。
  2. az connectedk8s proxy コマンドを実行する前に、サービス プリンシパルを使用して Azure CLI にサインインします。

次のステップ