先週、Azure のマネージドな Kubernetes サービスとして Azure Container Service (AKS) のプレビューがリリースされたので、試してみました。
azure.microsoft.com
Azure Container Service (AKS) を作成する
Azure Container Service (AKS) Documentation - Tutorials, API Reference | Microsoft Docs
公式ドキュメントにも記載されているように、Azure Portal の Cloud Shell を使うと、サクッと試すことができます。
ただ、実際の開発作業で使うことを考えると、ローカルの開発マシンで AKS を操作したいので、Azure CLI の Docker Image を使って試してみます。
Cloud Shell には、Kubectl (Kubernetes のクライアントツール) と Helm (Kubernetes のパッケージマネージャー)がインストール済みですが、 Azure CLI の Docker Image には含まれていません。
そのため、Kubectl と Helm がインストール済みの Dockerfile を書いてみました。
FROM azuresdk/azure-cli-python:2.0.20 # Install kubectl RUN wget -O /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.8.2/bin/linux/amd64/kubectl \ && chmod +x /usr/local/bin/kubectl # Install Helm RUN wget https://storage.googleapis.com/kubernetes-helm/helm-v2.7.0-linux-amd64.tar.gz \ && tar -zxvf helm-v2.7.0-linux-amd64.tar.gz \ && mv linux-amd64/helm /usr/local/bin/helm \ && rm -rf linux-amd64
ローカルの開発マシンでは、Kubectl と Helm の接続情報、SSH 接続キーをマウントして、この Docker Image を実行します。
develop ディレクトリは、Kubernetes にデプロイする YAML ファイルやカスタムの Helm Chats を想定して、マウントしてます。
$ docker run -it --rm -v ${HOME}/.kube/aks:/root/.kube -v ${HOME}/.helm/aks:/root/.helm -v ${HOME}/.ssh/aks:/root/.ssh -v ${HOME}/develop:/develop thara0402/azure-cli-k8s:latest
Azure CLI にログインします。
$ az login
まだプレビュー中なので、サブスクリプションごとにアクティブ化が必要です。
$ az provider register -n Microsoft.ContainerService
リソースグループを作成します。利用できるリージョンは限られており、まだ日本は使えません。
$ az group create --name aks --location westus2
AKS を作成します。
$ az aks create --resource-group aks --name myK8sCluster --node-count 1 --generate-ssh-keys
kubectl の接続情報をダウンロードします。
$ az aks get-credentials --resource-group=aks --name=myK8sCluster
Agent Node が1つ作成されました。Master Node は、Azure 側に管理を任せているので表示されません。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-agentpool1-29980149-0 Ready agent 2d v1.7.7
Azure Portal で確認すると、2つのリソースグループが作成されています。どちらのリソースグループにも、Master Node の仮想マシンは表示されていません。
ASP.NET Core アプリケーションをデプロイする
ASP.NET Core アプリケーションの Docker Image を使って、AKS にデプロイします。
$ kubectl run mvcapp --image thara0402/mvcapp:v1 $ kubectl get pods NAME READY STATUS RESTARTS AGE mvcapp-614172684-tddnb 1/1 Running 0 1m $ kubectl expose deployments mvcapp --port=5000 --type=LoadBalancer $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 2d mvcapp LoadBalancer 10.0.121.196 52.175.213.163 5000:31552/TCP 3m
ブラウザで 52.175.213.163:5000 に接続すると、ASP.NET Core MVC のテンプレートが表示されます。
次に、Agent Node の数を3つに増やしてみます。
$ az aks scale --resource-group=aks --name=myK8SCluster --agent-count 3 $ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-agentpool1-29980149-0 Ready agent 29m v1.7.7 aks-agentpool1-29980149-1 Ready agent 16m v1.7.7 aks-agentpool1-29980149-2 Ready agent 16m v1.7.7
最後に、Kubernetes Cluster を ver.1.8.1 にバージョンアップしてみます。
$ az aks upgrade --name myK8sCluster --resource-group aks --kubernetes-version 1.8.1 $ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-agentpool1-29980149-0 Ready agent 40m v1.8.1 aks-agentpool1-29980149-1 Ready agent 30m v1.8.1 aks-agentpool1-29980149-2 Ready agent 30m v1.8.1
Helm を使ってデプロイする
Helm を使ってデプロイしようと試しましたが、エラーが発生してしまいました。
$ helm list
Error: forwarding ports: error upgrading connection: error dialing backend: dial tcp 10.240.0.4:10250: getsockopt: connection refused
調べてみると、Helm の FAQ に該当しそうな Workaround があったのですが、Master Node で作業する必要があり、試すことができませんでした。
helm/install_faq.md at master · kubernetes/helm · GitHub
これ以外にも、Kubernetes Dashboard が表示できなかったりするので、まだプレビューということもあり、もう少し様子をみたいと思います。
まとめ
これまでも Azure Container Service で Kubernetes を展開することはできましたが、どちらかと言うと仮想マシンのテンプレートでした。
ちょっとした動作確認に使う分にはいいですが、本番環境で運用するとなると、IaaS と同等の運用コストがかかります。
AKS は、Google Container Engine (GKE) のようなサービスで、Kubernetes の Master Node の管理を Azure 側に任せてしまい、Agent Node とデプロイするアプリケーションの管理に注力できます。
GA に向けて、クラウドらしい便利なサービスになることを期待したいです。