Azure Kubernetes Service on Azure Stack HCI and Windows Server を使って Windows コンテナー用のグループ管理サービス アカウント (gMSA) を構成します。

適用対象: AKS on Azure Stack HCI 22H2、AKS on Windows Server

AD 認証を使用するために、Windows コンテナー用のグループ管理サービス アカウント (gMSA) を構成して、ドメインに参加していないホストを使用して実行できます。 グループ管理サービス アカウントは、複数のコンピューターでパスワードを知ることなく ID を共有できるように設計された、Windows Server 2012 で導入された特殊な種類のサービス アカウントです。 Windows コンテナーをドメインに参加させることはできませんが、Windows コンテナーで実行される Windows アプリケーションの多くは AD 認証を必要とします。

Note

Kubernetes コミュニティが Windows コンテナーでの gMSA の使用をサポートしている方法については、gMSA の構成に関するページを参照してください。

ドメインに参加していないホストを使用するコンテナーの gMSA のアーキテクチャ

ドメインに参加していないホストを使用するコンテナーの gMSA では、ホスト ID ではなく移植可能なユーザー ID を使用して gMSA 資格情報を取得します。 そのため、Windows ワーカー ノードをドメインに手動で参加させる必要はなくなりました。 ユーザー ID は、Kubernetes にシークレットとして保存されます。 次の図は、ドメインに参加していないホストを使用するコンテナーに対して gMSA を構成するプロセスを示しています。

グループ管理サービス アカウント バージョン 2 の図

ドメインに参加していないホストを使用するコンテナーの gMSA は、ホスト ノードをドメインに参加させることなく gMSA でコンテナーを作成するという柔軟性を提供します。 Windows Server 2019 以降では ccg.exe がサポートされており、これにより Active Directory から gMSA 資格情報を取得するプラグイン メカニズムを有効にできます。 この ID を使用して、コンテナーを起動できます。 ccg.exe の詳細については、「ICcgDomainAuthCredentials インターフェイス」を参照してください。

ドメインに参加していないホストを使用するコンテナーとドメインに参加しているホストを使用するコンテナーの gMSA の比較

gMSA が導入された当初は、コンテナー ホストをドメインに参加させる必要がありました。これにより、ユーザーが Windows ワーカー ノードをドメインに手動で参加させるための大量のオーバーヘッドが発生していました。 この制限は、ドメインに参加していないホストを使用するコンテナー用の gMSA で対処されています。そのため、ユーザーは、ドメインに参加していないホストで gMSA を使用できるようになりました。 gMSA のその他の機能強化には、次のようなものがあります。

  • Windows ワーカー ノードを手動でドメインに参加させる必要がなくなりました。そのため、これまで発生していたオーバーヘッドがかなり軽減されます。 スケーリング シナリオにとって、これによりプロセスが簡略化されます。
  • ローリング アップデートのシナリオでは、ユーザーはノードをドメインに再度参加させる必要がなくなりました。
  • ワーカー ノードのマシン アカウントを管理して gMSA サービス アカウントのパスワードを取得するためのプロセスがより簡単になりました。
  • Kubernetes で gMSA を構成するエンド ツー エンドのプロセスの複雑さが減りました。

開始する前に

グループ管理サービス アカウントを使用して Windows コンテナーを実行するには、次のものが必要です。

  • Windows Server 2012 以降を実行しているドメイン コントローラーが少なくとも 1 つある Active Directory ドメイン。 フォレストまたはドメインには、gMSA を使用するための機能レベルの要件はありませんが、gMSA パスワードを配布するには、Windows Server 2012 以降を実行しているドメイン コントローラーを使用する必要があります。 詳細については、Active Directory の gMSA に関する要件に関するページを参照してください。
  • gMSA アカウントを作成するためのアクセス許可。 gMSA アカウントを作成するには、ドメイン管理者であるか、msDS-GroupManagedServiceAccount オブジェクトを作成するアクセス許可を付与されたアカウントを使用する必要があります。
  • インターネットにアクセスして、CredentialSpec PowerShell モジュールをダウンロードします。 切断された環境で作業している場合は、インターネットにアクセスできるコンピューターにモジュールを保存して、開発マシンまたはコンテナー ホストにコピーできます。
  • gMSA と AD 認証を確実に機能させるには、Azure Stack HCI と Windows Server クラスター ノードが時刻をドメイン コントローラーまたはその他のタイム ソースと同期するように構成されていることを確認してください。 また、Hyper-V がどの仮想マシンに対しても時刻を同期するように構成されていることも確認する必要があります。

