Flex ノードのホストと ID を準備する (プレビュー)

Important

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は運用環境での使用を目的としていません。 詳細については、次のサポート記事を参照してください。

Linux ホストをフレックス ノードとしてアタッチする前に、ホストを準備し、計画中に選択した ID を構成し、その ID に Azure Kubernetes Service (AKS) クラスターへのアクセス権を付与します。

この記事では、あなたが次のことを行います。

  • ホストの要件を確認し、Linux ホストとそのAzure ID をプロビジョニングまたは選択します。
  • ホストを準備して検査し、添付ファイル ワークフローで使用される値を記録します。
  • AKS クラスター スコープで ID アクセスを割り当て、その ID を確認します。

必要なツールとネットワーク アクセスを備える Linux 互換の Bash 環境で、この記事の管理コマンドを実行します。 この記事では、その環境を Bash 環境と呼びます。 クラスターに参加する別個のマシンは 、フレックス ノード ホストです。は、ステップによって明示的に指示された場合にのみ、そこでコマンドを実行します。

始める前の準備

デプロイ環境を読み込む

新しい Bash セッションを開始し、計画記事から環境ファイルを特定して読み込みます。 <deployment-name>をデプロイ ラベルに置き換えます。

export FLEXNODE_DEPLOYMENT="<deployment-name>"
export FLEXNODE_ENV_FILE="${HOME}/.config/aks-flexnode/${FLEXNODE_DEPLOYMENT}.env"
test -s "${FLEXNODE_ENV_FILE}"
source "${FLEXNODE_ENV_FILE}"

環境ファイルは、この記事で読み取る共有デプロイ値 ( WORK_DIRなど) を提供します。この記事では、ダウンロードと生成されたファイルを格納する Bash 環境内のディレクトリを指定します。 既定では、WORK_DIR は ~/.local/share/aksflexnode/<deployment-name>です。 この記事では、必要なその他の変数を派生させます。 環境ファイルをまだ作成していない場合は、最初に 「Flex ノードのデプロイを計画する 」を完了してください。

ファイルが見つからないか、読み込めない場合は、続行する前にいったん中止して、計画記事に戻ってください。

アクティブなサブスクリプションを設定し、選択したクラスターを確認します。

az account set --subscription "${SUBSCRIPTION_ID}"

az aks show \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${CLUSTER_NAME}" \
    --query "{Name:name,ResourceId:id,ProvisioningState:provisioningState}" \
    --output table

リソース ID が AKS_RESOURCE_ID と一致し、プロビジョニング状態が Succeededされたら続行します。

1. ホストの要件を確認する

次の要件を満たす専用ホストを使用します。

  • Ubuntu 24.04 LTS、Azure Linux 3.x、または Red Hat Enterprise Linux (RHEL) 9 または 10 を実行している AMD64 または ARM64 ホスト。
  • 有効な DNS サブドメイン名である一意のホスト名。 エージェントは、ノードを登録するときに小文字に変換します。
  • /var/libでは、少なくとも 4 つの vCPU と少なくとも 8 GiB の空き容量。
  • ホスト上のルートまたはパスワードなしの sudo アクセス権を持つ SSH アカウント。
  • AKS API サーバー、Azure Resource Manager、Microsoft Entra ID、選択した flex ノードリリースとアーティファクト ミラー、および必要なコンテナー レジストリへのネットワーク アクセス。
  • Flex ノード ホスト ネットワークと AKS マネージド ノード ネットワークの間の既存のレイヤー 3 接続。 ホストと AKS クラスターは、同じAzureリージョンに存在する必要はありません。

Bash 環境は、SSH 経由で Flex ノード ホストに接続できる必要もあります。 別の承認された管理パスがある場合、パブリック IP アドレスは必要ありません。

2. ホストと ID をプロビジョニングまたは選択する

flex nodes の ID とアクセスの概念 で選択した ID オプションに対応するセクションのみを完了してください。 同じホストに対して複数の非消耗品Azure ID モードを構成しないでください。

Tip

コンピューターをAzure外に接続しますか? マシンが既に Arc 対応の場合は、Azure Arcマネージド ID を使用するか、サービス プリンシパルを使用します。 Azure仮想マシンマネージド ID は、flex ノード ホストが Azure VM の場合にのみ使用します。

すべての ID オプションで使用される SSH キー パスを設定します。

export SSH_PRIVATE_KEY_PATH="<path-to-private-key>"
export SSH_PUBLIC_KEY_PATH="<path-to-public-key>"

