Azure Container Registry から AKS on Azure Stack HCI にコンテナー イメージをデプロイします

このチュートリアルを終了すると、Azure Container Registry (ACR) から AKS on Azure Stack HCI にコンテナー イメージをデプロイして、プライベート ACR を作成する方法を理解できます。 Azure Container Registry では、あらゆる種類のコンテナー デプロイ用のプライベート レジストリにコンテナー イメージや成果物をビルド、保存、管理できます。

このチュートリアルは、Kubernetes の概念の基本的な理解を前提としています。

開始する前に

次のものがインストールされていることをご確認ください。

  • 稼働している AKS on Azure Stack HCI クラスター。
  • Azure CLI をインストールする
  • AKS on Azure Stack HCI クラスターをポイントするようにローカルの kubectl 環境が構成されていること。 Get-AksHciCredential PowerShell コマンドを使用することにより、kubectl を使用してアクセスするためにクラスターを構成できます。

Azure Container Registry を作成する

Azure Container Registry を作成するには、まず、リソース グループが必要です。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 az group create コマンドを使用して、リソース グループを作成します。 次の例では、eastus リージョンにリソース グループが作成されます。

az group create --name <RESOURCE_GROUP_NAME> --location eastus

az acr create コマンドを使用して Azure 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>

Azure Container Registry では、3 つのアクセス ロールをサポートしています。共同作成者 のロールは、アプリケーション開発者にとって最も一般的なものですが、実際のシナリオでは、必要なアクセスの種類に応じて複数のサービス プリンシパルを作成することが必要になる場合があります。

  • 共同作成者: このロールがあれば、リポジトリへのプッシュ アクセスとプル アクセスが行えます。
  • 閲覧者: このロールでは、リポジトリへのプル アクセスのみが許可されます。
  • 所有者: このロールでは、リポジトリへのプッシュ アクセスとプル アクセスに加えて、他のユーザーにロールを割り当てることができます。

上のコマンドを実行すると、次のような出力が生成されます。

{
 "appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "displayName": "akshci-service-principal",
 "name": "http://akshci-service-principal",
 "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

サービス プリンシパルが正常に作成されたら、この後のデプロイで使用できるように、appIdpassword を安全な場所にコピーしておきます。

サービス プリンシパルと Azure Container Registry を使った作業について詳しくは、「サービス プリンシパルによる Azure Container Registry 認証」を参照してください。

コンテナー レジストリにログインする

Azure Container Registry インスタンスを使用するには、最初にログインする必要があります。 Azure CLI または Docker CLI を使用してログインできます。

オプション 1: Azure CLI からログインする

az acr login コマンドを使用して、前の手順でコンテナー レジストリに設定した一意の名前を指定します。

az acr login --name <REGISTRY_NAME>

オプション 2: Docker CLI からログインする

Docker CLI を使用してコンテナー レジストリにアクセスするには、Bash または PowerShell ターミナルで次のコマンドを入力します。

docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>

どちらのオプションでも、コマンドが完了すると "ログインに成功しました" というメッセージが返されます。

Azure Container Registry へのイメージのプッシュ

ログインに成功したら、イメージを Azure Container Registry にプッシュし始めることができます。 まず、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 を使用してそれを Azure Container Registry にプッシュする必要があります。

docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

docker images コマンドをもう一度実行して、イメージに正しくタグが付けられていることを確認します。 確認したら、docker push を実行して、次に示すように ACR にプッシュします。

docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

イメージが Azure Container Registry に正常にプッシュされたことを確認するには、次のコマンドを実行できます。

az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table

イメージを ACR から AKS on Azure Stack HCI にデプロイする

コンテナー イメージを Azure Container Registry から Kubernetes クラスターにデプロイするには、レジストリ資格情報を格納するために "Kubernetes シークレット" を作成する必要があります。 Kubernetes では、イメージのプル シークレット を使用して、認証に必要な情報をレジストリに格納します。 Azure コンテナー レジストリ用のプル シークレットを作成するには、サービス プリンシパルの 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> Azure コンテナー レジストリの名前 (例: 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 は Azure コンテナー レジストリからプルするイメージの名前であり、acr-secret はそのレジストリにアクセスするために作成したプル シークレットの名前です。 ポッドをデプロイすると、イメージがクラスター上にまだ存在しない場合、Kubernetes によって、レジストリからイメージが自動的にプルされます。

上記のポッド構成を pod-example.yaml などのファイルに保存し、次に示すようにしてそれを Kubernetes にデプロイできます。

kubectl create -f pod-example.yaml

Azure Container Registry のコンテナー イメージを使用してポッドが正常に作成されたことを確認するには、kubectl describe pod <POD_NAME> を実行します。すると、ポッドの作成に使用されたコンテナー イメージが表示されます。

次のステップ

この記事では、Azure Container Registry から AKS on Azure Stack HCI にコンテナー イメージをデプロイする方法について学習しました。 次に、以下を実行できます。