Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

AKSで構築したKubernetesクラスタをElasticStackで監視する (3)Elastic APM編

こんにちは、アキバです。

少し間が空いてしまいましたが、Azure Kubernetes Service(AKS)を用いて作成した Kubernetesk8sクラスタを ElasticStack で監視する方法の第3回(最終回)です。

これまでの2回分については以下リンクを参照してください。

最終回である第3回は、 AKS 上で動作するアプリケーションに Elastic APM を適用します。

これまでに触れた通り、k8s 上で動かしているアプリケーションは動的にスケールアウト/スケールインします。 つまり、コンテナは決まった場所で動き続けるように設定できません。 そのため、性能が出ていない時などに、どのコンテナが原因なのかを調べるのが困難であるという性質をもっています。

k8s 上で動くアプリケーションの処理性能を監視したいと考えたときは、 Application Performance Management(APM)を導入することが必須と言えるでしょう。

ということで、AKS チュートリアルアプリに対して Elastic APM を適用してみます。

1. APM Server のインストール

まずは、 APM Server をインストールします。

Elastic APMAPM Server は、apm-server というパッケージ名になっています。 今回は、リソース節約のため apm-server をデータノード(mon-data-0)に同居させます。

次に示す URL にあるリファレンスを見て、インストール方法を確認してください。

https://www.elastic.co/guide/en/apm/server/7.2/setup-repositories.html

Marketplace で作成した mon-data-0 サーバの OS は、 Ubuntu-16.04 なので、apt を使ったインストールを行います。

インストールに成功すると、サービス登録されていることが確認できます。 なお、この時点ではまだ起動していません。

$ sudo service apm-server status
● apm-server.service - Elastic APM Server
   Loaded: loaded (/lib/systemd/system/apm-server.service; disabled; vendor ...
   Active: inactive (dead)
     Docs: https://www.elastic.co/solutions/apm

APM Agent は、 APM Server とは異なるサーバで動作するため、データを受信できるように APM Server の設定ファイルを編集しておきます。

$ sudo vi /etc/apm-server/apm-server.yml

編集箇所は次のようになります。 Elasticsearch サーバの認証設定を忘れないようにしましょう。

apm-server:
  host: "0.0.0.0:8200"    ★サーバ外部からの接続に対応する設定
  :
output.elasticsearch:username: "elastic"
  password: "elastic_users_password"  ★サーバ構築時に設定したパスワードにする

設定が完了したら、APM Server を起動します。 また、 OS 起動時に APM Server が自動起動するようにしておきます。

$ sudo systemctl enable apm-server  ★自動起動する設定
$ sudo systemctl start apm-server  ★APM Serverの起動
$ sudo systemctl status apm-server
● apm-server.service - Elastic APM Server
   Loaded: loaded (/lib/systemd/system/apm-server.service; enabled; vendor ...
   Active: active (running) since Mon 2019-09-01 12:34:56 UTC; 9s ago
     Docs: https://www.elastic.co/solutions/apm
 Main PID: 12345 (apm-server)
    Tasks: 7
   Memory: 13.5M
      CPU: 82ms
   CGroup: /system.slice/apm-server.service
           mq88786 /usr/share/apm-server/bin/apm-server -e -c /etc/apm-server...

2. APM Agent のインストール/設定

次に、APM Agent を k8s 上で動かすアプリケーションに組み込みます。 組み込まれた APM Agent が、アプリケーションから情報を収集し、 APM Server に情報を送信します。

組み込むには、 azure-vote-app-redis で次に示すファイルを編集します。

(1) azure-vote/Dockerfile

FROM tiangolo/uwsgi-nginx-flask:python3.6
RUN pip install redis elastic-apm[flask]  ★末尾に「elastic-apm[flask]」を追記
ADD /azure-vote /app

(2) azure-vote/azure-vote/main.py

from flask import Flask, request, render_template
from elasticapm.contrib.flask import ElasticAPM  ★この行を追加
import os
import random
import redis
import socket
import sys

app = Flask(__name__)

# ---- 追加ここから ----
# Enable ElasticAPM
app.config['ELASTIC_APM'] = {
    'SERVICE_NAME': 'azure-voting-app',
    'SERVER_URL': 'http://192.168.0.5:8200'  # ★mon-data-0 サーバのIPアドレス
}

apm = ElasticAPM(app)
# ---- 追加ここまで ----

3. APM Agent を組み込んだアプリケーションを動かす

APM Agent の組み込み設定が完了したら、 k8s 上のアプリケーションを更新しましょう。

AKS チュートリアルを参考にして、新しいバージョンの Docker イメージをレジストリ(Azure Container Registry)にプッシュします。 今回は、新しいイメージには azure-vote-front:v2 を割り当てました。

$ docker push <レジストリ名>.azurecr.io/azure-vote-front:v2

レジストリに Docker イメージの登録ができたら、新しい Docker イメージでデプロイします。

$ kubectl get pods
$ kubectl set image deployment azure-vote-front \
  azure-vote-front=<レジストリ名>.azurecr.io/azure-vote-front:v2
$ kubectl get pods

デプロイに成功すると、 APM Agent から APM Server にアプリケーションの性能情報が送信されるようになり、 APM Server を通して Elasticsearch に情報が格納されるようになります。 格納されたデータは、 Kibana の APM 画面から見ることができます。

f:id:acro-engineer:20190910012650p:plain

まとめ

今回は、 Elastic APM を用いたアプリケーションの性能情報監視を行いました。

性能情報の監視を自前で行うには、事前のログやメトリクスの設計、アプリケーション全体を通した実装といったことを考える必要があります。 これらはそれなりに大変な作業になります。

Elastic APM を使うと、こういった作業をソースコード冒頭数行の記述と、受信側サーバの設定だけで行えて便利ですね。

これまで3回にわたって Kubernetes および Kubernetes 上で動かすミドルウェアやアプリケーションの可視化/監視を行う方法について説明してきました。

近年、 Observability という言葉が使われるようになっており、クラウド上のシステムやマイクロサービスで動作するアプリケーションの監視について必要なことが整理されています。

今シリーズで説明した Infrastructure UI(メトリクス)、Logs UI(ログ)、Elastic APM(性能方法)も、 Observability を実現するために活用することができますので、この記事を役立ていただけたら幸いです。

それでは。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com