ドメイン コントローラー内に gMSA を準備する

ドメイン コントローラー内に gMSA を準備するには、次の手順に従います。

  1. ドメイン コントローラーで Active Directory を準備し、gMSA アカウントを作成します。

  2. ドメイン ユーザー アカウントを作成します。 このユーザー アカウントおよびパスワードは Kubernetes シークレットとして保存され、gMSA パスワードを取得するために使用されます。

  3. gMSA アカウントを作成し、手順 2. で作成した gMSA アカウントのパスワードを読み取るためのアクセス許可を付与するには、次の New-ADServiceAccount PowerShell コマンドを実行します。

     New-ADServiceAccount -Name "<gmsa account name>" -DnsHostName "<gmsa account name>.<domain name>.com" -ServicePrincipalNames "host/<gmsa account name>", "host/<gmsa account name>.<domain name>.com" -PrincipalsAllowedToRetrieveManagedPassword <username you created earlier> 
    

    -PrincipalsAllowedToRetrieveManagedPassword では、次の例に示すように、前に作成したドメイン ユーザー名を指定します。

    New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.akshcitest.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.akshcitest.com" -PrincipalsAllowedToRetrieveManagedPassword "testgmsa"
    

gMSA 資格情報の仕様 JSON ファイルを準備する

gMSA 資格情報の仕様 JSON ファイルを準備するには、資格情報の仕様を作成する手順に従います。

クラスターで Windows ポッドおよびコンテナーの gMSA を構成する

Kubernetes コミュニティでは、gMSA のドメイン参加済み Windows ワーカー ノードが既にサポートされています。 AKS on Azure Stack HCI and Windows Server で Windows ワーカー ノードをドメインに参加させる必要がない場合でも、その他に必須の構成手順があります。 これらの手順には、Webhook、カスタム リソース定義 (CRD)、および資格情報の仕様のインストールや、ロールベースのアクセス制御 (RBAC ロール) の有効化が含まれます。 次の手順では、構成プロセスを簡略化するために作成された PowerShell コマンドを使用します。

以下の手順を完了する前に、AksHci PowerShell モジュールがインストールされており、kubectl がクラスターに接続できることを確認してください。

  1. Webhook をインストールするには、次の Install-AksHciGmsaWebhook PowerShell コマンドを実行します。

    Install-AksHciGMSAWebhook -Name <cluster name>
    

    Webhook ポッドが正常に実行されていることを確認するには、次のコマンドを実行します。

    kubectl get pods -n kube-system | findstr gmsa
    

    gmsa-webhook プレフィックスが付いた、実行中のポッドが 1 つ表示されます。

  2. Active Directory ユーザー資格情報を格納するシークレット オブジェクトを作成します。 以下の構成データを完成させ、設定を secret.yaml という名前のファイルに保存します。

    apiVersion: v1
    kind: Secret
    metadata:
       name: <secret-name>
       namespace: <secret under namespace other than the default>
    type: Opaque
    stringData:
       domain: <FQDN of the domain, for example: akshcitest.com>
       username: <domain user who can retrieve the gMSA password>
       password: <password>
    

    次に、以下のコマンドを実行してシークレット オブジェクトを作成します。

    kubectl apply -f secret.yaml
    

    Note

    既定以外の名前空間の下にシークレットを作成する場合は、デプロイの名前空間を必ず同じ名前空間に設定してください。

  3. Add-AksHciGMSACredentialSpec PowerShell コマンドレットを使用して gMSA CRD を作成し、ロールベースのアクセス制御 (RBAC) を有効にしてから、特定の gMSA 資格情報仕様ファイルを使用するようにサービス アカウントにロールを割り当てます。 これらの手順の詳細については、Kubernetes の記事「Configure gMSA for Windows pods and containers」 (Windows ポッドとコンテナーの gMSA の構成) をご覧ください。

    次の PowerShell コマンドの入力として、JSON 資格情報の仕様を使用します (アスタリスク * の付いたパラメーターは必須です)。

    Add-AksHciGMSACredentialSpec -Name <cluster name>*  
      -credSpecFilePath <path to JSON credspec>* 
      -credSpecName <name for credspec as the k8s GMSACredentialSpec object>* 
      -secretName <name of secret>* 
      -secretNamespace <namespace of secret>  
      -serviceAccount <name of service account to bind to clusterrole>  
      -clusterRoleName <name of clusterrole to use the credspec>*  
      -overwrite 
    

    例を表示するには、次のコードを参照してください。

    Add-AksHciGMSACredentialSpec -Name mynewcluster 
      -credSpecFilePath .\credspectest.json 
      -credSpecName credspec-mynewcluster 
      -secretName mysecret 
      -clusterRoleName clusterrole-mynewcluster
    

