適用対象: Windows Server 上の AKS
この記事では、Azure Container Registry を使用してプライベート コンテナー レジストリからコンテナー イメージをデプロイする方法について説明します。これは、Windows Server デプロイ上の AKS の独自のデータセンターで実行できます。 AKS によってホストされているオンプレミスの Kubernetes クラスターにデプロイします。 Azure Container Registry では、あらゆる種類のコンテナー デプロイ用のプライベート レジストリにコンテナー イメージや成果物をビルド、保存、管理できます。
この記事では、Azure にプライベート コンテナー レジストリを作成し、コンテナー イメージをプライベート コンテナー レジストリにプッシュする方法について説明します。 その後、プライベート レジストリから、Windows Server 上の AKS でホストされているオンプレミスの Kubernetes クラスターにデプロイできます。
Azure の Container Registry の詳細については、 Azure Container Registry のドキュメントを参照してください。
前提条件
次の要件が備わっていることを確認します。
- Kubernetes の概念に関する基本的な理解。
- 稼働している AKS クラスター。
- Azure CLI がインストールされていること
- あなたのローカル
kubectl
環境が AKS クラスターを指すように設定されています。 Get-AksHciCredential PowerShell コマンドを使用することにより、kubectl
を使用してアクセスするためにクラスターを構成できます。
Azure 上でプライベート コンテナー レジストリを作成する
コンテナー レジストリを作成するには、 リソース グループから始めます。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 PowerShell az-group-create コマンドを使用してリソース グループを作成します。 次の例では、 eastus リージョンにリソース グループを作成します。
az group create --name <RESOURCE_GROUP_NAME> --location eastus
az acr create コマンドを使用して Container Registry インスタンスを作成し、独自のレジストリ名を指定します。 レジストリ名は Azure 内で一意であり、5 から 50 文字の英数字を含める必要があります。 この記事の残りの部分では、 <acrName>
はコンテナー レジストリ名のプレースホルダーとして使用されますが、独自の一意のレジストリ名を指定できます。 Basic SKU は、ストレージとスループットのバランスを提供する開発目的でコスト最適化されたエントリ ポイントです。
az acr create --resource-group <RESOURCE_GROUP_NAME> --name <REGISTRY_NAME> --sku Basic
コンテナー レジストリを作成したら、次のコマンドを使用してサービス プリンシパルを作成し、Kubernetes からコンテナー レジストリにアクセスできるようにします。
az ad sp create-for-rbac
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RG_NAME>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME>
--role Contributor
--name <SERVICE_PRINCIPAL_NAME>
Container Registry では、3 つのアクセス ロールがサポートされています。 Contributor ロールは、アプリケーション開発者が最もよく使用します。 ただし、実際のシナリオでは、必要なアクセスの種類に応じて、複数のサービス プリンシパルを作成する必要がある場合があります。
- 共同作成者: このロールがあれば、リポジトリへのプッシュ アクセスとプル アクセスが行えます。
- 閲覧者: このロールでは、リポジトリへのプル アクセスのみが許可されます。
- 所有者: このロールでは、リポジトリへのプッシュ アクセスとプル アクセスに加えて、他のユーザーにロールを割り当てることができます。
前のコマンドでは、次のテキストのような出力が生成されます。
{
"appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"displayName": "akshci-service-principal",
"name": "http://akshci-service-principal",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
サービス プリンシパルが正常に作成されたら、 appId
と password
を安全な場所にコピーして、後でデプロイで使用します。
サービス プリンシパルと Container Registry の操作の詳細については、「サービス プリンシパルを使用した Azure Container Registry 認証を参照してください。
プライベート コンテナー レジストリへのサインイン
Container Registry インスタンスを使用するには、最初にサインインする必要があります。 Azure CLI または Docker CLI を使用してサインインできます。
オプション 1: Azure CLI からサインインする
az acr sign in コマンドを使用し、前の手順でコンテナー レジストリに割り当てられた一意の名前を指定します。
az acr login --name <REGISTRY_NAME>
オプション 2: Docker CLI からサインインする
Docker CLI を使用してコンテナー レジストリにアクセスするには、Bash または PowerShell ターミナルで次のコマンドを入力します。
docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>
どちらのオプションでも、コマンドは完了すると "サインインに成功しました" というメッセージを返します。
コンテナー レジストリにイメージをプッシュする
正常にログインしたら、コンテナー レジストリへのイメージのプッシュを開始できます。 まず、 docker images
コマンドを実行して、ローカル コンピューター上のイメージの一覧を表示します。
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/azure-functions/dotnet 3.0 9f8ad1bdee67 5 months ago 540MB
poemfinder-app latest 2d9bef425603 6 months ago 208MB
開始するには、 docker tag
コマンドを使用してイメージにタグを付け、 docker push
を使用してコンテナー レジストリにプッシュします。
docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
docker images
コマンドをもう一度実行して、イメージが正しくタグ付けされたことを確認します。 確認したら、次に示すように、 docker push
を実行してコンテナー レジストリにプッシュします。
docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
イメージがコンテナー レジストリに正常にプッシュされたことを確認するには、次のコマンドを実行します。
az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table
コンテナー レジストリから AKS にイメージをデプロイする
コンテナー レジストリから Kubernetes クラスターにコンテナー イメージをデプロイするには、レジストリ資格情報を格納する Kubernetes シークレットを作成します。 Kubernetes では、イメージのプル シークレットを使用して、認証に必要な情報をレジストリに格納します。 コンテナー レジストリのプル シークレットを作成するには、サービス プリンシパル ID、パスワード、およびレジストリ URL を指定します。
kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<REGISTRY_NAME>.azurecr.io \
--docker-username=<appId> \
--docker-password=<password>
どこで:
価値 | 説明 |
---|---|
secret-name |
イメージ プル シークレットの名前 (acr-secret など)。 |
namespace |
シークレットを格納する Kubernetes 名前空間。 既定の名前空間以外の名前空間にシークレットを配置する場合にのみ必要です。 |
<REGISTRY_NAME> |
コンテナー レジストリの名前。たとえば、 myregistry 。 --docker-server は、レジストリ サインイン サーバーの完全修飾名です。 |
appId |
Kubernetes がレジストリへのアクセスに使用するサービス プリンシパルの ID。 |
password |
サービス プリンシパルのパスワード。 |
イメージ プル シークレットを作成したら、それを使用して Kubernetes ポッドとデプロイを作成できます。 次の例に示すように、デプロイ ファイルの imagePullSecrets
の下にシークレットの名前を指定します。
apiVersion: v1
kind: Pod
metadata:
name: poemfinder-app
namespace: mydemoapps
spec:
containers:
- name: poemfinder-app
image: <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: acr-secret
この例では、 poemfinder-app:v1.0
はコンテナー レジストリからプルするイメージの名前で、 acr-secret
はレジストリにアクセスするために作成したプル シークレットの名前です。 ポッドをデプロイすると、クラスターにイメージがまだ存在しない場合、Kubernetes によってレジストリからイメージが自動的にプルされます。
上記のポッド構成を pod-example.yaml などのファイルに保存し 次のように Kubernetes にデプロイできます。
kubectl create -f pod-example.yaml
コンテナー レジストリのコンテナー イメージを使用してポッドが正常に作成されたことを確認するには、 kubectl describe pod <POD_NAME>
を実行します。ポッドの作成に使用されたコンテナー イメージが表示されます。
次のステップ
この記事では、Azure Container Registry から AKS Arc にコンテナー イメージをデプロイする方法について説明しました。次に、次のことができます。