(非推奨) Container Service の Kubernetes クラスター用の Azure AD サービス プリンシパルをセットアップする

ヒント

Azure Kubernetes Service を使用したこの記事の更新版については、「Azure Kubernetes Service (AKS) でのサービス プリンシパル」を参照してください。

警告

Azure Container Service (ACS) は非推奨となっています。 ACS に新しい機能が追加されることはありません。 API、ポータルのエクスペリエンス、CLI コマンド、ドキュメントはすべて非推奨としてマークされます。

Azure Kubernetes Service (AKS) は、Kubernetes の管理、デプロイ、および運用を簡素化するために 2017 年に導入されました。 Kubernetes オーケストレーターを使用する場合は、2020 年 1 月 31 日までに AKS に移行してください。 まずは、Azure Kubernetes Service への移行に関するページを参照してください。

詳細については、Azure.com で Azure Container Service の非推奨化に関するお知らせを参照してください。

Azure Container Service で Kubernetes クラスターを使用するには、Azure API と対話するための Azure Active Directory サービス プリンシパルが必要です。 サービス プリンシパルは、ユーザー定義ルートレイヤー 4 Azure Load Balancerなどのリソースを動的に管理するために必要です。

この記事では、Kubernetes クラスターのサービス プリンシパルをセットアップするためのさまざまなオプションを紹介します。 たとえば、Azure CLI をインストールしてセットアップした場合は、az acs create コマンドを実行して、Kubernetes クラスターとサービス プリンシパルを同時に作成できます。

サービス プリンシパルの要件

次の要件を満たす既存の Azure AD サービス プリンシパルを使用することも、新たに作成することもできます。

  • スコープ: リソース グループ

  • ロール: 共同作成者

  • クライアント シークレット: パスワードである必要があります。 現時点では、証明書の認証用に設定されたサービス プリンシパルを使用することはできません。

重要

サービス プリンシパルを作成するには、アプリケーションを Azure AD テナントに登録し、サブスクリプション内のロールにアプリケーションを割り当てるためのアクセス許可が必要です。 必要なアクセス許可があるかどうかは、ポータルで確認します。

オプション 1: Azure AD にサービス プリンシパルを作成する

Kubernetes クラスターをデプロイする前に Azure AD サービス プリンシパルを作成する場合、Azure にはいくつかの方法が用意されています。

以下のコマンド例では、Azure CLI でこの操作を行う方法を示しています。 代わりに、Azure PowerShellポータル、またはその他の方法を使用して、サービス プリンシパルを作成することもできます。

az login

az account set --subscription "mySubscriptionID"

az group create --name "myResourceGroup" --location "westus"

az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>"

出力は次のようになります (ここで示されている出力は編集されています)。

サービス プリンシパルの作成

強調表示されているのは、クラスターデプロイのサービス プリンシパル パラメーターとして使用するクライアント IDappId () とクライアント シークレット (password) です。

Kubernetes クラスターの作成時にサービス プリンシパルを指定する

Kubernetes クラスターを作成するときに、既存のサービス プリンシパルのクライアント ID (アプリケーション ID の場合は appId とも呼ばれます) とクライアント シークレット (password) をパラメーターとして指定します。 サービス プリンシパルが、この記事の冒頭の要件を満たしていることを確認します。

これらのパラメーターは、ポータル、Azure コマンド ライン インターフェイス (CLI)Azure portal、またはその他の方法を使用して Kubernetes クラスターをデプロイするときに指定できます。

ヒント

クライアント ID を指定するときは、サービス プリンシパルの ObjectId ではなく appId を使用してください。

次の例では、Azure CLI でパラメーターを渡す 1 つの方法を示しています。 この例では、Kubernetes クイックスタート テンプレートを使用します。

  1. テンプレート パラメーター ファイル azuredeploy.parameters.json を GitHub からダウンロードします。

  2. サービス プリンシパルを指定するには、ファイルの servicePrincipalClientIdservicePrincipalClientSecret に値を入力します (また、独自の値 dnsNamePrefix を指定する必要があります sshRSAPublicKey。後者は、クラスターにアクセスするための SSH 公開キーです)。ファイルを保存します。

    サービス プリンシパルのパラメーターを渡す

  3. 次のコマンドを実行します。その際、--parameters を使用して、azuredeploy.parameters.json ファイルへのパスを設定します。 このコマンドは、クラスターを米国西部リージョンに作成する myResourceGroup というリソース グループにデプロイします。

    az login
    
    az account set --subscription "mySubscriptionID"
    
    az group create --name "myResourceGroup" --location "westus"
    
    az group deployment create -g "myResourceGroup" --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-acs-kubernetes/azuredeploy.json" --parameters @azuredeploy.parameters.json
    

