こんにちは、アキバです。
最近、iPad Pro + Apple Pencil 2 を買いました。
元々、社内でも有名な手書きメモ好きなのですが、最強の武器を手に入れた気分で毎日ウハウハしています。
手書きメモばかりでなく、勉強もしようということで、ElasticStack や Azure についても触ったり、調べたりしています。
というところで、今回から複数回に分けて、AKS(Azure Kubernetes Service)を用いて作成した Kubernetes(k8s)クラスタを ElasticStack で監視する方法について解説します。
第一回目である今回は、k8s クラスタのノードや Pod を Metricbeat / Filebeat で監視します。
k8s のようなスケールイン/アウトを前提としたプラットフォームでクラスタを構築する場合、監視のビューも動的なノード追加/削除に追従できることが求められます。
Elastic Stack には、 このようなクラスタを監視するのに便利な Infrastructure UI や Logs UI が提供されているので、これを使います。
監視の情報は Metricbeat と Filebeat を用いて収集します。
Metricbeat と Filebeat は、それぞれ以下のように Kibana の UI と対応しています。
- Metricbeat: メトリックデータ → Infrastructure UI
- Filebeat: ログデータ → Logs UI
概要/前提
ElasticStack はバージョン7.2.0 を用います。
k8s クラスタ、および監視用の Elastic Stack はいずれも東日本リージョン(japaneast)上に構築します。
構成は以下のようになります。
後ほど説明しますが、AKS は k8s 用のリソースグループを自動的に作成します。
このリソースグループは外部から指定することができないため、必然的に、Elastic Stack 用とは異なるリソースグループを使用することになります。
このため、監視を行うために両者の仮想ネットワーク間をピアリング設定により接続しています。
監視対象とするAKSのアプリケーションは、AKSのチュートリアルで提供されている Vote サンプルを用います。
■AKSチュートリアル
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-prepare-app
このチュートリアルをなぞることで、Vote サンプルを用いた AKS の k8s クラスタが構築できます。
したがって、本記事ではAKSクラスタ構築の説明は割愛します。
なお、上記チュートリアルを実行するユーザは、該当のサブスクリプションで(デフォルトのロールでは)所有者になっている必要がありますので注意してください。
(k8s が作成するリソースグループから Azure Container Registry への pull 権限の割り当てを行う際に必要となります)
以降の説明については、AKS で Vote サンプルアプリケーションの動作環境が構築済みであることを前提とします。
Azure のアカウントが「無料使用版」である場合、VMサイズに制約が出る可能性があるため、「従量課金」以上のサブスクリプションをお薦めします。
なお、本記事で説明する手順は Linux 上で Azure CLI を用いて行っています。PowerShell のコマンドを用いる場合は適宜コマンドやパスを読み替えてください。
1.Elasticsearch+Kibana の準備
まずは、監視データを蓄積/可視化するための Elasticsearch + Kibana のサーバを用意しましょう。
Azure には Marketplace に Elasticsearch の構築に便利なテンプレートが用意されています。
github.com
このテンプレートを使用することで、コマンド一発10分程度で Elasticsearchクラスタ + Kibana を Azure 上に構築することができます。
作り直しも比較的簡単に行えるので、勇気をもってパラメータ変更にトライできるのが良いですね。
(1) テンプレートを取得し、パラメータファイルを編集する
取得してきた azure-marketplace の中にある password.parameters.json を編集します。
(今回は、説明を簡単にするためにパスワード認証のVMを作成します。ちゃんとした環境では鍵認証になる ssh.parameters.json を使った方が良いでしょう)
$ cd azure-marketplace
$ vi parameters/password.parameters.json.org
主に変更した箇所は以下の通りです。
パラメータ名 |
変更値 |
esVersion |
7.2.0 |
esClusterName |
(任意) |
vmDataDiskCount |
1 |
vmDataNodeCount |
1 |
vmSizeKibana |
Standard_D1_v2 |
vmSizeDataNodes |
Standard_D1_v2 |
adminUsername |
esadmin |
adminPassword |
(任意) → OSログイン時のesadminのパスワード |
security*Password |
(任意) → Elasticsearchのパスワード |
vNetNewAddressPrefix |
192.168.0.0/24 |
vNetLoadBalancerIp |
192.168.0.4 |
vNetNewClusterSubnetAddressPrefix |
192.168.0.0/25 |
vNetNewAppGatewaySubnetAddressPrefix |
192.168.0.128/28 |
パラメータ設定のポイント
ポイントは以下4点あります。
1. VMサイズ(vmSize~)
今回は東日本リージョンを用いますが、テンプレートのパラメータファイルをそのまま使用すると、該当するVMサイズが存在しないため構築に失敗します。
東日本に限らず、構築するリージョンで提供されているVMサイズを調べるには、以下のコマンドを使用してください。
--size
で指定した文字列で始まるVMサイズの一覧が見れます。
$ az vm list-skus --location japaneast --size Standard_D --output table
テンプレートでは Standard_D1 となっていたVMが、本記事執筆時点では Standard_D1_v2 となっていたため、パラメータファイルを書き換えています。
2. DataNode数(vmDataNodeCount)
今回はお試しなので1台構成(Master / DataNode兼用)にしています。
実際にはサイジングを行い、必要なノード数を指定してください。
※なお、マスタノードを別に用意する指定も可能ですが、ここでは言及しません。
3. セキュリティパスワード(adminPassword/security~Password)
このテンプレートで作成するElasticsearchはデフォルトでSecurityが有効になっています。ここで設定したパスワード(特に securityAdminPassword)を認証時に使用します。
テンプレートが対象としているElasticsearchのバージョンによって、パスワードの種類が増減している場合がありますので、構築時にエラーが出た場合はその内容に従ってパラメータを追加・削除してください。
4. ネットワークアドレス(vNet~)
ピアリングして通信する関係上、AKS が自動的に作成するリソースグループ内の仮想ネットワークのアドレス帯(10.0.0.0/8)と重複しないようにします。
ここでは、192.168.0.0/24 を使用することにしました。
(2) テンプレートを使用した構築
まずは、リソースグループを作成します。
$ az group create -l japaneast -n rgAksMonitorElastic
次に、テンプレートを使用してElasticsearch と Kibana のサーバを構築します。
構築のパラメータは、先ほど編集したファイルを指定します。
$ template_base_uri=https://raw.githubusercontent.com/elastic/azure-marketplace
$ template_version=7.2.0
$ az group deployment create --resource-group "rgAksMonitorElastic" \
--template-uri ${template_base_uri}/${template_version}/src/mainTemplate.json \
--parameters @parameters/password.parameters.json
構築に成功すると、JSON形式のメッセージが出力されます。
Kibana にアクセスするためのURL は、このメッセージ内に出力されます。
"kibana": {
"type": "String",
"value": "http://kb-xxxxxxxxxxxxxxx.japaneast.cloudapp.azure.com:5601"
},
このURLを指定して、ブラウザから Kibana 画面を開くと、ログイン認証画面になります。
- ユーザ名:elastic
- パスワード:(パラメータファイルに設定した文字列)
でログインしてください。
2.ピアリング設定
ElasticStack 用クラスタの作成に成功したら、 k8s 用クラスタとの間のピアリング設定を行います。
ピアリング設定は、Azureポータルから行います。(※azure-cli でも可能です)
(1) ピアリングの追加ウィザードを開く
- Azure ポータルで、仮想ネットワーク:aks-vnet-00000000(AKSクラスタ側)を選択します。
- 左側のメニューから「ピアリング」を選択します。
- 上側のコントロールから「追加」を選択します。
(2) 設定値を与えてピアリングを作成する
以下の設定値を与えて、ピアリングを作成します。(ピアリングの名前は一例です)
項目名 |
設定値 |
aks-vnet-00000000 から es-net へのピアリングの名前 |
peerToElasticMonitoring |
仮想ネットワークの名前 |
es-net (rgAksMonitorElastic) |
es-net から aks-vnet-00000000 へのピアリングの名前 |
peerToAksVnet00000000 |
その他はデフォルト値のまま(仮想ネットワークアクセス許可:有効、転送トラフィック:無効、ゲートウェイ転送:なし)とします。
ピアリングの作成に成功したら、k8s のノードから Elasticsearch サーバにアクセスができるようになります。
3.Filebeat / Metricbeat の設定
k8s の Node、Pod の 情報を Elasticsearch に送るために、 Filebeat と Metricbeat を設定します。
各Beatsは、KubernetesのNode/Podの増減に追従する必要があります。
- Node/Pod が増えたら、Filebeat/Metricbeatの監視を追加する
- Node/Pod が減ったら、Filebeat/Metricbeatの監視を削除する
これらを実現するために、Filebeat/Metricbeat は、 k8s の DaemonSet を使って各ノードに適用します。
以下に、DaemonSet で Filebeat/Metricbeat 適用するための設定ファイルが公開されていますので、これを利用します。
(各バージョンごとに用意されているようなので、URL中のバージョンに注意して取得しましょう)
https://raw.githubusercontent.com/elastic/beats/7.2/deploy/kubernetes/filebeat-kubernetes.yaml
https://raw.githubusercontent.com/elastic/beats/7.2/deploy/kubernetes/metricbeat-kubernetes.yaml
以下のコマンドで、ローカルに取得します。
$ wget https://raw.githubusercontent.com/elastic/beats/7.2/deploy/kubernetes/filebeat-kubernetes.yaml
$ wget https://raw.githubusercontent.com/elastic/beats/7.2/deploy/kubernetes/metricbeat-kubernetes.yaml
それぞれ、以下の場所に Elasticsearch サーバの IP アドレスを指定する箇所があるので、環境に合わせて変更します。
以下は filebeat-kubernetes.yaml の場合(1か所)です。metricbeat-kubernetes.yaml の場合は 2か所あるので、忘れずに変更してください。
:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
labels:
k8s-app: filebeat
spec:
template:
:
spec:
:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.2.0
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
env:
- name: ELASTICSEARCH_HOST
value: 192.168.0.5 ★ここをElasticsearchサーバのIPアドレスに書き換える
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
value: changeme ★ここをElasticsearchサーバの認証パスワードに書き換える
:
変更したら、適用しましょう。
$ kubectl create -f filebeat-kubernetes.yaml
configmap/filebeat-config created
configmap/filebeat-inputs created
daemonset.extensions/filebeat created
clusterrolebinding.rbac.authorization.k8s.io/filebeat created
clusterrole.rbac.authorization.k8s.io/filebeat created
serviceaccount/filebeat created
$ kubectl create -f metricbeat-kubernetes.yaml
configmap/metricbeat-daemonset-config created
configmap/metricbeat-daemonset-modules created
daemonset.extensions/metricbeat created
configmap/metricbeat-deployment-config created
configmap/metricbeat-deployment-modules created
deployment.apps/metricbeat created
clusterrolebinding.rbac.authorization.k8s.io/metricbeat created
clusterrole.rbac.authorization.k8s.io/metricbeat created
serviceaccount/metricbeat created
適用できたら、確認します。
「AVAILABLE」の値が、 k8s のノード数と一致すれば成功です。
$ kubectl get ds -n=kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
filebeat 1 1 1 1 1 <none> 73s
metricbeat 1 1 1 1 1 <none> 66s
3.Kibana 画面で見る
改めて、Kibanaの画面を開きます。
(1) Infrastructure UI
Infrastructure UIでは以下のような画面が見れます。
Map View
(2) Logs UI
Logs UI では以下のような画面が見れます。
ログ
ログの詳細
まとめ
k8s クラスタでの Node や Pods の監視を、監視対象となるアプリケーションの変更なしに、Kibana で簡単に可視化できることがわかりました。
動的にノードやコンテナがスケールするクラスタでは、こういった可視化をサポートする仕組みが必要不可欠です。
本記事では触れませんが、各 View では、簡単な操作でドリルダウンを行うことができますので、いろいろ触って使い方に慣れておくと良いと思います。
次回は、コンテナ内で動いているミドルウェアの監視について説明したいと思います。
それでは。
参考文献
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com