ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Container Service(AKS)にデプロイした Grafana で Azure のメトリクスを監視する

この記事は、Azure Advent Calendar 2017 の 10 日目 の記事です。
qiita.com
OSS のモニタリングツールである Grafana を使って、Azure のメトリクスを監視してみました。元ネタは、こちらのブログですが、Grafana を Azure Marketplace ではなく、Azure Container Service(AKS)にデプロイしました。

f:id:TonyTonyKun:20171210105722p:plain

Azure Container Service(AKS)を作成する

最近、Azure Portal からも AKS が作れるようになりました。公式ドキュメントの手順に従って、作成します。
docs.microsoft.com
AKS の作成が完了したら、Azure Cloud Shell を使って、AKS に接続するための資格情報を取得します。

$ az aks get-credentials --resource-group gooner1210 --name gooner1210
Merged "gooner1210" as current context in /home/hara/.kube/config

$ kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-agentpool-63390745-0   Ready     agent     10m       v1.7.7
aks-agentpool-63390745-1   Ready     agent     10m       v1.7.7
aks-agentpool-63390745-2   Ready     agent     10m       v1.7.7

Grafanaをデプロイする

Helm のリポジトリで公開されている Grafana の Charts を使って、AKS にデプロイします。
まず、Helm をセットアップします。

$ helm init
HELM_HOME has been configured at /home/hara/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

Azure のメトリクスを取得するためには、Grafana のプラグインをインストールする必要があります。
grafana.com
Grafana のプラグインは、helm install コマンドのパラメータで指定できるので、次のようなコマンドでインストールできます。

$ helm install --name gf \
--set server.installPlugins=grafana-azure-monitor-datasource,\
server.adminPassword=admin,\
server.service.type=LoadBalancer,\
server.persistentVolume.storageClass=default \
stable/grafana

プラグイン以外のパラメータは、お好みで指定してください。

Parameter Value Description
server.installPlugins grafana-azure-monitor-datasource プラグイン名
server.adminPassword admin 管理者アカウント(admin)のパスワード
server.service.type LoadBalancer ダッシュボードを外部IPで公開
server.persistentVolume.storageClass default データをディスクに永続化

デプロイが完了したら、Grafana の External IP を確認します。

$ kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
gf-grafana   LoadBalancer   10.0.210.171   52.179.12.156   80:31032/TCP   7m
kubernetes   ClusterIP      10.0.0.1       <none>          443/TCP        1h

ブラウザで Grafana の External IP にアクセスすると、ログイン画面が表示されます。

f:id:TonyTonyKun:20171210112709p:plain

Grafanaのデータソースを追加する

Grafana の add data source を選択して、Azure のメトリクスをデータソースとして登録します。

f:id:TonyTonyKun:20171210112728p:plain

任意の名前を入力して、Type で「Azure Monitor」を選択します。Azure Monitor API Details には、サブスクリプションIDとサービスプリンシパルを入力します。Application Insights Details はオプションなので、空欄のままで進めます。

Grafanaのダッシュボードを作成する

Grafana の New Dashboard を選択して、Azure のメトリクスを表示するダッシュボードを作成します。今回は Graph を使って、Azure Web Apps にデプロイされているアプリケーションのメトリクスを表示してみます。

f:id:TonyTonyKun:20171210112745p:plain

Panel Title の edit をクリックして、Metrics タブからメトリクスを取得するアプリケーションのリソースやメトリクスの種類を選択します。選択候補がプルダウンで表示されるので、簡単にダッシュボードを作成できます。

f:id:TonyTonyKun:20171210112807p:plain

2つのアプリケーションの CPU Time と AverageMemoryWorkingSet を 表示することができました。

まとめ

Grafana を使って、Azure のメトリクスを表示するダッシュボードを作成してみました。
このプラグインをインストールすると、Azure Monitor のほかに、Application Insights のメトリクスも取得できます。
Grafana のデータソースには、AWS の CloudWatch や OSS の Prometheus も指定できるので、Azure に限らず活用できる監視ツールだと思います。

書籍「はじめてのSpring Boot」の感想

これまで .NET を使って開発してきたのですが、仕事で Java を使う機会があったので、「はじめてのSpring Boot」を読みました。

どんな書籍なのか?

この書籍は、これから Spring Boot を学ぼうとしている初心者に向けた入門書です。
Spring Framework の DI やデータアクセスといった基礎から始まり、Spring Boot の良さを解説しながら、ステップバイステップで Web アプリケーションを構築できます。
Spring Boot は、公式ドキュメントが充実していますし、ネット上にも情報は山ほどありますが、体系的に日本語で学習できるところが良かったです。

  1. Spring Boot とは
  2. 速習 Spring Framework
  3. Spring Boot による Web アプリ開発
  4. PaaS 「Cloud Foundry」にデプロイ
  5. Spring Boot におけるテスト

書籍で解説するサンプルプログラムや誤植については、GitHub で公開されているため、すぐにアプリケーションを動かすこともできますし、コードのタイプミスで悩むこともないので安心です。
github.com

Spring Boot アプリケーションを Azure にデプロイする

この書籍では Cloud Foundry にデプロイする方法が紹介されていますが、ここでは Azure にデプロイしてみます。

Azure Web App にデプロイする

Azure Web App にデプロイするためには、Spring Boot アプリケーションを配布するための jar ファイルと Web.config が必要です。
まずは、Maven のコマンドで jar ファイルを作成します。

$ ./mvnw package

次に、jar ファイルのパスを設定した Web.config を作成します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
        arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar &quot;%HOME%\site\wwwroot\demo-0.0.1-SNAPSHOT.jar&quot;">
    </httpPlatform>
  </system.webServer>
</configuration>

Azure ポータルから Advanced Tools(Kudu)を開いて、jar ファイルと Web.config を「d:¥home¥site¥wwwroot」にアップロードすれば、デプロイできます。

f:id:TonyTonyKun:20171130010224p:plain

Azure Web App for Containers にデプロイする

Azure Web App for Containers にデプロイするためには、Spring Boot アプリケーションをコンテナ化する必要があります。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/helloworld-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
EXPOSE 8080
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

Dockerfile を作成し、Docker コマンドでビルドしたイメージを Docker Hub にプッシュしておきます。

$ docker build -t thara0402/sbapp:latest ./
$ docker push thara0402/sbapp:latest

Azure ポータルから Docker Container の画面で、プッシュした Docker イメージの URL を指定すれば、デプロイできます。

f:id:TonyTonyKun:20171130010248p:plain

まとめ

この書籍は、Java や .NET など何かしらの言語での開発経験があり、これから Spring Boot を学びたい人にお勧めできる内容です。
まずは、アプリケーションを作って感触をつかみ、そのあとに、書籍にでてくる用語を詳しく調べたり、Spring Boot の公式ドキュメントを利用して理解を深めていくのが良いと思います。

Azure Container Service (AKS) を試してみた

先週、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 のテンプレートが表示されます。
f:id:TonyTonyKun:20171031035658p:plain
次に、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 に向けて、クラウドらしい便利なサービスになることを期待したいです。