概要
- AKS(Azure Kubernetes Service)でASP.NET Core 2.1のコンテナを動かす
- ACR(Azure Container Registry)にコンテナをpushする
使用環境
- Ubuntu 16.04LTS
- 前記事のminikubeの手順を既に踏んでいるものと想定
- AzureのSubscriptionを所有していること
- azコマンドがシェル上で利用可能なこと
環境準備
1. Azure PortalからAKSを作成
Docsはコマンドラインで作成するような手順となっているが、
6月27日現在で作成できるリージョンやインスタンスに大幅な制限があるため、
Portalから利用可能なリージョンを選ぶ。
(Japan Eastが利用可能になったとは言ってもインスタンスが作成出来るとは言ってない)
ここではEast USで作成する。
バージョンはKubernetesの利用可能な最新バージョンの1.10.3
基本的に必要な情報を入力してcreateボタンが押せればOK.
作成されるまでに結構時間がかかる。
2. Azure PortalからACRを作成
これも入力できる情報を入力してそのまま作成。
ここで作成したACRのリソースグループ名とインスタンス名を控えておく。
(ここでは便宜上AKSのリソースグループの名前を aksrg
, ACRのリソースグループの名前を acr-rg-name
, AKSのインスタンス名を aksinstancename
, ACRの名前を acrname
とする)
3. ACRにコンテナのイメージをpush
以下のコマンドを実行
$ docker tag containerapp:v2 acrname.azurecr.io/containerapp:release
$ docker images
> containerapp:v2 ____ # 元からあったやつ
> acrname.azurecr.io/containerapp:release ____ # 今回作成されたpush用のイメージ
$ docker push acrname.azurecr.io/containerapp:release
ACRからAKSへデプロイ
1. ローカルからAKSに接続
Kubectlとazコマンドを使えるシェルで作業を行う。
$ az aks get-credentials --resource-group aksrg --name aksinstancename --subscription 'subscriotionname(optional)'
$ kubectl config get-contexts
> * minikube
> aksinstancename
$ kubectl config use-context aksinstancename
これでローカルのkubectlがAKSに接続されたことになる。試しにgetコマンドを実行。
$ kubectl get nodes
$ kubectl get pods
2. ACRからイメージをpullするための設定
AKSからACRにアクセスしてコンテナイメージをひっぱってくるために、Azure内のユーザの設定が必要。
これはDocsにも書いてある。
$ az acr login --name acrname
$ az aks show --resource-group aksrg --name aksinstancename --query "servicePrincipalProfile.clientId" --output tsv
> xxxxx-xxx-xxxx-xxxx
$ az acr show --name acrname --resource-group acr-rg-name --query "id" --output tsv
>/subscriptions/xxx.../resourceGroups/acr-rg-name/providers/Microsoft.ContainerRegistry/registries/sample/providers/Microsoft.Authorization/roleAssignments/yyy-...
$ az role assignment create --assignee xxxxx-xxx-xxxx-xxxx --role Reader --scope /subscriptions/...
> { "canDelegate": null, "id": "..."...}
3. あとはminikubeと同じ
$ kubectl run aspdeployment --image=acrname.azurecr.io/containerapp:development --port=8080
$ kubectl expose deployment aspdeployment --type=LoadBalancer --port=80
$ kubectl get service
> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
> aspdeployment LoadBalancer 10.0.138.254 xx.xx.xxx.xx 80:30325/TCP 1m
> kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1h
Externl IPがpendingから何かしらのip addressに変わったらアクセス可能。(AKSの場合ポートの指定なしで行ける)
もしダメそうな場合は以下のコマンドで確認する。
$ kubectl get pods
$ kubectl logs pod-name #<-Containerプルで失敗していたら大体この辺でわかる
$ kubectl get deploy #<-デプロイが怪しかったらここに警告がでる
最後に
- azコマンドとkubectlがローカルで動けば、簡単にコンテナクラスタがいじれる(という気分に浸れる)
- ACRにコンテナイメージを集約して管理することで、Kubernetesのデプロイとアプリの開発を切り分けることが可能。
- 基本的にアプリ開発者はコンテナを作るところまで、そこから先はk8s好きな人がやればいいと思う。