[Docker, WLS] Let WebLogic work with ELK in Kubernetes

原文はこちら。
https://blogs.oracle.com/weblogicserver/let-weblogic-work-with-elk-in-kubernetes

過去10年間で、アプリケーションの開発、配布、展開に大きな変化があり、要件を満たすツールがますます普及してきましたが、その中にELKスタックがあります。この記事では、KubernetesでWebLogic ServerとELKスタックを統合する方法を説明します。
注:この記事のコードは以下のURLにあります。
WebLogic Server integration with ELK Stack
https://github.com/xiumliang/Weblogic-ELK

What ELK stack refers to ?

ELKスタックは、Elasticsearch、Logstash、およびKibanaで構成されています。 ELKスタックを使用すると、アプリケーションのログデータからリアルタイムで洞察を得ることができます。
Elasticsearch
増大するユースケースを解決することができる、分散RESTful検索・分析エンジンです。Elastic Stackの心臓部として、データを一元的に保存して、予期したものを発見したり、予期しないものを発見することができます。
Logstash
オープンソースのサーバーサイド・データ処理パイプラインで、多数のソースからのデータを同時に取り込み、変換してお気に入りのstashに送信します。
Kibana
Elasticsearchデータを視覚化し、Elastic Stackをナビゲートできます。これにより、データを具体化する方法を自由に選択できます。お探しのものを常に知る必要はありません。

Let WebLogic work with ELK

ELKを使用してWebLogicログを収集および分析するには、いくつかの方法があります。 この記事では、2つを紹介します。

Integrate ELK with WebLogic by using shared volume

Weblogic Serverはログを共有ボリュームに入れます。ボリュームは、NFSパスまたはホストパスである可能性があります。Logstashはボリュームからログを収集し、フィルタリングされたログをElasticsearchに転送します。このタイプの統合には、ログ用の共有ディスクが必要です。利点は、Weblogic ServerやELK Podがシャットダウンした後でも、ログファイルが保存され、永続化されている点です。共有ボリュームを使用すると、LogstashとElasticsearchの間のネットワーク構成を考慮する必要はありません。2つのPod (ELK、Weblogic) を配備して共有ボリュームを使用するだけで済みます。欠点は、Podの共有ボリュームをメンテナンスする必要がある点です。つまり、ディスクスペースを考慮する必要があります。マルチサーバー環境では、競合が起こらないように共有ボリュームのログを整理する必要があります。
Integrate_ELK_WLS_VIA_Shared_Volume

Deploy Weblogic POD to Kubernetes

$ kubectl create -f k8s_weblogic.yaml
この .yaml ファイルで、'hostPath' という種類の共有ボリュームを定義します。Podが起動すると、WebLogic Serverのログを共有ボリュームに書き込むので、Logstashは書き出されたログを取得できます。ボリュームタイプをNFSやその他のKubernetesでサポートしているタイプに変更できますが、パーミッションの問題に注意する必要があります。パーミッションが正しくないと、ログを共有ディスクに書き込めなかったり、読み出せなかったりします。
続いて、Podのデプロイと起動を確認しましょう。
$ kubectl get pods
以下のように表示されます。
NAME                                 READY     STATUS        RESTARTS   AGE
----------------------------------------------------------------------------------------------------
weblogic-1725565574-fgmsr            1/1       Running        0         31s

Deploy ELK POD to Kubernetes

$ kubectl create -f k8s_elk.yaml
K8s_elk.yaml ファイルでは、k8s_weblogic.yamlの定義と同じ共有ボリュームを定義します。WebLogic Serverと ELK Podは両方とも共有ボリュームをマウントするため、Logstashはログを読み取ることができます。
Logstash起動の前に更なる設定が必要ゆえ、Pod起動時にLogstashを起動しないようにしてください。
ELK Pod の起動後、Kubernetes nodeに2個のPodが現れるはずです。
NAME                                 READY     STATUS        RESTARTS   AGE
----------------------------------------------------------------------------------------------------
weblogic-1725565574-fgmsr            1/1       Running        0         31s
elk-3823852708-zwbfg                 1/1       Running        0          6m

Connect to the POD & verify ELK started on the POD machine

$ kubectl exec -it elk-3823852708-zwbfg /bin/bash
以下のコマンドを実行してElasticstashの起動を確認します。
$ curl GET -i "http://127.0.0.1:9200"
$ curl GET -i "http://127.0.0.1:9200/_cat/indices?v
Elasticstashが起動済みであれば、以下のようなインデックスが現れるはずです。
-------------------------------------------------------------------------------------------------------------------------------------------
health status index         uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open  .kibana        Mm38FXiGSGWcfjmNKOcwFQ   1   1          1            0      3.2kb          3.2kb
-------------------------------------------------------------------------------------------------------------------------------------------
KibanaはWebアプリケーションなので、Kibanaをブラウザで確認します。以下のURLでブラウザからアクセスします。
http://[NODE_IP_ADDRESS]:31711/app/kibana
Kibanaのwelcomeページが現れていればOKです。31712/tcpはk8s_elk.yamlで定義されたノードのポートです。
(訳注)
上記は2017/10/18現在の原文に従って訳していますが、k8s_elk.yamlでは31711/tcpはKibana用のポート、31712/tcpはElasticstash用のポートとして定義されています。

Config Logstash

$ vim /opt/logstash/config/logstash.conf
このファイルで、"input blcok" ではLogstashが入力ログを取得する場所を定義しています。 "filer block" ではWebLogic Serverのログのフィルタリングに関するシンプルなルールを定義しています。"output block" は、Logstashがフィルタリングしたログをアドレスとポート番号で定まる転送先のElassticsearchを定義しています。

