halo sobat sekolahlinux, kali ini saya akan coba memberikan sedikit tutorial bagaimana install ELK di kubernetes dan juga bagaimana cara memasang alert pada elastic dengan elastalert, oke yuk langsung masuk ke materinya.
Install HELM
pada step ini saya akan menggunakan tool helm untuk installasi elk pada k8s, sebelumnya sobat perlu mendownload dan install helm 3, untuk tutorial install helmnya sobat bisa lihat url dibawah ini
- https://helm.sh/docs/intro/install/
Setup ELK (elastic, logstash, kibana) with HELM
selanjutnya sobat perlu menambahkan repo helm milik elastic, yang mana repo ini nantinya sobat akan gunakan untuk install elasticsearch, logstash dan kibana
helm repo add elastic https://helm.elastic.co
oh iya pada saat saya membuat tutorial ini saya menggunakan chart & app elasticsearch, logstash & kibana versi 7.9.1, untuk melihat semua versi yang ada di repo sobat bisa menggunakan perintah dibawah ini
helm search repo elastic/elasticsearch -l helm search repo elastic/logstash -l helm search repo elastic/kibana -l
lalu jika sobat ingin melihat version yang terpasang saat ini sobat bisa menggunakan perintah dibawah
helm search repo elastic/elasticsearch helm search repo elastic/logstash helm search repo elastic/kibana
selanjutnya kita perlu download values dari elasticsearch, logstash dan kibana degan command dibawah ini
helm inspect values elastic/elasticsearch > elastic.yaml helm inspect values elastic/logstash > logstash.yaml helm inspect values elastic/kibana > kibana.yaml
jika sudah sekarang coba buka values elastic.yaml dan coba lihat pada bagian paramater ini dibawah ini dan sesuaikan valuesnya dengan yang ada dibawah ini
service:
labels: {}
labelsHeadless: {}
type: NodePort
nodePort: ""
annotations: {}
httpPortName: http
transportPortName: transport
loadBalancerIP: ""
loadBalancerSourceRanges: []
clusterHealthCheckParams: "wait_for_status=yellow&timeout=1s"
lalu selanjutnya buka values logstash.yaml dan coba lihat pada bagian paramater ini dibawah ini dan sesuaikan valuesnya dengan yang ada dibawah ini, pada filter saya menambahkan grok untuk parsing log access dan error nginx
logstashPipeline:
logstash.conf: |
input {
beats {
port => "5044"
ssl => false
}
}
filter {
grok {
match => { "message" => ['(?<time>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) .%{LOGLEVEL:level}. (?<pid-threadid>%{POSINT}#%{NUMBER}.) %{GREEDYDATA:log}"}','%{IP:client_ip} (?<ident>-) (?<auth>-) \[%{HTTPDATE:timestamp}\] "%{WORD:methode} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} %{GREEDYDATA:log}'] }
}
}
output {
elasticsearch {
hosts => ["elasticsearch-master:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}"
}
}
service:
annotations: {}
type: NodePort
ports:
- name: beats
port: 5044
protocol: TCP
targetPort: 5044
- name: http
port: 8080
protocol: TCP
targetPort: 8080
lalu selanjutnya buka values kibana.yaml dan coba lihat pada bagian paramater ini dibawah ini dan sesuaikan valuesnya dengan yang ada dibawah ini
service:
type: NodePort
loadBalancerIP: ""
port: 5601
nodePort: ""
labels: {}
annotations: {}
# cloud.google.com/load-balancer-type: "Internal"
# service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
# service.beta.kubernetes.io/azure-load-balancer-internal: "true"
# service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
# service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"
loadBalancerSourceRanges: []
# 0.0.0.0/0
selanjutnya jika sudah jalankan perintah dibawah ini untuk installasinya
helm install elastic -f elastic.yaml elastic/elasticsearch helm install logstash -f logstash.yaml elastic/logstash helm install kibana -f kibana.yaml elastic/kibana
Setup Elastalert
untuk setup elastalert ini kita akan menggunakan beberapa file manifest k8s yang kamu bisa download di
- https://github.com/akbaribnu/elk-with-elastalert/tree/master/elastalert
download 3 file dari repo diatas yaitu file
configmap-config.yaml configmap-rules.yaml deployment.yaml
file configmap-config.yaml berisi config elastalert config.yaml, kurang lebih isinya seperti dibawah ini, dan untuk referensi lengkapnya kalian bisa mengunjungi doc dari elastalert di https://elastalert.readthedocs.io/en/latest/running_elastalert.html#downloading-and-configuring
apiVersion: v1
kind: ConfigMap
metadata:
name: elastalert-conf
namespace: default
data:
config.yaml: |
rules_folder: rules
scan_subdirectories: False
run_every:
minutes: 1
buffer_time:
minutes: 15
es_host: elasticsearch-master
es_port: 9200
use_ssl: False
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
days: 2
file configmap-rules.yaml berisi config rule alert elastalert http_404.yaml & http_200.yaml, kurang lebih isinya seperti dibawah ini, dan ini bisa kalian tambahkan dan rubah, untuk referensi lengkapnya kalian bisa mengunjungi doc dari elastalert di https://elastalert.readthedocs.io/en/latest/running_elastalert.html#creating-a-rule
apiVersion: v1
kind: ConfigMap
metadata:
name: elastalert-rules
namespace: default
data:
http_404.yaml: |
name: alert 404 http code
type: frequency
index: filebeat-*
num_events: 3
timeframe:
hours: 1
filter:
- query:
query_string:
query: "message: akbar AND message: curl AND client_ip: 192.168.99.100"
alert:
- "slack"
slack_webhook_url: "https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxx"
http_200.yaml: |
name: alert 200 http code
type: frequency
index: filebeat-*
num_events: 3
timeframe:
hours: 1
filter:
- term:
response: "200"
alert:
- "slack"
slack_webhook_url: "https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxx"
#rule dibawah ini digunakan untuk whitelist alert, jika didalam field yang didaftarkan pada query mengandung value gajah dan jerapah walaupun itu match maka tidak alert tidak akan dikirim, namun sebaliknya jika tidak terdapat value gajah dan jerapah maka akan mengirimkan alert
access_name.yaml: |
name: connection timeout
type: whitelist
index: kubernetes_cluster-*
ignore_null: true
compare_key: kubernetes.container_name
whitelist:
- "gajah"
- "jerapah"
num_events: 1
timeframe:
hours: 1
realert:
minutes: 1
filter:
- query:
query_string:
query: "log: nama AND log: binatang AND kubernetes.namespace_name: production"
include: ["kubernetes.pod_name", "kubernetes.namespace_name", "log"]
alert:
- "slack"
slack_webhook_url: "https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxx"
lalu pada file deployment.yaml berisi paramater seperti dibawah ini
apiVersion: apps/v1
kind: Deployment
metadata:
name: elastalert-sekolahlinux
namespace: default
spec:
revisionHistoryLimit: 1
strategy:
type: RollingUpdate
replicas: 1
selector:
matchLabels:
app: elastalert
template:
metadata:
labels:
app: elastalert
spec:
containers:
- name: elastalert-sekolahlinux
image: sekolahlinux/elastalert
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
volumeMounts:
- name: elastalert-conf
mountPath: "/elastalert/config"
- name: elastalert-rules
mountPath: "/elastalert/rules"
env:
- name: "CREATED_BY"
value: "SEKOLAHLINUX-AKBAR"
volumes:
- name: elastalert-conf
configMap:
name: elastalert-conf
- name: elastalert-rules
configMap:
name: elastalert-rules
selanjutnya kalian bisa apply 3 file diatas
kubectl apply -f configmap-config.yaml kubectl apply -f configmap-rules.yaml kubectl apply -f deployment.yaml
selanjutnya coba lihat pod di k8s
sekolahlinux@sekolahlinux:~/akbar/elk-with-elastalert/elastalert$ kubectl get pods NAME READY STATUS RESTARTS AGE pod/elastalert-sekolahlinux-5bf9fc689c-ntgqg 1/1 Running 0 1s pod/elasticsearch-master-0 1/1 Running 0 4h44m pod/elasticsearch-master-1 1/1 Running 0 4h44m pod/elasticsearch-master-2 1/1 Running 0 4h44m pod/kibana-kibana-7798666765-mgpvt 1/1 Running 0 4h44m pod/logstash-logstash-0 1/1 Running 0 4h44m
jika sudah maka selanjutkan jalankan perintah dibawah ini untuk masuk kedalam pod elastalert
kubectl exec -it elastalert-sekolahlinux-5bf9fc689c-ntgqg bash
selanjutnya dari dalam pods jalankan perintah elastalert-create-index untuk generate indices pada elastic, seperti dibawah ini
root@elastalert-sekolahlinux-5bf9fc689c-ntgqg:/elastalert# elastalert-create-index Enter Elasticsearch host: elasticsearch-master Enter Elasticsearch port: 9200 Use SSL? t/f: f Enter optional basic-auth username (or leave blank): Enter optional basic-auth password (or leave blank): Enter optional Elasticsearch URL prefix (prepends a string to the URL of every request): New index name? (Default elastalert_status) New alias name? (Default elastalert_alerts) Name of existing index to copy? (Default None) Elastic Version: 7.9.1 Reading Elastic 6 index mappings: Reading index mapping 'es_mappings/6/silence.json' Reading index mapping 'es_mappings/6/elastalert_status.json' Reading index mapping 'es_mappings/6/elastalert.json' Reading index mapping 'es_mappings/6/past_elastalert.json' Reading index mapping 'es_mappings/6/elastalert_error.json' Deleting index elastalert_status_status. New index elastalert_status created Done!
maka jika sudah, kita bisa lihat indices hasil generate elastic seperti pada gambar dibawah ini

selanjutnya kita tinggal simulasikan web server nginx yang sudah terpasang filebeat yang mengarah ke logstash di k8s untuk mendapatkan error 404, dalam hal ini saya melakukan random curl pada web server
curl http://192.168.10.100/asdsd curl http://192.168.10.100/asdsdqw curl http://192.168.10.100/asdsdas curl http://192.168.10.100/asds3 curl http://192.168.10.100/asdsd124 curl http://192.168.10.100/asds3
lalu jika sudah coba cek log pods elastalert-sekolahlinux-5bf9fc689c-ntgqg, maka kurang lebih log nya akan seperti dibawah ini
sekolahlinux@sekolahlinux:~/akbar/elk-with-elastalert/elastalert$ kubectl logs -f elastalert-sekolahlinux-5bf9fc689c-rw578 INFO:elastalert:Starting up INFO:elastalert:Disabled rules are: [] INFO:elastalert:Sleeping for 59.999932 seconds INFO:elastalert:Queried rule alert 200 http code from 2020-09-14 10:51 UTC to 2020-09-14 10:52 UTC: 0 / 0 hits INFO:elastalert:Ran alert 200 http code from 2020-09-14 10:51 UTC to 2020-09-14 10:52 UTC: 0 query hits (0 already seen), 0 matches, 0 alerts sent INFO:elastalert:Queried rule alert 404 http code from 2020-09-14 10:52 UTC to 2020-09-14 10:52 UTC: 0 / 0 hits INFO:elastalert:Ran alert 404 http code from 2020-09-14 10:52 UTC to 2020-09-14 10:52 UTC: 0 query hits (0 already seen), 0 matches, 0 alerts sent INFO:elastalert:Background configuration change check run at 2020-09-14 10:53 UTC INFO:elastalert:Disabled rules are: [] INFO:elastalert:Sleeping for 59.999879 seconds /usr/local/lib/python3.8/site-packages/urllib3-1.25.10-py3.8.egg/urllib3/connectionpool.py:981: InsecureRequestWarning: Unverified HTTPS request is being made to host 'hooks.slack.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings warnings.warn( INFO:elastalert:Alert 'alert 404 http code' sent to Slack INFO:elastalert:Background alerts thread 1 pending alerts sent at 2020-09-14 10:53 UTC INFO:elastalert:Queried rule alert 200 http code from 2020-09-14 10:51 UTC to 2020-09-14 10:53 UTC: 0 / 0 hits INFO:elastalert:Ran alert 200 http code from 2020-09-14 10:51 UTC to 2020-09-14 10:53 UTC: 0 query hits (0 already seen), 0 matches, 0 alerts sent INFO:elastalert:Queried rule alert 404 http code from 2020-09-14 10:52 UTC to 2020-09-14 10:53 UTC: 6 / 6 hits /usr/local/lib/python3.8/site-packages/urllib3-1.25.10-py3.8.egg/urllib3/connectionpool.py:981: InsecureRequestWarning: Unverified HTTPS request is being made to host 'hooks.slack.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings warnings.warn( INFO:elastalert:Alert 'alert 404 http code' sent to Slack INFO:elastalert:Ignoring match for silenced rule alert 404 http code INFO:elastalert:Ran alert 404 http code from 2020-09-14 10:52 UTC to 2020-09-14 10:53 UTC: 6 query hits (0 already seen), 2 matches, 1 alerts sent INFO:elastalert:Background configuration change check run at 2020-09-14 10:54 UTC INFO:elastalert:Background alerts thread 0 pending alerts sent at 2020-09-14 10:54 UTC INFO:elastalert:Disabled rules are: [] INFO:elastalert:Sleeping for 59.999892 seconds
dan alert di slack pun akan muncul seperti dibawah ini

sekian tutorial kali ini, terimakasih sudah membaca 😀
source git elastalert bisa kamu lihat di:
docker image elastalert yang saya buat bisa kamu temukan disini:

