OKE Cluster에 Fluent Bit와 Fluentd 구성 아키텍처입니다. Fluent Bit는 모든 노드의 로그를 수집하기 위해 DaemonSet으로 구성이 되며, 수집된 로그는 Fluentd로 전달되는 구성입니다.
Fluent Bit을 OKE Cluster에 구성할 수 있게 Helm Chart가 제공됩니다. Helm은 쿠버네티스 패키지 매니저로 설치는 다음 링크를 참고합니다.
우선 Fluent Bit Helm 저장소를 추가합니다.
$ helm repo add fluent https://fluent.github.io/helm-charts
"fluent" has been added to your repositories
Fluentbit Helm Chart에서 사용할 values.yaml을 준비합니다. yaml 파일은 아래 Github 저장소에서 다운받을 수 있습니다.
Fluent Bit Helm Chart를 활용하여 OKE 배포합니다.
$ helm upgrade --install fluent-bit fluent/fluent-bit -f Fluentbit_values.yaml
배포된 Fluent Bit을 확인합니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/fluent-bit-cd7s4 1/1 Running 0 3m5s
pod/fluent-bit-jp4dg 1/1 Running 0 3m6s
pod/fluent-bit-xt4fz 1/1 Running 0 3m5s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/fluent-bit ClusterIP 10.96.20.7 <none> 2020/TCP 3m6s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP,12250/TCP 134m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/fluent-bit 3 3 3 3 3 <none> 3m6s
Fluent Bit와 마찬가지로 Fluentd도 Helm Chart가 제공됩니다. Helm 레파지토리는 앞서 추가한 레파지토리를 그대로 사용합니다.
Fluentbit Helm Chart에서 사용할 values.yaml을 준비합니다. yaml 파일은 아래 Github 저장소에서 다운받을 수 있습니다.
Fluentd_values.yaml 파일내의 <OPENSEARCH URL>
을 OCI OpenSearch URL로 변경합니다. OpenSearch URL은 생성한 OCI OpenSearch Cluster 상세 페이지에서 확인할 수 있습니다.
변경 예시
04_outputs.conf: |-
<label @OUTPUT>
<match **>
@type opensearch
@id opensearch
@log_level info
include_tag_key true
type_name _doc
host "amaaaaaavsea7yia7qowt3....................opensearch.ap-seoul-1.oci.oraclecloud.com"
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
suppress_type_name true
</match>
</label>
이제 Fluentd Helm Chart를 활용하여 OKE 배포합니다.
$ helm upgrade --install fluentd fluent/fluentd -f Fluentd_values.yaml
배포된 Fluentd를 확인합니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/fluent-bit-cd7s4 1/1 Running 0 32m
pod/fluent-bit-jp4dg 1/1 Running 0 32m
pod/fluent-bit-xt4fz 1/1 Running 0 32m
pod/fluentd-fluentd-6cb89f56c8-sbbmj 1/1 Running 0 9m22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/fluent-bit ClusterIP 10.96.20.7 <none> 2020/TCP 32m
service/fluent-fluentd ClusterIP 10.96.105.72 <none> 24231/TCP,24224/TCP 13m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP,12250/TCP 163m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/fluent-bit 3 3 3 3 3 <none> 32m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/fluent-fluentd 1/1 1 1 13m
NAME DESIRED CURRENT READY AGE
replicaset.apps/fluent-fluentd-6cb89f56c8 1 1 1 9m22s
replicaset.apps/fluent-fluentd-8668855d46 0 0 0 13m
간단한 애플리케이션을 배포하여 모니터링 해보도록 합니다.
먼저 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에 fluentd로 입력한 후 Next Step을 클릭합니다.
Time filed를 선택한 후 Create index pattern을 클릭합니다.
매뉴에서 Discover를 선택합니다. Index pattern을 fluentd로 변경합니다.
다음과 같이 앞서 배포한 docker-hello-world 서비스에 대한 로그를 확인할 수 있습니다.
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Donghu Kim CLOUDNATIVE
oci opensearch opendashboard elasticsearch kibana fluentbit fluentd