アプリケーションの配置

次の設定例を使用して、デプロイの YAML ファイルを作成します。 必須のエントリとしては、serviceAccountNamegmsaCredentialSpecNamevolumeMounts、および dnsconfig があります。

  1. サービス アカウントを追加します。

    serviceAccountName: default
       securityContext: 
         windowsOptions: 
           gmsaCredentialSpecName:
    
  2. 資格情報の仕様オブジェクトを追加します。

    securityContext: 
         windowsOptions: 
           gmsaCredentialSpecName: <cred spec name>
    
  3. デプロイのシークレットをマウントします。

    volumeMounts:
         - name: <volume name>
           mountPath: <vmount path>
           readOnly: true
       volumes:
         - name: <volume name>
           secret:
             secretName: <secret name>
             items:
               - key: username
                 path: my-group/my-username
    
  4. ドメイン コントローラーの IP アドレスとドメイン名を dnsConfig に追加します。

    dnsConfig: 
         nameservers:
           - <IP address for domain controller>
         searches: 
           - <domain>
    

コンテナーが gMSA で動作していることを確認する

コンテナーをデプロイしたら、次の手順を使用して、それが動作していることを確認します。

  1. 次のコマンドを実行して、デプロイのコンテナー ID を取得します。

    kubectl get pods
    
  2. PowerShell を開き、次のコマンドを実行します。

    kubectl exec -it <container id> powershell
    
  3. コンテナーに移動したら、次を実行します。

    Nltest /parentdomain 
    Nltest /sc_verify:<domain> 
    
    Connection Status = 0 0x0 NERR_Success The command completed successfully. 
    

    この出力は、コンピューターがドメイン コントローラーによって認証されており、クライアント コンピューターとドメイン コントローラーの間にセキュリティで保護されたチャネルが存在することを示しています。

  4. コンテナーが有効な Kerberos Ticket Granting Ticket (TGT) を取得できるかどうかを確認します。

    klist get krbtgt
    
    A ticket to krbtgt has been retrieved successfully
    

クラスターの gMSA 設定をクリーンアップする

gMSA 設定をクリーンアップする必要がある場合は、次のアンインストール手順を使用します。

資格情報の仕様をアンインストールする

アンインストールするには、次の Remove-AksHcigmsaCredentialSpec PowerShell コマンドを実行します。

Remove-AksHciGMSACredentialSpec -Name <cluster name> -credSpecName <cred spec object name> -clusterRoleName <clusterrole object name> -serviceAccount <serviceaccount object name> -secretNamespace <namespace of the secret object>

Webhook をアンインストールする

Webhook をアンインストールするには、次の Uninstall-AksHciGMSAWebhook PowerShell コマンドを実行します。

Uninstall-AksHciGMSAWebhook -Name <cluster name>

次のステップ