各 ID オプションでは、2 つのホスト アドレスも確立されます。 FLEX_HOST_SSH_TARGET は、Bash 環境で使用されるアドレスです。 FLEX_HOST_PRIVATE_IP は、AKS マネージド ノード ネットワークから到達可能なホスト アドレスです。 FLEX_HOST_PRIVATE_IPがFLEX_HOST_SUBNET_CIDRに属しており、AKS マネージド ノード ネットワークから到達可能なアドレスであることをネットワーク管理者に確認します。 flex ノード アドレスとして、別のパブリック アドレスまたは管理専用アドレスを使用しないでください。

Azure Arc マネージド ID を使用する

Azure Arcに既に接続されているホストには、このオプションを使用します。必要に応じて、Azure Arcが有効なサーバーを使用してハイブリッド マシンを接続するに従います。

Arc リソースの値とホスト アドレスを設定します。

export ARC_RESOURCE_GROUP="<arc-machine-resource-group>"
export ARC_MACHINE_NAME="<arc-machine-name>"
export FLEX_HOST_SSH_TARGET="<admin-user>@<reachable-host-address>"
export FLEX_HOST_PRIVATE_IP="<private-ip-reachable-from-aks>"

リソース ID、接続状態、およびプリンシパル オブジェクト ID を取得します。

ARC_RESOURCE_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${ARC_RESOURCE_GROUP}/providers/Microsoft.HybridCompute/machines/${ARC_MACHINE_NAME}"
export ARC_RESOURCE_ID

HOST_PRINCIPAL_OBJECT_ID="$(az resource show \
    --ids "${ARC_RESOURCE_ID}" \
    --query identity.principalId \
    --output tsv)"
export HOST_PRINCIPAL_OBJECT_ID

az resource show \
    --ids "${ARC_RESOURCE_ID}" \
    --query "{Name:name,Status:properties.status,IdentityType:identity.type,PrincipalId:identity.principalId}" \
    --output yaml

Status がConnectedされ、PrincipalId が設定されている場合は続行します。

ホスト上の Connected Machine エージェントとハイブリッド インスタンス メタデータ サービスを確認します。

ssh -i "${SSH_PRIVATE_KEY_PATH}" "${FLEX_HOST_SSH_TARGET}" \
    'sudo azcmagent show && systemctl is-active himdsd'

azcmagent showが、ARC_RESOURCE_ID、ARC_RESOURCE_GROUP、およびARC_MACHINE_NAMEと同じサブスクリプション ID、リソース グループ、およびマシン名を報告することを確認します。 また、 himdsd がアクティブであることを確認します。 リソースが一致しない場合は、Arc リソースの値を停止して修正してから、アクセスを割り当てます。

Arc と ID の値を記録します。

set_flexnode_env ARC_RESOURCE_GROUP "${ARC_RESOURCE_GROUP}"
set_flexnode_env ARC_MACHINE_NAME "${ARC_MACHINE_NAME}"
set_flexnode_env ARC_RESOURCE_ID "${ARC_RESOURCE_ID}"
set_flexnode_env FLEX_HOST_SSH_TARGET "${FLEX_HOST_SSH_TARGET}"
set_flexnode_env FLEX_HOST_PRIVATE_IP "${FLEX_HOST_PRIVATE_IP}"
set_flexnode_env HOST_PRINCIPAL_OBJECT_ID "${HOST_PRINCIPAL_OBJECT_ID}"
set_flexnode_env HOST_IDENTITY_CLIENT_ID ""

サービス プリンシパルを使用する

このオプションは、サポートされている別の仮想マシンまたはベアメタル ホストに使用します。 有効期間の長いクライアント シークレットよりも証明書資格情報を優先します。 次の手順では、評価用の自己署名証明書を使用して専用のアプリケーションとサービス プリンシパルを作成します。 クライアント シークレットを作成したり、Azureロールを割り当てたりすることはありません。 手順 4 でターゲット AKS クラスターへのアクセスを許可します。

続行する前に、次の操作を行います。

  • Bash 環境に OpenSSL をインストールし、az login --certificateをサポートする up-to-date Azure CLIを使用します。
  • アプリケーションを登録し、ターゲット サブスクリプションに関連付けられているMicrosoft Entra テナントにサービス プリンシパルを作成できるアカウントでサインインします。 サブスクリプションAzure所有権だけでは、これらのディレクトリアクセス許可は付与されません。 テナントでアプリケーションの登録が制限されている場合は、テナント管理者に問い合わせてください。 Azure CLIを使用したAzure サービス プリンシパルの作成を参照してください。
  • 組織が自己署名証明書の評価を許可していることを確認します。 既存の承認済み ID の場合は、テナント ID、アプリケーション クライアント ID、サービス プリンシパル オブジェクト ID、保護された PEM ファイルを使用し、「 サービス プリンシパルとホストの値を記録する」に進みます。

共有環境ファイルには、資格情報、秘密キー、または資格情報パスを格納しないでください。 PEM ファイルを印刷したり、ソース管理に含めたりしないでください。 PEM ファイルには暗号化されていない秘密キーが含まれているため、エージェントは対話型のパスワード プロンプトなしで認証できます。 ファイルのアクセス許可と承認されたホスト アクセス制御を使用して保護します。

証明書ベースのサービス プリンシパルを作成する

オペレーター アカウントでサインインしているときに、Bash 環境でこれらのコマンドを実行します。

  1. サブスクリプション、テナント、サインイン アカウントを確認します。

    az account set --subscription "${SUBSCRIPTION_ID}"
    az account show \
        --query "{SubscriptionId:id,TenantId:tenantId,Account:user.name}" \
        --output table
    
    SP_TENANT_ID="$(az account show --query tenantId --output tsv)"
    export SP_TENANT_ID
    

    サブスクリプションとテナントが目的のターゲットである場合にのみ続行します。

  2. 一意のアプリケーション表示名を選択し、保護された資格情報ディレクトリを作成します。

    export SP_DISPLAY_NAME="aks-flexnode-${FLEXNODE_DEPLOYMENT}-$(date -u +%Y%m%dT%H%M%SZ)"
    install -d -m 0700 "${WORK_DIR:?Load the deployment environment first.}"
    SP_CREDENTIAL_DIR="$(mktemp -d "${WORK_DIR}/sp-credential.XXXXXXXX")"
    export SP_CREDENTIAL_DIR
    export SP_CLIENT_CERTIFICATE_FILE="${SP_CREDENTIAL_DIR:?Credential directory wasn't created.}/sp-client.pem"
    
  3. 30 日間の証明書と、証明書と秘密キーを含む PEM ファイルを結合して作成します。

    (
        set -e
        umask 077
    
        openssl req -x509 -newkey rsa:2048 -sha256 -days 30 -nodes \
            -keyout "${SP_CREDENTIAL_DIR}/sp-client.key" \
            -out "${SP_CREDENTIAL_DIR}/sp-client.crt" \
            -subj "/CN=${SP_DISPLAY_NAME}"
    
        cat "${SP_CREDENTIAL_DIR}/sp-client.crt" \
            "${SP_CREDENTIAL_DIR}/sp-client.key" \
            > "${SP_CLIENT_CERTIFICATE_FILE}"
        chmod 0600 "${SP_CLIENT_CERTIFICATE_FILE}"
        rm -f "${SP_CREDENTIAL_DIR}/sp-client.key"
    )
    
    openssl x509 \
        -in "${SP_CREDENTIAL_DIR}/sp-client.crt" \
        -noout -subject -dates
    stat -c '%a %n' "${SP_CLIENT_CERTIFICATE_FILE}"
    

    証明書の作成が失敗した場合は停止します。 PEM アクセス許可が 600されていることを確認します。 30 日間の有効性は、ローテーション ポリシーではなく、評価用です。 ホストがアタッチされたままの場合は、有効期限が切れる前に、承認されたプロセスで資格情報を置き換えます。

  4. パブリック証明書のみをアップロードして、アプリケーションとサービス プリンシパルを作成します。

    SP_CLIENT_ID="$(az ad sp create-for-rbac \
        --name "${SP_DISPLAY_NAME}" \
        --cert "@${SP_CREDENTIAL_DIR}/sp-client.crt" \
        --query appId \
        --output tsv)"
    export SP_CLIENT_ID
    

    コマンドが成功し、アプリケーション クライアント ID が返された場合にのみ続行します。 このコマンドは、証明書の有効期限に合わせて資格情報の終了日を調整したことを報告できます。 --roleまたは--scopesを追加しないでください。後のロールの割り当ては AKS クラスターに制限されます。 既存のアプリケーションに対して作成を再実行して資格情報をローテーションしないでください。

  5. サービス プリンシパル オブジェクト ID を取得し、登録されている資格情報を調べます。

    SP_OBJECT_ID="$(az ad sp show \
        --id "${SP_CLIENT_ID}" \
        --query id \
        --output tsv)"
    export SP_OBJECT_ID
    
    az ad sp show \
        --id "${SP_CLIENT_ID}" \
        --query "{ClientId:appId,ServicePrincipalObjectId:id}" \
        --output table
    
    az ad app show \
        --id "${SP_CLIENT_ID}" \
        --query "{ClientId:appId,PasswordCredentials:length(passwordCredentials),Certificates:keyCredentials[].{KeyId:keyId,Expires:endDateTime}}" \
        --output json
    

    サービス プリンシパル オブジェクト ID が設定されていること、両方のクライアント ID が SP_CLIENT_ID一致していること、 PasswordCredentials が 0されていること、および予想される有効期限が指定された証明書が 1 つだけ登録されていることを確認します。 ディレクトリ レプリケーションによって検索が遅れる場合は、しばらく待ってから、別のアプリケーションを作成するのではなく、検索を再試行してください。

