Azure Container Registry と AKS Arc を使用してプライベート コンテナー レジストリからオンプレミスの Kubernetes にデプロイする

適用対象: Azure Stack HCI バージョン 23H2

この記事では、AKS Arc デプロイで独自のデータセンターで実行できるAzure Container Registryを使用して、プライベート コンテナー レジストリからコンテナー イメージをデプロイする方法について説明します。 AKS によってホストされているオンプレミスの Kubernetes クラスターにデプロイします。 Azure Container Registry では、あらゆる種類のコンテナー デプロイ用のプライベート レジストリにコンテナー イメージや成果物をビルド、保存、管理できます。

この記事では、Azure にプライベート コンテナー レジストリを作成し、コンテナー イメージをプライベート コンテナー レジストリにプッシュする方法について説明します。 その後、プライベート レジストリから、AKS Arc でホストされているオンプレミスの Kubernetes クラスターにデプロイできます。

Azure Container Registryの詳細については、Azure Container Registryドキュメントを参照してください

前提条件

次の要件が備わっていることを確認します。

  • Kubernetes の概念に関する基本的な理解。
  • 稼働している AKS クラスター。
  • Azure CLI がインストールされていること
  • AKS クラスターを指すよう構成されたローカル kubectl 環境。

Azure 上でプライベート コンテナー レジストリを作成する

コンテナー レジストリを作成するには、 リソース グループから始めます。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 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>

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

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

前のコマンドでは、次のテキストのような出力が生成されます。

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

サービス プリンシパルが正常に作成されたら、appId とパスワードを安全な場所にコピーして、後でデプロイで使用します。

サービス プリンシパルと Azure 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>を実行します。これにより、ポッドの作成に使用されるコンテナー イメージが表示されます。

次の手順