Start Logstash & verify the result

$ /opt/logstash/bin# ./logstash -f ../config/logstash.conf
Logstash起動後、ブラウザを開いてElasticsearchのアドレスを指定します。
http://[NODE_IP_ADDRESS]:31712/_cat/indices?v
health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
-------------------------------------------------------------------------------------------------------------------------------------------
yellow open   logstash-2017.07.28 aj2jlijbSXyJ8KQXJKQJtQ   5   1        332            0    531.9kb        531.9kb
yellow open   .kibana             RYGWMj1ZQ1mS1gwa7yKevg   1   1          1            0      3.2kb          3.2kb
-------------------------------------------------------------------------------------------------------------------------------------------
上記の結果と比較すると、logstash-2017.07.28の行が増えています。これはLogstashが起動しログをElasticsearchに転送していることを意味します。WebLogic Serverの任意のアプリケーションにアクセスを試行することもできます。この時点でELKはログを収集し処理することができます。

Integrate ELK with Weblogic via Network

このアプローチでは、Weblogic ServerとLogstashエージェントが1つのPodにデプロイされ、ElasticsearchとKibanaが別のPodにデプロイされています。LogstashとElasticsearchは同一Podにないので、Logstashは(外部の)ipポート経由でElasticsearchにデータを転送する必要があります。このタイプの統合では、Logstash用にネットワークを設定する必要があります。複数のWebLogic Serverを使用する場合に共有ディスクをメンテナンスしたりログフォルダを整理したりする必要がないという長所がありますが、ログを収集できるように、各Weblogic ServerのPodにLogstashを追加する必要があるという短所があります。
Integrate_ELK_WLS_Via_Network

Deploy Elasticsearch & Kibana to Kubernetes

$ kubectl create -f k8s_ek.yaml
k8s_ek.yamlはk8s_elk.yamlに類似しており、両者は同じイメージを使います。違いはk8s_ek.yamlでは環境変数"LOGSTASH_START = 0"が設定されている点です。これはつまり、Logstashはコンテナ起動時に開始しないということです。また、k8s_ek.yamlではLogstashのポート番号を定義しません。Logstashは同一PodにあるWebLogic Serverで定義します。
We can verify the ek start up with:
http://[NODE_IP_ADDRESS]:31712/_cat/indices?v

Generate  Logstash config with EK POD ip

$ kubectl describe pod ek-3905776065-4rmdx
以下のような情報を取得できました。
Name:             ek-3905776065-4rmdx
Namespace:    liangz
Node:              [NODE_HOST_NAME]/10.245.252.214
Start Time:      Thu, 02 Aug 2017 14:37:19 +0800
Labels:            k8s-app=ek
                        pod-template-hash=3905776065
Annotations:     kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"liangz-cn","name":"ek-3905776065","uid":"09a30990-7296-11e7-bd24-0021f6e6a769","a...
Status:            Running
IP:                   10.34.0.5
EK PodのIPアドレスは[10.34.0.5]です。このIPをLogstash.confに設定する必要があります。Logstash.confを配置する必要のある共有ボリュームに移動し、Logstash.confを作成します。
input {
  file {
    path => "/shared-logs/*.log*"
    start_position => beginning
  }
}
filter {
  grok {
    match => [ "message", "<%{DATA:log_timestamp}> <%{WORD:log_level}> <%{WORD:thread}> <%{HOSTNAME:hostname}> <%{HOSTNAME:servername}> <%{DATA:timer}> <<%{DATA:kernel}>> <> <%{DATA:uuid}> <%{NUMBER:timestamp}> <%{DATA:misc}> <%{DATA:log_number}> <%{DATA:log_message}>" ]
  }
}
output {
  elasticsearch {
    hosts => ["10.34.0.5:9200"]
  }
}
2個のVolumeMountsをLogstash-Weblogic Podに定義します。
Log path: /shared-logs
同一PodのLogstashにログを共有するWebLogic Serverのために
conf path: /shared-conf
Logstash用には、Logstash.configを使います。
上記のLogstash.confでは、入力ファイルパス(/shared-logs)を定義しており、これは以前に見つけた"10.34.0.5:9200"でElasticsearchに接続します。

Deploy Logstash & Weblogic POD to Kubernetes

$ kubectl create -f k8s_logstash_weblogic.yaml
このyamlでは、 2つのイメージ(Weblogic、Logstash)を追加しています。この2個のイメージは、Podレベルの共有ボリューム "shared-logs"でWeblogicログを共有していましたが、これは、WeblogicとLogstashを一緒に定義する利点です。もうNFSを使いません。Podをより多くのノードに配備したい場合は、レプリカの値を変更するだけです。すべての新しいPodには、Podレベルの共有ボリュームがそれぞれあります。ログの競合を考慮する必要はありません。
$ kubectl get pods

NAME                                    READY     STATUS    RESTARTS   AGE
-------------------------------------------------------------------------------------------
ek-3905776065-4rmdx               1/1       Running          0          6m
logstash-wls-38554443-n366v   2/2       Running          0          14s

Verify the result

以下のURLを確認しましょう。
http://[NODE_IP_ADDRESS]:31712/_cat/indices?v

health status  index                       uuid                pri rep   docs.count  docs.deleted store.size  pri.store.size
----------------------------------------------------------------------------------------------------------------------------
yellow open   logstash-2017.08.02      4hyMJS1BSlaL_NoAQ-8QTw   5   1        273            0      435kb          435kb
yellow open   .kibana                  RaivcqCITTOM-VqrG-Nctw   1   1          1            0      3.2kb          3.2kb
最初の行は、Logstashがログを収集してElasticsearchに転送したことを示しています。

0 件のコメント:

コメントを投稿