資格情報のみのテストの場合は、「 サービス プリンシパルの確認」の証明書認証チェックのみを実行します。 Azureロールを割り当てたり、そのチェックのためにホストを準備したりする必要はありません。 テストが完了したら、 専用のテスト アプリケーションとローカル資格情報を削除します。

サービス プリンシパルとホストの値を記録する

ホスト アドレスを設定します。 既存の ID を選択した場合は、最初に SP_TENANT_ID、 SP_CLIENT_ID、および SP_OBJECT_ID をその識別子に設定します。

export FLEX_HOST_SSH_TARGET="<admin-user>@<reachable-host-address>"
export FLEX_HOST_PRIVATE_IP="<private-ip-reachable-from-aks>"

: "${SP_TENANT_ID:?Set the Microsoft Entra tenant ID.}"
: "${SP_CLIENT_ID:?Set the application client ID.}"
: "${SP_OBJECT_ID:?Set the service principal object ID.}"
export HOST_IDENTITY_CLIENT_ID=""
export HOST_PRINCIPAL_OBJECT_ID="${SP_OBJECT_ID}"

set_flexnode_env FLEX_HOST_SSH_TARGET "${FLEX_HOST_SSH_TARGET}"
set_flexnode_env FLEX_HOST_PRIVATE_IP "${FLEX_HOST_PRIVATE_IP}"
set_flexnode_env SP_TENANT_ID "${SP_TENANT_ID}"
set_flexnode_env SP_CLIENT_ID "${SP_CLIENT_ID}"
set_flexnode_env SP_OBJECT_ID "${SP_OBJECT_ID}"
set_flexnode_env HOST_IDENTITY_CLIENT_ID "${HOST_IDENTITY_CLIENT_ID}"
set_flexnode_env HOST_PRINCIPAL_OBJECT_ID "${HOST_PRINCIPAL_OBJECT_ID}"

SP_OBJECT_ID は エンタープライズ アプリケーションのオブジェクト ID で、サービス プリンシパル オブジェクト ID とも呼ばれます。 これは、アプリ登録のオブジェクト ID ではありません。 SP_CLIENT_ID、SP_OBJECT_ID、および証明書が同じサービス プリンシパルに属していることを確認します。

ブートストラップは、 SP_TENANT_ID と SP_CLIENT_ID を、生成されたエージェント構成の azure.servicePrincipal.tenantId と azure.servicePrincipal.clientId にマップします。 SP_OBJECT_IDは、エージェントのクライアント ID としてではなく、Azure ロールの割り当てに使用されます。 証明書ファイル フィールド、完全な編集済み構成図形、および安全な検証コマンドについては、 レンダリングされたサービス プリンシパル構成の検査を参照してください。

ID 検証とホスト ブートストラップのために、保護された PEM ファイルを保持します。 添付ファイルの前に、承認された資格情報管理プロセスを通じてホストで使用できるようにします。 共有環境ファイルではなく、承認された資格情報管理プロセスを使用してその場所を記録します。 ホストの 準備と検査に進み、AKS ロールを割り当てます。

Azure仮想マシンのマネージド ID を使用する

Azure VM には、このオプションを使用します。 次のクイック スタート: Azure CLIを使用して Linux 仮想マシンを作成するか、既存の VM を選択して VM を作成します。 このデプロイ用に計画されている Flex ノード ホスト ネットワークに VM を配置します。 Bash 環境に別の承認された SSH パスがある場合、パブリック IP アドレスは必要ありません。

VM の値を設定します。

export VM_RESOURCE_GROUP="<vm-resource-group>"
export VM_NAME="<vm-name>"
export VM_ADMIN_USER="<vm-admin-user>"

VM リソース ID とホスト アドレスを取得します。 SSH ターゲットは、VM にパブリック IP アドレスがある場合はパブリック IP アドレスを使用し、それ以外の場合はプライベート アドレスを使用します。

