過去記事では AKS に Tye のサンプルアプリケーションをデプロイする際、コンテナーレジストリーには DockerHub を使用していました。
Tye では DockerHub の他に Azure Container Registry (ACR) を使用することができるため、今回は ACR を使ってみようと思います。
ドキュメントでいうとこのあたりになります。
https://github.com/dotnet/tye/blob/master/docs/reference/schema.md#registry-string
サンプルアプリケーションはこちら。
Azure Container Registry の作成
ポータルや CLI を使って ACR のリソースを作成します。
管理者ユーザーは無効のままで大丈夫です。
tye.yaml を変更する
tye.yaml の registry
を書き換えて、コンテナーレジストリーに ACR を使うようにします。
変更前
name: microservice registry: tsubakimoto services: - name: backend project: backend\backend.csproj - name: frontend project: frontend\frontend.csproj - name: redis image: redis bindings: - port: 6379 connectionString: "${host}:${port}" - name: redis-cli image: redis args: "redis-cli -h redis MONITOR"
変更後
name: microservice registry: acrprojecttye.azurecr.io services: - name: backend project: backend\backend.csproj - name: frontend project: frontend\frontend.csproj - name: redis image: redis bindings: - port: 6379 connectionString: "${host}:${port}" - name: redis-cli image: redis args: "redis-cli -h redis MONITOR"
AKS にデプロイしてみる
アプリケーションには何も変更を加えずに AKS にデプロイしてみましょう。
AKS にデプロイするにはセットアップが必要なので、以前の記事を参考にしてください。
$ kubectl apply -f https://raw.githubusercontent.com/dotnet/tye/master/docs/tutorials/hello-tye/redis.yaml deployment.apps/redis created service/redis created $ tye deploy --interactive Loading Application Details... Verifying kubectl installation... Verifying kubectl connection to cluster... Processing Service 'backend'... Applying container defaults... Compiling Services... Publishing Project... Building Docker Image... Created Docker Image: 'acrprojecttye.azurecr.io/backend:1.0.0' Pushing Docker Image... unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information. Drats! 'deploy' failed: 'docker push' failed.
ACR へ認証を行う
AKS へのデプロイに失敗しました。理由は認証エラーですね。
ビルドしたコンテナーイメージをプッシュしようとしている ACR の認証をしていないためです。
エラーログにもある https://aka.ms/acr/authorization は ACR の認証に関するドキュメントです。
$ az acr login -n acrprojecttye
Login Succeeded
再度デプロイ
ACR にログインしたので改めてデプロイを実行します。
$ tye deploy --interactive Loading Application Details... Verifying kubectl installation... Verifying kubectl connection to cluster... Processing Service 'backend'... Applying container defaults... Compiling Services... Publishing Project... Building Docker Image... Created Docker Image: 'acrprojecttye.azurecr.io/backend:1.0.0' Pushing Docker Image... Pushed docker image: 'acrprojecttye.azurecr.io/backend:1.0.0' Validating Secrets... Enter the connection string to use for service 'redis': redis:6379 Created secret 'binding-production-redis-secret'. Generating Manifests... Processing Service 'frontend'... Applying container defaults... Compiling Services... Publishing Project... Building Docker Image... Created Docker Image: 'acrprojecttye.azurecr.io/frontend:1.0.0' Pushing Docker Image... Pushed docker image: 'acrprojecttye.azurecr.io/frontend:1.0.0' Validating Secrets... Generating Manifests... Processing Service 'redis'... Applying container defaults... Service 'redis' does not have a project associated. Skipping. Compiling Services... Publishing Project... Service 'redis' does not have a project associated. Skipping. Building Docker Image... Service 'redis' does not have a project associated. Skipping. Pushing Docker Image... Service 'redis' does not have a project associated. Skipping. Validating Secrets... Generating Manifests... Service 'redis' does not have a container. Skipping. Processing Service 'redis-cli'... Applying container defaults... Service 'redis-cli' does not have a project associated. Skipping. Compiling Services... Publishing Project... Service 'redis-cli' does not have a project associated. Skipping. Building Docker Image... Service 'redis-cli' does not have a project associated. Skipping. Pushing Docker Image... Service 'redis-cli' does not have a project associated. Skipping. Validating Secrets... Generating Manifests... Service 'redis-cli' does not have a container. Skipping. Deploying Application Manifests... Verifying kubectl installation... Verifying kubectl connection to cluster... Writing output to '/tmp/tmpKE7MrI.tmp'. Deployed application 'microservice'. Time Elapsed: 00:00:34:51
デプロイに成功しました。 Azure ポータルで ACR の状態を見るとイメージがプッシュされていることが分かります。
AKS から ACR への認証
デプロイは成功しましたが Pod の状態はエラーになっています。
どうやらコンテナーレジストリーからイメージをプルできていないようです。
$ kubectl get po NAME READY STATUS RESTARTS AGE backend-55cc974776-7kjwx 0/1 ErrImagePull 0 35s frontend-59b55b7b94-pk5l2 0/1 ErrImagePull 0 35s redis-58897bf8c-kdqd8 1/1 Running 0 2m8s
これも認証の問題で、今度は AKS から ACR への認証を設定する必要があります。
ドキュメントに沿って設定を行います。
$ az aks update -n aks-project-tye -g rg-project-tye --attach-acr acrprojecttye {- Finished .. "aadProfile": null, "addonProfiles": { "httpapplicationrouting": { "config": {}, "enabled": false, "identity": null }, "kubedashboard": { "config": {}, "enabled": true, "identity": null } }, "agentPoolProfiles": [ { "availabilityZones": null, "count": 1, "enableAutoScaling": null, "enableNodePublicIp": null, "maxCount": null, "maxPods": 110, "minCount": null, "mode": "System", "name": "agentpool", "nodeLabels": {}, "nodeTaints": null, "orchestratorVersion": "1.16.10", "osDiskSizeGb": 128, "osType": "Linux", "provisioningState": "Succeeded", "scaleSetEvictionPolicy": null, "scaleSetPriority": null, "spotMaxPrice": null, "tags": null, "type": "VirtualMachineScaleSets", "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ], "apiServerAccessProfile": { "authorizedIpRanges": null, "enablePrivateCluster": false }, "autoScalerProfile": null, "diskEncryptionSetId": null, "dnsPrefix": "aks-project-tye-dns", "enablePodSecurityPolicy": null, "enableRbac": true, "fqdn": "aks-project-tye-dns-04d99eee.hcp.japaneast.azmk8s.io", "id": "/subscriptions/1df1e3be-e3ae-4e0e-8c9a-742b8d0b8dfd/resourcegroups/rg-project-tye/providers/Microsoft.ContainerService/managedClusters/aks-project-tye", "identity": null, "identityProfile": null, "kubernetesVersion": "1.16.13", "linuxProfile": null, "location": "japaneast", "maxAgentPools": 10, "name": "aks-project-tye", "networkProfile": { "dnsServiceIp": "10.0.0.10", "dockerBridgeCidr": "172.17.0.1/16", "loadBalancerProfile": { "allocatedOutboundPorts": null, "effectiveOutboundIps": [ { "id": "/subscriptions/1df1e3be-e3ae-4e0e-8c9a-742b8d0b8dfd/resourceGroups/MC_rg-project-tye_aks-project-tye_japaneast/providers/Microsoft.Network/publicIPAddresses/c9a695e4-4b80-40e6-bb16-05df8d207912", "resourceGroup": "MC_rg-project-tye_aks-project-tye_japaneast" } ], "idleTimeoutInMinutes": null, "managedOutboundIps": { "count": 1 }, "outboundIpPrefixes": null, "outboundIps": null }, "loadBalancerSku": "Standard", "networkMode": null, "networkPlugin": "kubenet", "networkPolicy": null, "outboundType": "loadBalancer", "podCidr": "10.244.0.0/16", "serviceCidr": "10.0.0.0/16" }, "nodeResourceGroup": "MC_rg-project-tye_aks-project-tye_japaneast", "privateFqdn": null, "provisioningState": "Succeeded", "resourceGroup": "rg-project-tye", "servicePrincipalProfile": { "clientId": "fbba54b1-22e7-4072-8a41-9767bb23d41f", "secret": null }, "sku": { "name": "Basic", "tier": "Free" }, "tags": null, "type": "Microsoft.ContainerService/ManagedClusters", "windowsProfile": null }
動作確認
AKS から ACR に正しく認証できたのでもう一度デプロイしてみます。ログは代わり映えしないので省略します。
イメージもプルできているためポートフォワードを設定して確認してみます。
$ kubectl get po NAME READY STATUS RESTARTS AGE backend-55cc974776-lphwb 1/1 Running 0 66s frontend-59b55b7b94-gql2d 1/1 Running 0 65s redis-58897bf8c-5dg7b 1/1 Running 0 96s $ kubectl port-forward svc/frontend 5000:80 Forwarding from 127.0.0.1:5000 -> 80 Forwarding from [::1]:5000 -> 80
アプリケーションが動作していることが分かります。
Azure を使うならコンテナーレジストリーも ACR を使うことが多いと思いますが、 Tye もちゃんと ACR に対応しているため使い勝手が良さそうです。