前回「Azure Container Registryの作成からDockerイメージのプッシュまで」でした。
今回はAzure Container Service(AKS)にて、Azure Container Registryからのデプロイを試してみます。
Azure Container Registry とは
AKSとは、マネージド型のKubernetesです。
AKSは、Kubernetesを用いたアプリケーションのスケーリング及びオーケストレーションが可能で、Kubernetesクラスタの管理の複雑さと運用上のオーバーヘッドを軽減します。料金については、マスターノードへの課金は無く、利用したリソース(エージェントノードのVM やストレージ等)に対しての課金のみです。
AKS は、2018/04/10現在、プレビュー版のみの提供で、対応リージョンに日本は無く、以下のみになります。
- 米国東部
- 西ヨーロッパ
- 米国中央部
- カナダ中部
- カナダ東部
主な特徴は以下になります。
- 自動的なKubernetes のバージョンのアップグレードと修正プログラムの適用
- 簡単なクラスタースケーリング
- ホストされているコントロール プレーン (マスター) の自己修復
- 実行しているエージェント プール ノードのみの課金によるコストの削減
- 標準のKubernetes API エンドポイントの公開で、kubectl、helm、draft などのKubernetes クラスタと通信できる任意のソフトウェアで通信可能
- AKS の使用には、Azure CLI、または、ポータル(Marketplace で Azure Container Service を検索)を経由することで、AKS クラスタをデプロイ可能
詳細は以下をご覧頂ければと思います。
https://docs.microsoft.com/ja-jp/azure/aks/intro-kubernetes
今回構築する環境
構築後の環境のイメージを図にすると以下になります。Azure Container RegistryとクライアントPCの環境については、前回をそのまま使用します。
各環境については、以下になります。
環境 | 説明 |
---|---|
Azure Container Service(AKS) | AKSは、Azure Container RegistryからDockerイメージをPullしてNode上にコンテナをデプロイします。 |
Azure Container Registry(ACR) | Docker のPrivate Registry。 |
開発PC | Dockerイメージを作成して、Azure Container RegistryにPushします。 |
Azure Container Service(AKS)クラスタの作成
AKS がプレビューである間、新しいクラスタを作成するには、サブスクリプションに機能を要求するための機能フラグが必要です。
az provider register コマンドの実行で、AKSプロバイダの登録や、AKSクラスタ作成時にタイムアウトしないようにするためのプロバイダを登録します。コマンドは、次のとおりになります。
# az provider register -n Microsoft.ContainerService # az provider register --namespace Microsoft.Compute # az provider register --namespace Microsoft.Network
前回の記事で作成したAzure Container Registryと同じリソースグループのrgAcrTestに、myAKSClusterという名前でAKSクラスタをノード1つで作成します。コマンドは次のとおりです。完了するまでしばらく待ちます。
# az aks create --resource-group rgAcrTest --name myAKSCluster --node-count 1 --generate-ssh-keys
以上で、AKSクラスタの作成は完了です。
kubectl CLIの構成
開発PCから、Kubernetesクラスタに接続するには、kubectl(Kubernetesコマンドラインクライアント)を使用します。
開発PCローカルにインストールするには、次のコマンドでインストールします。
# az aks install-cli
Kubernetesクラスタに接続するように kubectlを構成するには、次のコマンドを実行します。
# az aks get-credentials --resource-group=rgAcrTest --name=myAKSCluster
次のとおり、クラスタへの接続を確認するには、kubectl get nodesコマンドを実行します。
クラスタ作成コマンドで、ノード1個の指定で作成しているため、実行結果に、STATUS 欄がReady、ROLES 欄にagent と表示される行が1行あることを確認します。
# kubectl get nodes NAME STATUS ROLES AGE VERSION aks-nodepool1-13244192-0 Ready agent 3m v1.8.10
以上で、kubectl CLIの構成は完了です。
Azure Container Registry(ACR)認証の構成
AKS クラスタとACR レジストリとの間で認証が構成されている必要があります。その際、ACRレジストリからイメージをプルするための適切な権限をAKSのIDに付与します。
まず、次のとおり、AKSに対して構成されているサービスプリンシパルのIDを取得します。
# CLIENT_ID=$(az aks show --resource-group rgAcrTest --name myAKSCluster --query "servicePrincipalProfile.clientId" --output tsv)
それから、次のとおり、ACRレジストリのリソースIDを取得します。
# ACR_ID=$(az acr show --name acrTrial --resource-group rgAcrTest --query "id" --output tsv)
最後に、適切なアクセス権を付与するロールの割り当てを、次のコマンドで作成します。
# az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID
以上で、ACR認証の構成は完了です。
AKSクラスタにデプロイするコンテナイメージの作成
AKSにデプロイ後、Webブラウザで表示確認できるよう、PHPモジュールが動作するサーバーのIPアドレスを画面表示する以下のPHPモジュールを「test.php」のファイル名で作成します。srcディレクトリに格納します。
<?php echo "Server IP address\n\n"; echo $_SERVER['SERVER_ADDR']; ?>
デプロイ用のイメージを作成します。srcディレクトリがあるディレクトリに、以下のDockerfileを作成します。
FROM acrtrial.azurecr.io/webapp:dev COPY ./src/ /var/www/html/
こちらのDockerfileからデプロイ用のイメージをビルドし、Azure Container RegistryにPushします。
# docker build -t acrtrial.azurecr.io/webapp:1.0 . # docker push acrtrial.azurecr.io/webapp:1.0
デプロイ用のイメージに、1.0というタグを付けました。
本番用イメージに1.0が、ACRレジストリにプッシュされていることを、次のとおり、確認します。
# az acr repository list --name acrTrial --output table Result -------- webapp # az acr repository show-tags --name acrTrial --repository webapp --output table Result -------- 1.0 dev
AKSクラスタへのコンテナイメージのデプロイ
作成したコンテナイメージをAKSにデプロイします。
AKSにデプロイするために、Kubernetesのマニフェストファイルを作成します。開発PCの任意のディレクトリに、次の内容で、ファイル名deploy.ymlとして作成します。
apiVersion: apps/v1beta1 kind: Deployment metadata: name: web-deployment spec: replicas: 1 template: metadata: labels: app: webapp spec: containers: - name: webapp image: acrtrial.azurecr.io/webapp:1.0 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: webapp spec: type: LoadBalancer ports: - port: 80 selector: app: webapp
次のとおり、kubectl createコマンドを実行すると、作成したマニフェストファイルに従って、AKSにリソースの作成とデプロイを行います。
# kubectl create -f deploy.yml deployment "web-deployment" created service "webapp" created
アプリケーションをインターネットに公開するAKSのServiceが作成されます。これにはしばらく時間がかかります。
次のとおり、進行状況を監視するには、kubectl get service コマンドに–watch 引数を指定して実行します。
# kubectl get service webapp --watch NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE webapp LoadBalancer 10.0.2.56 <pending> 80:32349/TCP 16s webapp LoadBalancer 10.0.2.56 52.186.125.51 80:32349/TCP 4m
webサービスのEXTERNAL-IP欄は”保留中”で表示されます。しばらくすると、EXTERNAL-IP欄が「保留中」から「IPアドレス」に変わったら、CTRL-C を使用して kubectl ウォッチ プロセスを停止します。
さらに、次のとおり、kubectl get podsコマンドで、Podが1個作成されていて、Status欄が「Running」となっていることを確認します。
# kubectl get pods NAME READY STATUS RESTARTS AGE web-deployment-c8c55cb48-xgk47 1/1 Running 0 6m
EXTERNAL-IP欄にIPアドレスが表示されたら、そのIPアドレスでブラウザから表示確認します。
次の画面が表示されれば、デプロイが正常に実行されています。
画面が表示されなかった場合は、AKSクラスタとACRレジストリとの認証に関する構成が原因になっている可能性があります。
まとめ
以上のように、Azure Container Service(AKS)から、Azure Container RegistryにプッシュしたDockerイメージをプルできるので、デプロイ作業が簡単にできます。
コンテナーイメージを保存できるAzure Container Registryを使用すれば、各開発者の環境はもとより、テスト環境や本番環境でも同一の環境にでき、アプリケーションの継続的なビルドとデプロイが大幅に簡単になると考えられます。
斎藤@SSTD