VM_RESOURCE_ID="$(az vm show \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --query id \
    --output tsv)"
export VM_RESOURCE_ID

FLEX_HOST_PRIVATE_IP="$(az vm show \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --show-details \
    --query privateIps \
    --output tsv)"
export FLEX_HOST_PRIVATE_IP

VM_PUBLIC_IP="$(az vm show \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --show-details \
    --query publicIps \
    --output tsv)"
export VM_PUBLIC_IP

export FLEX_HOST_SSH_TARGET="${VM_ADMIN_USER}@${VM_PUBLIC_IP:-${FLEX_HOST_PRIVATE_IP}}"

VM に対して返されたプライベート アドレスを確認します。

az vm list-ip-addresses \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --query "[0].virtualMachine.{Name:name,PrivateAddresses:network.privateIpAddresses}" \
    --output table

FLEX_HOST_PRIVATE_IP FLEX_HOST_SUBNET_CIDRに属し、AKS マネージド ノード ネットワークから到達可能な 1 つのプライベート アドレスが含まれている場合にのみ続行します。 Azureが複数のアドレスを返す場合は、続行する前に、計画された flex ノード アドレスにFLEX_HOST_PRIVATE_IPを設定します。

VM にパブリック IP アドレスがない場合、または Bash 環境が別の承認された管理パスを介してホストに到達する場合は、bash 環境が到達できるアドレスまたはホスト名に FLEX_HOST_SSH_TARGET を設定します。

次のいずれかのマネージド ID オプションを完了します。

システムによって割り当てられた管理ID

システム割り当てマネージド ID を有効にします。

az vm identity assign \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --output none

そのプリンシパル オブジェクト ID を取得します。

HOST_PRINCIPAL_OBJECT_ID="$(az vm show \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --query identity.principalId \
    --output tsv)"
export HOST_PRINCIPAL_OBJECT_ID

export HOST_IDENTITY_CLIENT_ID=""

ユーザー指定のマネージド ID

Azure CLIを使用してユーザー割り当てマネージド ID を管理するに従って、ID を作成または選択します。

ID 値を設定します。

export USER_ASSIGNED_IDENTITY_RESOURCE_GROUP="<identity-resource-group>"
export USER_ASSIGNED_IDENTITY_NAME="<identity-name>"

ID 識別子を取得します。

USER_ASSIGNED_IDENTITY_RESOURCE_ID="$(az identity show \
    --resource-group "${USER_ASSIGNED_IDENTITY_RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query id \
    --output tsv)"
export USER_ASSIGNED_IDENTITY_RESOURCE_ID

HOST_PRINCIPAL_OBJECT_ID="$(az identity show \
    --resource-group "${USER_ASSIGNED_IDENTITY_RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query principalId \
    --output tsv)"
export HOST_PRINCIPAL_OBJECT_ID

HOST_IDENTITY_CLIENT_ID="$(az identity show \
    --resource-group "${USER_ASSIGNED_IDENTITY_RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query clientId \
    --output tsv)"
export HOST_IDENTITY_CLIENT_ID

VM に ID を割り当てます。

az vm identity assign \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --identities "${USER_ASSIGNED_IDENTITY_RESOURCE_ID}" \
    --output none

選択した ID が VM に一覧表示されることを確認します。

az vm identity show \
    --resource-group "${VM_RESOURCE_GROUP}" \
    --name "${VM_NAME}" \
    --query "{Type:type,UserAssignedIdentities:userAssignedIdentities}" \
    --output yaml

出力に USER_ASSIGNED_IDENTITY_RESOURCE_IDが含まれている場合は続行します。

VM ID を記録する

VM と ID の値を記録します。

set_flexnode_env VM_RESOURCE_GROUP "${VM_RESOURCE_GROUP}"
set_flexnode_env VM_NAME "${VM_NAME}"
set_flexnode_env VM_ADMIN_USER "${VM_ADMIN_USER}"
set_flexnode_env VM_RESOURCE_ID "${VM_RESOURCE_ID}"
set_flexnode_env VM_PUBLIC_IP "${VM_PUBLIC_IP}"
set_flexnode_env FLEX_HOST_SSH_TARGET "${FLEX_HOST_SSH_TARGET}"
set_flexnode_env FLEX_HOST_PRIVATE_IP "${FLEX_HOST_PRIVATE_IP}"
set_flexnode_env HOST_PRINCIPAL_OBJECT_ID "${HOST_PRINCIPAL_OBJECT_ID}"
set_flexnode_env HOST_IDENTITY_CLIENT_ID "${HOST_IDENTITY_CLIENT_ID}"

