#はじめに
k3sの検証環境上にElasticsearchとAWXが揃ったので、AWXの実行ログを連携するようにしてみました。
前回同様、@sky_jokerxx氏のBlogを参考にしつつ、ES・AWXが同じKubernetesクラスタ上にある構成での設定の一例として記録を残しておきます。
参考:Ansible Tower(AWX)のシステムログ及びジョブ実行ログを一先ずElasticsearchに取り込んで可視化する手順(備忘録)です。 | 日常系エンジニアのTech Blog
#環境
- k3s v0.10.0 (Kubernetes v1.16.2)
- Elasticsearch 7.4.1
- AWX 8.0.0
#Logstashのデプロイ
Elasticsearchにデータ連携をするため、LogstashもKubernetes上にデプロイします。
---
apiVersion: v1
kind: ConfigMap
metadata:
name: logstash-awx
namespace: awx
data:
logstash.conf: |-
input {
http {
port => 5140
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => "elasticsearch-es-http.elastic"
index => "awx"
user => "elastic"
password => "<Elasticsearchのパスワード>"
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: logstash-awx
namespace: awx
spec:
selector:
matchLabels:
app: logstash-awx
template:
metadata:
labels:
app: logstash-awx
spec:
containers:
- image: docker.elastic.co/logstash/logstash-oss:7.4.1
name: logstash-awx
ports:
- name: logstash
containerPort: 5140
protocol: TCP
volumeMounts:
- name: config
mountPath: /usr/share/logstash/pipeline
readOnly: true
command:
- "/bin/sh"
- "-c"
- "sed -i -e 's/Xms1g/Xms256m/g' -e 's/Xmx1g/Xmx256m/g' /usr/share/logstash/config/jvm.options; logstash"
resources:
limits:
memory: 0.5Gi
cpu: "500m"
requests:
memory: 0.5Gi
cpu: "500m"
volumes:
- name: config
configMap:
name: logstash-awx
items:
- key: logstash.conf
path: logstash.conf
---
apiVersion: v1
kind: Service
metadata:
name: logstash-awx
namespace: awx
labels:
app: logstash-awx
spec:
selector:
app: logstash-awx
ports:
- name: logstash
port: 5140
targetPort: 5140
protocol: TCP
LogstashのnamespaceはAWXと同じ(awx)にデプロイしています。
同一クラスタ内の別namespaceにあるServiceを宛先指定する際は、
<Service名>.<namespace名>
と指定すればOKです。(ConfigMap内のElasticsearchホスト指定部分)
ElasticsearchのUser/Passwordは取り敢えずデフォルトのものを指定しています。
別namespaceからはSecretを参照できないため、Passwordも直書きしてしまっています。(今後要検討)
また、ホストのリソースに余裕が無いため、リソースを削ることにしました。
(Javaヒープを上手く変える方法がなく、力業でなんとかしてます)
このYAMLファイルをデプロイして
$ kubectl apply -f logstash-awx.yaml
configmap/logstash-awx created
deployment.apps/logstash-awx created
service/logstash-awx created
起動してポートがLISTENされるまで待ちます。
$ kubectl get pod -n awx
NAME READY STATUS RESTARTS AGE
awx-postgresql-postgresql-0 1/1 Running 0 13h
awx-0 4/4 Running 0 13h
logstash-awx-786599d98b-hswsk 1/1 Running 0 8s
$ kubectl logs -f logstash-awx-786599d98b-hswsk -n awx
〜中略〜
[2019-10-24T08:07:20,044][INFO ][logstash.inputs.http ] Starting http input listener {:address=>"0.0.0.0:5140", :ssl=>"false"}
#AWXでログの出力設定
左メニュー下部の「設定」->「システム」をクリックしたのち上部の「ロギング」を選び、各項目に以下の値を設定します。
- ログアグリゲーター:http://logstash-awx
- ログアグリゲーターポート:5140
- ログアグリゲーターのタイプ:「logstash」を選択
- ログアグリゲーターのプロトコル:「HTTPS/HTTP」を選択
ログアグリゲーターのプロトコルはTCPでもテストは成功しますが、実際のデータ連携時にJSONのパースに失敗します。
また、HTTPS/HTTPを選んだ場合はアグリゲーターの指定に「http://」を付けないとhttpsで接続しにいき、コネクションに失敗します。
値を入力したら「テスト」をクリックし、問題なければ「保存」します。
保存後に、上部の「外部ログの有効化」をオンにしてください。
設定が完了したら、適当にジョブを動かしてみます。
#Elasticsearch(Kibana)で確認
Kibanaにログインし、Management->Elasticsearch Index Managementの欄に「awx」というインデックスが見えていればログ連携ができています。
Kibana Index Patternsで「Create index pattern」をクリック、
「Time Filter field name」に「@timestamp」を指定して作成すればOKです。
#終わりに
とりあえずログの連携まではできました。
あとはKibanaのDashboard(visualization)を作れれば完璧ですが、作り方がよくわからず…。