Azure Container RegistryからAzure Container Service(AKS)へのデプロイ

前回「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の環境については、前回をそのまま使用します。
input

各環境については、以下になります。

環境 説明
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アドレスでブラウザから表示確認します。
次の画面が表示されれば、デプロイが正常に実行されています。
input
画面が表示されなかった場合は、AKSクラスタとACRレジストリとの認証に関する構成が原因になっている可能性があります。

まとめ

以上のように、Azure Container Service(AKS)から、Azure Container RegistryにプッシュしたDockerイメージをプルできるので、デプロイ作業が簡単にできます。
コンテナーイメージを保存できるAzure Container Registryを使用すれば、各開発者の環境はもとより、テスト環境や本番環境でも同一の環境にでき、アプリケーションの継続的なビルドとデプロイが大幅に簡単になると考えられます。

斎藤@SSTD

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です