Azure Container Registry と AKS Arc を使用してプライベート コンテナー レジストリからオンプレミスの Kubernetes にデプロイする
適用対象: Azure Local バージョン 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 つのアクセス ロールがサポートされています。 Contributor ロールは、アプリケーション開発者が最もよく使用します。 ただし、実際のシナリオでは、必要なアクセスの種類に応じて、複数のサービス プリンシパルを作成する必要がある場合があります。
- 共同作成者: このロールがあれば、リポジトリへのプッシュ アクセスとプル アクセスが行えます。
- 閲覧者: このロールでは、リポジトリへのプル アクセスのみが許可されます。
- 所有者: このロールでは、リポジトリへのプッシュ アクセスとプル アクセスに加えて、他のユーザーにロールを割り当てることができます。
前のコマンドでは、次のテキストのような出力が生成されます。
{
"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>
どちらのオプションでも、コマンドが完了すると、 sign in succeeded メッセージが返されます。
コンテナー レジストリにイメージをプッシュする
正常にログインしたら、コンテナー レジストリへのイメージのプッシュを開始できます。 まず、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 クラスターにコンテナー イメージをデプロイするには、 Kbernetes Secrets を作成してレジストリ資格情報を格納します。 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>を実行します。ポッドの作成に使用されるコンテナー イメージが表示されます。