オプション 2: az acs create でクラスターを作成するときにサービス プリンシパルを生成する

az acs create コマンドを実行して Kubernetes クラスターを作成する場合は、サービス プリンシパルを自動的に生成させることができます。

他の Kubernetes クラスター作成オプションと同様に、az acs create を実行するときに、既存のサービス プリンシパルのパラメーターを指定できます。 ただし、これらのパラメーターを省略すると、Azure CLI は Container Service で使用するために 1 つのサービス プリンシパルを自動的に作成します。 これは、デプロイ中に透過的に行われます。

次のコマンドは、Kubernetes クラスターを作成し、SSH キーとサービス プリンシパル資格情報の両方を生成します。

az acs create -n myClusterName -d myDNSPrefix -g myResourceGroup --generate-ssh-keys --orchestrator-type kubernetes

重要

サービス プリンシパルを作成するための Azure AD およびサブスクリプション アクセス許可がアカウントにない場合は、Insufficient privileges to complete the operation. (この操作を完了するのに十分な特権がありません) というようなエラーが生成されます。

その他の注意点

  • サブスクリプションにサービス プリンシパルを作成するためのアクセス許可がない場合、必要なアクセス許可の割り当てを Azure AD またはサブスクリプション管理者に依頼するか、Azure Container Service で使用するサービス プリンシパルの提供を管理者に求めなければならないことがあります。

  • Kubernetes のサービス プリンシパルは、クラスター構成の一部です。 ただし、クラスターのデプロイに ID を使用しないでください。

  • すべてのサービス プリンシパルは、Azure AD アプリケーションに関連付けられています。 Kubernetes クラスターのサービス プリンシパルは、有効な任意の Azure AD アプリケーション名 (たとえば https://www.contoso.org/example) に関連付けることができます。 アプリケーションの URL は、実際のエンドポイントである必要はありません。

  • サービス プリンシパルのクライアント ID を指定する場合、この記事で示したように appId の値を使用するか、対応するサービス プリンシパルの name (例: https://www.contoso.org/example) を使用することができます。

  • Kubernetes クラスター内のマスター VM とエージェント VM では、サービス プリンシパルの資格情報が /etc/kubernetes/azure.json ファイルに格納されます。

  • az acs create コマンドを使用してサービス プリンシパルを自動的に生成すると、サービス プリンシパルの資格情報は、コマンドの実行に使用されたコンピューター上の ~/.azure/acsServicePrincipal.json ファイルに書き込まれます。

  • az acs create コマンドを使用してサービス プリンシパルを自動的に生成すると、サービス プリンシパルは同じサブスクリプション内に作成された Azure Container Registry でも認証を行うことができます。

  • サービス プリンシパルの資格情報の有効期限が切れて、クラスター ノードが NotReady 状態になる可能性があります。 軽減策については、「資格情報の有効期限」セクションを参照してください。

資格情報の有効期限

サービス プリンシパルを作成するときに、--years パラメーターで独自の有効期間を指定しなかった場合、その資格情報の有効期間は、作成から 1 年です。 資格情報の有効期限が切れてクラスター ノードが NotReady 状態になる可能性があります。

サービス プリンシパルの有効期限日を確認するには、az ad app show コマンドに --debug パラメーターを指定して実行し、出力結果の下の方を見て passwordCredentialsendDate 値を探します。

az ad app show --id <appId> --debug

出力 (抜粋):

...
"passwordCredentials":[{"customKeyIdentifier":null,"endDate":"2018-11-20T23:29:49.316176Z"
...

サービス プリンシパルの資格情報の有効期限が切れた場合は、az ad sp reset-credentials コマンドを使用して資格情報を更新します。

az ad sp reset-credentials --name <appId>

出力:

{
  "appId": "4fd193b0-e6c6-408c-a21a-803441ad2851",
  "name": "4fd193b0-e6c6-408c-a21a-803441ad2851",
  "password": "404203c3-0000-0000-0000-d1d2956f3606",
  "tenant": "72f988bf-0000-0000-0000b-2d7cd011db47"
}

次に、すべてのクラスター ノードの /etc/kubernetes/azure.json を新しい資格情報で更新し、ノードを再起動します。

次のステップ