オウルです。
今回は Azure のKubernetes マネージドサービスである Azure Kubernetes Service のデプロイに挑戦します。
Azure Kubernetes Service をデプロイするためには、Azure サブスクリプションが必要です。また、Azure Cloud Shell を使用します。使用方法は、以下の公式リファレンスを参考にして下さい。
Azure Container Registryのデプロイ
ACR
Azure コンテナー レジストリは、オープンソースの Docker Registry 2.0 に基づいた、管理された Docker レジストリ サービスです。 プライベート Docker コンテナー イメージを保存および管理する Azure コンテナー レジストリを作成および管理します。
Azure CLI を使用して Azure Kubernetes Service をデプロイします。
Azure CLI
Azure CLI は、Azure リソースを管理するためのコマンドライン ツールです。
リソースグループの作成
ACR をデプロイするリソースグループを作成します。
1 2 3 |
# # リソースグループを作成します az group create --name my-k8s-rg --location japaneast |
ACR をデプロイ
1 で作成したリソースグループを指定してACR をデプロイします。SKU は学習する開発者向けのオプションである Basic を指定します。
Azure Container Registry (ACR) は、SKU と呼ばれる複数のサービス階層で使用できます。 これらの SKU は、Azure におけるプライベート Docker レジストリの容量と使用パターンに合ったさまざまなオプションと予測可能な価格を提供します。
1 2 3 |
# # ACR を作成します az acr create --resource-group my-k8s-rg --name myContainerRegistry --sku Basic |
Azure Kubernetes Service のデプロイ
まず、AKS Cluster が ACR と対話できるようにするために、Azure Active Directory のサービスプリンシパルを作成します。
サービスプリンシパル
サービス プリンシパルは、リソース/サービス レベルの無人操作を実行する目的でテナント内で作成する Azure Active Directory アプリケーション リソースです。 アプリケーション ID とパスワードまたは証明書が与えられた、独自のユーザー ID です。 サービス プリンシパルには、割り当てられたロールとアクセス許可によって定義されるタスクを実行するために必要な権限のみが与えられます。
サービスプリンシパルを作成
1 2 3 |
# # サービスプリンシパルを作成します az ad sp create-for-rbac --skip-assignment |
上記を実行すると以下の出力結果が表示されます。この後の操作で必要となりますので、コピーして保存します。
1 2 3 4 5 6 7 8 9 |
# # 出力結果 { "appId": "**********************************", "displayName": "azure-cli-2018-06-29-19-14-37", "name": "http://azure-cli-2018-06-29-19-14-37", "password": "**********************************", "tenant": "**********************************" } |
ACR のリソースIDを取得
1 2 3 |
# # ACR のリソースIDを取得します az acr show --resource-group my-k8s-rg --name myContainerRegistry --query "id" --output tsv |
ロールを割り当る
ACR のDocker イメージを使用するために適切なロールを割り当てます。
1 2 3 |
# # ロールを割り当てます az role assignment create --assignee <appId> --scope <acrId> --role Reader |
AKS のデプロイ
1 で作成したリソースグループを指定してAKS をデプロイします。
1 2 3 |
# # AKS を作成します az aks create --resource-group my-k8s-rg --name myAKSCluster --node-count 1 --service-principal <appId> --client-secret <password> --generate-ssh-keys |
Kubernetes CLI のインストール
1 2 3 |
# # Kubernetes CLI をインストールします az aks install-cli |
kubectl でAKS Clusterに接続
1 2 |
# az aks get-credentials --resource-group my-k8s-rg --name myAKSCluster |
インストールした Kubernetes CLI を使ってクラスター ノードの一覧を取得します。
1 2 3 4 5 |
# kubectl get nodes -o wide # ノード一覧の出力サンプルです。 NAME STATUS ROLES AGE VERSION k8s-myAKSCluster-36346190-0 Ready agent 2m v1.7.7 |
1 で作成したリソースグループの他に下のリソースグループが自動で作成されています。そして、このリソースグループに、AKS Clusterを動作させるリソースが作成されています。
MC_my-k8s-rg_myAKSCluster_japaneast
- DNSゾーン
- ネットワークセキュリティグループ
- ルートテーブル
- 仮想マシン
- OSディスク
- ネットワークインターフェイス
- ロードバランサー
- パブリックIPアドレス
- 可用性セット
ACR のログインサーバ情報を取得
1 2 3 4 5 6 7 8 9 10 |
# # Azure にログインします az login # ACR にログインします az acr login --name myContainerRegistry # ACR のログインサーバ名を取得します az acr list --resource-group my-k8s-cluster --query "[].{acrLoginServer:loginServer}" -o table AcrLoginServer -------------------------- myContainerRegistry.azurecr.io |
ACR にイメージプッシュ
プッシュする Docker イメージは前回作成した myapp イメージを使用します。
1 2 3 4 5 |
# # ACR にプッシュできるようにタグを付けます docker tag myapp:dev <acrLoginServer>/myapp:dev # ACR にプッシュします docker push <acrLoginServer>/myapp:dev |
ACR のイメージ一覧
1 2 3 |
# # ACR のイメージ一覧を取得します az acr repository list --name myContainerRegistry --output table |
AKS にデプロイ
AKS に 10 でプッシュした Docker イメージをデプロイします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# # AKS にデプロイします kubectl run myapp --image=dockerregistory.azurecr.io/myapp:dev # 公開します kubectl expose deployment/myapp --port=80 --target-port=80 # Service type を LoadBalancer に変更します kubectl edit deployment/myapp # spec.type の ClusterIP を LoadBalancer に変更して保存します # type: LoadBalancer # 公開情報を確認します kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR myapp LoadBalancer 10.0.30.28 <pending> 80:30215/TCP 2m run=myapp # EXTERNAL-IP が <pending> になっている場合はしばらく待ちます。 # IPアドレスが表示されれば、http://< EXTERNAL-IP > にアクセスします |
イメージ図

まとめ
今回は、Azure に ACR と AKS をデプロイしました。どちらもマネージドサービスのため、オンプレ環境に全て自前で構築する場合と比較すると、その手軽さと速度を感じることができたのではないかと思います。それに、コンテナを動作させるホスト側では、エージェントノード(ワーカーノード)のみを管理すればよいという点もクラウド、且つマネージドサービスの恩恵です。近い将来、AWS Fargate のようなフルマネージドサービスの提供もあるかもしれません。今後のクラウドサービスに注目です。※但し、AWS Fargate は、デプロイしたコンテナにログインできないなどの制約はあります。
Kubernetes の公式ページには Production environment として AKS は Managed に分類されています。
Kubernetes のうれしいことを知りたい方は、こちらをどうぞ。
おススメ書籍
技術本を読むなら Kindle がおすすめです。こちらの記事をご覧ください。
パブリッククラウドは色々なことができるため(マイクロサービス アーキテクチャ)、知識の整理が難しいというのが僕の悩みです。しかも公式リファレンスは、どうも翻訳が・・・。と思っていた時に、何気に見ていたAzure サポートブログで紹介されていました。著者が全員、現役のマイクロソフトのAzureテクニカルサポートのエンジニアです。