次の方法で共有


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

適用対象: 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"
}

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

サービス プリンシパルと 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 にコンテナー イメージをデプロイする方法について説明しました。次に、次のことができます。