OKE Cluster에 Filebeat와 Logstash 구성 아키텍처입니다. Filebeat는 모든 노드의 로그를 수집하기 위해 DaemonSet으로 구성이 되며, 수집된 로그는 Logstash 전달되는 구성입니다.
Filebeat을 OKE Cluster에 구성할 수 있게 Helm Chart가 제공됩니다. Helm은 쿠버네티스 패키지 매니저로 설치는 다음 링크를 참고합니다.
우선 Filebeat Helm 저장소를 추가합니다.
$ helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
Filebeat Helm Chart에서 사용할 values.yaml을 준비합니다. yaml 내용은 output을 Logstash로 구성하고, Image의 경우 Filebeat OSS로 구성하였습니다. yaml 파일은 아래 Github 저장소에서 다운받을 수 있습니다.
Filebeat_OSS_values_8.10.3.yaml
Filebeat Helm Chart를 활용하여 OKE 배포합니다.
$ helm install filebeat elastic/filebeat -f Filebeat_OSS_values_8.10.3.yaml
배포된 Filebeat을 확인합니다. Output이 Logstash로 설정이 되어 있기 때문에 Logstash가 배포되어야 Filebeat도 READY가 됩니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/filebeat-filebeat-5shwn 0/1 Running 0 4s
pod/filebeat-filebeat-6tvw5 0/1 Running 0 4s
pod/filebeat-filebeat-mcbsm 0/1 Running 0 4s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/filebeat-filebeat 3 3 0 3 0 <none> 5s
Filebeat와 마찬가지로 Logstash도 Helm Chart가 제공됩니다. Helm 레파지토리는 앞서 추가한 레파지토리를 그대로 사용합니다.
Logstash Helm Chart에서 사용할 values.yaml을 준비합니다. yaml 파일은 아래 Github 저장소에서 다운받을 수 있습니다.
Logstash_OSS_Opensearch_Output_Plugin_values_8.9.0.yaml
yaml 파일내의 <OPENSEARCH URL>
을 OCI OpenSearch URL로 변경합니다. OpenSearch URL은 생성한 OCI OpenSearch Cluster 상세 페이지에서 확인할 수 있습니다. user와 password는 Opensearch Cluster 생성 시에 생성한 User와 Password로 설정합니다.
변경 예시
output {
opensearch {
hosts => ["https://amaaaaaavsea7yia7qowt3....................opensearch.ap-seoul-1.oci.oraclecloud.com:9200"]
index => "logstash-%{[@metadata][beat]}"
user => "opensearch"
password => "changeme"
ssl => true
ssl_certificate_verification => false
}
}
이제 Logstash Helm Chart를 활용하여 OKE 배포합니다.
$ helm install logstash elastic/logstash -f Logstash_OSS_Opensearch_Output_Plugin_values_8.9.0.yaml
배포된 Logstash를 확인합니다. Logstash 배포가 완료되고 READY가 되면 Filebeat도 READY가 됩니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/filebeat-filebeat-5shwn 1/1 Running 0 16m
pod/filebeat-filebeat-6tvw5 1/1 Running 0 16m
pod/filebeat-filebeat-mcbsm 1/1 Running 0 16m
pod/logstash-logstash-0 1/1 Running 0 103s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/logstash-logstash ClusterIP 10.96.136.13 <none> 5044/TCP 105s
service/logstash-logstash-headless ClusterIP None <none> 9600/TCP 105s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/filebeat-filebeat 3 3 3 3 3 <none> 16m
NAME READY AGE
statefulset.apps/logstash-logstash 1/1 105s
간단한 애플리케이션을 배포하여 모니터링 해보도록 합니다.
먼저 Ingress Controller를 생성합니다.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/cloud/deploy.yaml
간단한 애플리케이션 (docker-hello-world)을 배포하기 위해 다음 Manifest를 작성합니다.
hello-world-ingress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: docker-hello-world
labels:
oke-app: docker-hello-world
spec:
selector:
matchLabels:
oke-app: docker-hello-world
replicas: 3
template:
metadata:
labels:
oke-app: docker-hello-world
spec:
containers:
- name: docker-hello-world
image: scottsbaldwin/docker-hello-world:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: docker-hello-world-svc
spec:
selector:
oke-app: docker-hello-world
ports:
- port: 8088
targetPort: 80
type: ClusterIP
Deployment와 서비스를 생성합니다.
$ kubectl create -f hello-world-ingress.yaml
Ingress Manifest 파일을 작성합니다
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-world-ing
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: docker-hello-world-svc
port:
number: 8088
Ingress를 생성합니다.
$ kubectl create -f ingress.yaml
External IP를 확인합니다.
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.44.164 146.xx.xx.xx 80:31713/TCP,443:32598/TCP 11m
ingress-nginx-controller-admission ClusterIP 10.96.44.45 <none> 443/TCP 11m
curl을 사용해서 호출 테스트를 합니다.
$ curl -I http://146.xx.xx.xx
HTTP/1.1 200 OK
Date: Sat, 22 Oct 2022 07:56:06 GMT
Content-Type: text/html
Content-Length: 71
Connection: keep-alive
Last-Modified: Sat, 22 Oct 2022 07:47:02 GMT
ETag: "63539ff6-47"
Accept-Ranges: bytes
아래 포스트 참고하여 OpenSearch 대시보드를 오픈합니다.
메뉴에서 Stack Management > Index Patterns를 선택한 후 Create index pattern 을 클릭합니다.
Index pattern name에 logstash-filebeat로 입력한 후 Next Step을 클릭합니다.
Time filed를 선택한 후 Create index pattern을 클릭합니다.
매뉴에서 Discover를 선택합니다. Index pattern을 앞에서 생성한 logstash-filebeat로 변경합니다.
다음과 같이 앞서 배포한 docker-hello-world 서비스에 대한 로그를 확인할 수 있습니다.
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Donghu Kim CLOUDNATIVE
oci opensearch opendashboard elasticsearch kibana filebeat logstash