3. ホストを準備して検査する

ホストに接続します。

ssh -i "${SSH_PRIVATE_KEY_PATH}" "${FLEX_HOST_SSH_TARGET}"

ホストで、オペレーティング システム、アーキテクチャ、ホスト名、CPU、使用可能なストレージを調べます。

source /etc/os-release
printf 'Operating system: %s %s\n' "${NAME}" "${VERSION_ID}"
printf 'Architecture: %s\n' "$(uname -m)"
printf 'Host name: %s\n' "$(hostname)"
printf 'vCPUs: %s\n' "$(nproc)"
free -h
df -h /var/lib

手順 1 の結果とホスト要件を比較します。 続行する前に、違いを解決してください。

ブートストラップ スクリプトには、ホストに curl、 jq、および tar が必要であり、存在しない場合は停止します。 Flex ノード エージェントは、ブートストラップ中に残りのランタイム パッケージをインストールします。

イメージにまだ含まれていない 3 つのいずれかをインストールします。

# Ubuntu
sudo apt-get update && sudo apt-get install -y curl jq tar

# Azure Linux 3
sudo tdnf install -y curl jq tar

ホスト セッションを終了します。

exit

Bash 環境から実際の Linux ホスト名を読み取ります。

FLEX_HOST_NAME="$(ssh \
    -i "${SSH_PRIVATE_KEY_PATH}" \
    "${FLEX_HOST_SSH_TARGET}" \
    hostname)"
export FLEX_HOST_NAME

printf 'Flex host name: %s\n' "${FLEX_HOST_NAME}"

コマンドが予期されるホスト名を返したら、続行します。

AKS API サーバーの FQDN を取得し、ホストから名前解決と HTTPS 接続を確認します。

AKS_API_FQDN="$(az aks show \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${CLUSTER_NAME}" \
    --query '(privateFqdn || fqdn)' \
    --output tsv)"
export AKS_API_FQDN
ssh -i "${SSH_PRIVATE_KEY_PATH}" "${FLEX_HOST_SSH_TARGET}" \
    "getent hosts '${AKS_API_FQDN}' && \
    timeout 5 bash -c '</dev/tcp/${AKS_API_FQDN}/443'"

名前解決または TCP 接続に失敗した場合は、続行する前に DNS、ルーティング、またはネットワーク制御を正しく行ってください。 パブリック AKS クラスターでは、そのパブリック API FQDN が使用されます。 プライベート AKS クラスターの場合、Bash 環境と Flex ノード ホスト ネットワークが解決され、プライベート API FQDN にルーティングされる必要があります。

ホスト値を記録します。 共有環境ファイルには、キーまたは資格情報の内容ではなく、パスと非セキュリティ識別子が格納されます。

set_flexnode_env SSH_PRIVATE_KEY_PATH "${SSH_PRIVATE_KEY_PATH}"
set_flexnode_env SSH_PUBLIC_KEY_PATH "${SSH_PUBLIC_KEY_PATH}"
set_flexnode_env FLEX_HOST_NAME "${FLEX_HOST_NAME}"

4. AKS ロールを割り当てる

現在のプレビュー ワークフローでは、AKS クラスター スコープで正確に Azure Kubernetes Service 共同作成者ロール が使用されます。 3 つの ID オプションはすべて、ロールベースのアクセス制御Azureサービス プリンシパル オブジェクト ID を使用します。 専用ホスト ID を使用し、「 AKS のフレックス ノードの管理と削除」の説明に従ってホストを削除するときに、この割り当てを削除します。

選択したプリンシパル オブジェクト ID を表示します。

printf 'Principal object ID: %s\n' "${HOST_PRINCIPAL_OBJECT_ID}"

値が設定され、選択した VM ID、Arc マシン、またはサービス プリンシパルに属している場合にのみ続行します。

割り当てが既に存在するかどうかを確認します。

az role assignment list \
    --assignee-object-id "${HOST_PRINCIPAL_OBJECT_ID}" \
    --scope "${AKS_RESOURCE_ID}" \
    --fill-principal-name false \
    --query "[?roleDefinitionName=='Azure Kubernetes Service Contributor Role'].{PrincipalId:principalId,Role:roleDefinitionName,Scope:scope}" \
    --output table

コマンドから行が返されない場合は、割り当てを作成します。

az role assignment create \
    --assignee-object-id "${HOST_PRINCIPAL_OBJECT_ID}" \
    --assignee-principal-type ServicePrincipal \
    --role "Azure Kubernetes Service Contributor Role" \
    --scope "${AKS_RESOURCE_ID}" \
    --output none

list コマンドをもう一度実行します。 プリンシパル ID とスコープが選択した ID と AKS_RESOURCE_IDと一致する場合は続行します。 ロール割り当ての反映には数分かかる場合があります。

5. 選択した ID を確認する

ホストをブートストラップする前に、選択した ID が認証され、正確なターゲット AKS クラスターを読み取ることができることを確認します。 ID オプションのセクションのみを完了します。

Azure Arcマネージド ID を確認する

Bash 環境で、Azure Arc対応サーバーに非セキュリティ AKS リソース ID を渡します。

[[ "${AKS_RESOURCE_ID}" == /subscriptions/*/providers/Microsoft.ContainerService/managedClusters/* ]]
printf -v AKS_RESOURCE_ID_QUOTED '%q' "${AKS_RESOURCE_ID}"

ssh -t \
    -i "${SSH_PRIVATE_KEY_PATH}" \
    "${FLEX_HOST_SSH_TARGET}" \
    "export AKS_RESOURCE_ID=${AKS_RESOURCE_ID_QUOTED}; \
    exec bash -l"

Azure Arc対応サーバーで、ハイブリッド インスタンス メタデータ サービス (HIMDS) にAzure Resource Manager トークンを要求し、それを使用して AKS リソースを読み取ります。 チャレンジ トークンを読み取るには、 himds グループのルートまたはメンバーシップが必要です。

TOKEN_URL="${IDENTITY_ENDPOINT:-http://127.0.0.1:40342/metadata/identity/oauth2/token}?api-version=2019-11-01&resource=https%3A%2F%2Fmanagement.azure.com"

CHALLENGE_TOKEN_PATH="$(curl --silent --show-error \
    --dump-header - \
    --output /dev/null \
    --header Metadata:true \
    "${TOKEN_URL}" |
    sed -n 's/^[Ww][Ww][Ww]-[Aa]uthenticate: Basic realm=//p' |
    tr -d '\r')"

test -n "${CHALLENGE_TOKEN_PATH}"
CHALLENGE_TOKEN="$(sudo cat "${CHALLENGE_TOKEN_PATH}")"

TOKEN="$(curl --fail --silent --show-error \
    --header Metadata:true \
    --header "Authorization: Basic ${CHALLENGE_TOKEN}" \
    "${TOKEN_URL}" |
    jq -r '.access_token // empty')"

test -n "${TOKEN}"

AKS_ARM_HTTP="$(curl --silent --show-error \
    --output /dev/null \
    --write-out '%{http_code}' \
    --header "Authorization: Bearer ${TOKEN}" \
    "https://management.azure.com${AKS_RESOURCE_ID}?api-version=2025-07-01")"

unset CHALLENGE_TOKEN TOKEN
printf 'AKS_ARM_HTTP=%s\n' "${AKS_ARM_HTTP}"

予想される出力: AKS_ARM_HTTP=200。 exitを実行して、Azure Arcが有効なサーバー セッションを終了します。

サービス プリンシパルを確認する

Bash 環境で、サービス プリンシパルの準備手順の組み合わせ PEM ファイルを使用します。 新しいセッションを開始した場合、または既存の ID を選択した場合は、その保護されたパスをもう一度設定します。

export SP_CLIENT_CERTIFICATE_FILE="<protected-path-to-sp-client.pem>"
test -s "${SP_CLIENT_CERTIFICATE_FILE}"

ファイルが存在しない場合、または空の場合は停止します。 共有環境ファイルにこのパスを追加しないでください。

まず、分離されたAzure CLI プロファイルを使用して証明書認証を確認します。 サブシェルは、コマンドが失敗しても一時的なトークン キャッシュを削除し、通常のAzure CLIサインインを変更しません。

(
    set -e
    SP_AZURE_CONFIG_DIR="$(mktemp -d)"
    chmod 0700 "${SP_AZURE_CONFIG_DIR}"
    trap 'rm -rf -- "${SP_AZURE_CONFIG_DIR}"' EXIT
    export AZURE_CONFIG_DIR="${SP_AZURE_CONFIG_DIR}"

    az login \
        --service-principal \
        --username "${SP_CLIENT_ID}" \
        --certificate "${SP_CLIENT_CERTIFICATE_FILE}" \
        --tenant "${SP_TENANT_ID}" \
        --allow-no-subscriptions \
        --output none

    az account get-access-token \
        --resource https://management.azure.com/ \
        --query "{Tenant:tenant,ExpiresOn:expiresOn}" \
        --output table
)

テナントがSP_TENANT_IDと一致し、トークンの有効期限が切れていないことを確認します。 このコマンドは、アクセス トークンではなく、テナントと有効期限のみを出力します。 --allow-no-subscriptionsでは、Azureアクセスを許可する前に認証をテストできます。 認証が成功しても、AKS クラスターの読み取りまたは登録のアクセス許可は証明されません。

手順 4 の AKS ロールの割り当てが反映されたら、正確なターゲット クラスターへのアクセスを確認します。

(
    set -e
    SP_AZURE_CONFIG_DIR="$(mktemp -d)"
    chmod 0700 "${SP_AZURE_CONFIG_DIR}"
    trap 'rm -rf -- "${SP_AZURE_CONFIG_DIR}"' EXIT
    export AZURE_CONFIG_DIR="${SP_AZURE_CONFIG_DIR}"

    az login \
        --service-principal \
        --username "${SP_CLIENT_ID}" \
        --certificate "${SP_CLIENT_CERTIFICATE_FILE}" \
        --tenant "${SP_TENANT_ID}" \
        --output none

    az account set --subscription "${SUBSCRIPTION_ID}"

    az aks show \
        --resource-group "${RESOURCE_GROUP}" \
        --name "${CLUSTER_NAME}" \
        --query "{Name:name,ResourceId:id,ProvisioningState:provisioningState}" \
        --output table
)

返されたリソース ID が AKS_RESOURCE_ID と一致し、プロビジョニング状態が Succeeded場合にのみ続行します。 認証が成功してもクラスター要求が拒否された場合は、再試行する前に、サービス プリンシパル オブジェクト ID、正確なロールの割り当てスコープ、伝達を確認します。 このチェックは、サービス プリンシパルとその証明書がターゲット クラスターを読み取ることができることを証明します。 ホストは、「 Flex ノードを AKS クラスターにアタッチする」で準備された資格情報を使用します。

Azure VM マネージド ID を確認する

Bash 環境で、非セキュリティ AKS リソース ID と ID クライアント ID を Azure VM に渡します。

[[ "${AKS_RESOURCE_ID}" == /subscriptions/*/providers/Microsoft.ContainerService/managedClusters/* ]]
printf -v AKS_RESOURCE_ID_QUOTED '%q' "${AKS_RESOURCE_ID}"
printf -v HOST_IDENTITY_CLIENT_ID_QUOTED '%q' "${HOST_IDENTITY_CLIENT_ID}"

ssh -t \
    -i "${SSH_PRIVATE_KEY_PATH}" \
    "${FLEX_HOST_SSH_TARGET}" \
    "export AKS_RESOURCE_ID=${AKS_RESOURCE_ID_QUOTED}; \
    export HOST_IDENTITY_CLIENT_ID=${HOST_IDENTITY_CLIENT_ID_QUOTED}; \
    exec bash -l"

Azure VM で、選択したマネージド ID からAzure Resource Manager トークンを要求し、それを使用して AKS リソースを読み取います。

TOKEN_URL="http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F"

if [ -n "${HOST_IDENTITY_CLIENT_ID}" ]; then
    ENCODED_CLIENT_ID="$(jq -rn \
        --arg value "${HOST_IDENTITY_CLIENT_ID}" \
        '$value|@uri')"
    TOKEN_URL="${TOKEN_URL}&client_id=${ENCODED_CLIENT_ID}"
fi

TOKEN="$(curl --fail --silent --show-error \
    --header Metadata:true \
    "${TOKEN_URL}" |
    jq -r '.access_token // empty')"

test -n "${TOKEN}"

AKS_ARM_HTTP="$(curl --silent --show-error \
    --output /dev/null \
    --write-out '%{http_code}' \
    --header "Authorization: Bearer ${TOKEN}" \
    "https://management.azure.com${AKS_RESOURCE_ID}?api-version=2025-07-01")"

unset TOKEN
printf 'AKS_ARM_HTTP=%s\n' "${AKS_ARM_HTTP}"

予想される出力: AKS_ARM_HTTP=200。 ユーザー割り当て ID の場合、要求では、添付ファイル ワークフローが--msi-client-idに渡すのと同じHOST_IDENTITY_CLIENT_IDが使用されます。 exitを実行して、Azure VM セッションを終了します。

添付ファイル ワークフローは、ホストが選択した ID を使用してそのAzureマシン リソースを登録するときに、最終的なエンドツーエンドのチェックを実行します。

次のステップ

次に、 準備されたホストを flex ノードとしてアタッチして確認します。