5.2.2.2 FluentD로 OKE 로그 전송하기
EFK 구성에서 ElasticSearch와 Kibana 대신 OpenSearch와 OpenSearch Dashboard를 사용할 수 있도록 FluentD를 설정합니다.
Fluentd 구성
Fluentd 설치를 위한 Service Account를 생성하고 관련 권한을 정의합니다.
configmap 추가 설정정의
- Fluentd 관련 설정은 컨테이너 내에 /fluentd/etc/ 하위에 .conf 파일로 모두 정의 되어 있습니다. 이 파일들을 재정의 할 수 있습니다.
- OCI OpenSearch 연결을 위해 꼭 필요한 항목만 남겨두고 나머지는 주석 처리하였습니다.
fluentd daemonset 정의
- 설정한 configmap 사용을 위해 Fluentd 문서상의 YAML을 일부 변경하셨습니다.
- configmap으로 재정의한 fluent.conf을 사용하도록 변경하고 있습니다.
FluentD 설치
fluentd-daemonset-opensearch.yaml에서 FLUENT_OPENSEARCH_HOST를 대상 OpenSearch 호스트로 변경합니다.
... env: - name: FLUENT_OPENSEARCH_HOST value: "amaaaaaavsea7yiatk7bvqasj524dqnutj3itigg3tyviql4zppawdjdfspa.opensearch.ap-chuncheon-1.oci.oraclecloud.com" - name: FLUENT_OPENSEARCH_PORT value: "9200" ...
또한 OpenSearch API에 사용할 사용자 인증 정보를 입력합니다. 클러스터 생성시 입력한 Primary Account의 유저, 패스워드를 입력합니다.
... env: ... - name: FLUENT_OPENSEARCH_USER value: "username" - name: FLUENT_OPENSEARCH_PASSWORD value: "changeme" ...
FluentD 설치
kubectl apply -f fluentd-rbac.yaml kubectl apply -f fluentd-configmap-opensearch.yaml kubectl apply -f fluentd-daemonset-opensearch.yaml
OKE 클러스터 Worker Node에서 OpenSearch로 로그를 보낼수 있도록 보안규칙을 추가합니다.
Worker Node의 보안규칙
대상: 예) oke-nodeseclist-quick-oke-cluster-1-04cdcc334
Egress Rules:
아래 예시는 OpenSearch 위치가 서브넷인 10.0.20.0/24인 경우
Stateless Destination IP Protocol Source Port Range Destination Port Range Description No 10.0.20.0/24 TCP All 9200 OpenSearch API
OpenSearch의 보안규칙
대상: OpenSearch가 속한 서브넷의 Security List
Ingress Rules:
아래 예시는 Worker Node가 위치가 서브넷인 10.0.10.0/24인 경우
Stateless Source IP Protocol Source Port Range Destination Port Range Description No 10.0.10.0/24 TCP All 9200 OpenSearch API
로그 확인
fluentd Pod가 기동하면, 로그를 통해 OpenSearch와 연결 오류 없이 정상 동작하는 지 확인합니다.
$ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE ... fluentd-gls8b 1/1 Running 0 2m15s fluentd-jhpxj 1/1 Running 0 87s fluentd-l9mbn 1/1 Running 0 45s ... $ kubectl logs -n kube-system -f fluentd-gls8b ... 2023-04-21 15:00:05 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf" ... 2023-04-21 15:00:07 +0000 [info]: adding match pattern="**" type="opensearch" ... 2023-04-21 15:00:07 +0000 [info]: #0 starting fluentd worker pid=14 ppid=6 worker=0 2023-04-21 15:00:07 +0000 [info]: #0 [in_tail_container_logs] following tail of /var/log/containers/coredns-f7c884d6f-9kxr5_kube-system_coredns-79f0a4c0099003d963547e7e3f54d78265c84dbe85f26d1adf52ff3dca931c6a.log ...
OpenSearch Dashboard 설정
앞서 사용한 방법을 통해 다시 브라우저로 OpenSearch Dashboard에 접속을 확인합니다.
왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.
Create index pattern을 클릭합니다.
인덱스 패턴을 생성합니다.
아래쪽에 보이는 소스 중에서 fluentd 소스를 사용합니다.
- Index pattern name: fluentd*
- Time field: time
인덱스 패턴이 추가된 결과를 볼 수 있습니다.
왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.
생성한 인덱스 패턴을 통해 수집된 로그를 확인할 수 있습니다.
- 테스트 앱의 로그를 확인하기 위해 Add filter를 클릭하여 namespace_name=default 로 지정합니다.
테스트 앱을 접속합니다.
로그 확인
아래와 같이 OpenSearch Dashboard에서 테스트 앱의 로그를 확인할 수 있습니다.
Fluentd에서 사용할 OpenSearch 유저 만들기
OpenSearch Internal 유저 만들기
OpenSearch Dashboard에 Primary Account로 로그인합니다.
왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Security 를 클릭합니다.
Internal Users > Create internal user를 클릭합니다.
생성할 유저명과 패스워드를 입력하고, 아래의 Create를 클릭하여 유저를 생성합니다.
OpenSearch Role 만들기
메뉴에서 Roles을 선택합니다.
기본 설치된 Role이 보입니다. fluentd는 logstash와 동일한 권한이 필요하므로, 기본 생성된 logstash Role의 복사본을 만들어 인덱스 패턴만 변경하도록 하겠습니다.
Name: 이름을 fluentd로 변경합니다.
Cluster permissions: 변경없이 그대로 사용합니다.
Index permissions: Index에서 기존 패턴(logstatsh*)을 삭제하고, fluentd daemon에서 생성하는 인덱스 패턴을 입력합니다. fluentd*로 입력합니다. Index permission은 변경없이 그대로 사용합니다.
Index permissions에서 두번째로 있는 *beat*는 삭제합니다.
하단 Create를 클릭하여, 설정한 Role을 생성합니다.
생성한 fluentd Role에 유저를 매핑하기 위해 Mapped users 탭을 클릭하고, Manage mapping을 클릭합니다.
앞서 생성한 fluentd 유저를 선택하고 매핑합니다.
fluentd를 위한 유저 및 권한을 위한 Custom Role이 생성 완료되었습니다.
FluentD 재배포 하기
앞서 OKE 클러스터에 배포한 fluentd-daemonset-opensearch.yaml에서 사용자 인증 정보를 새로 만든 유저정보로 변경합니다.
... env: ... - name: FLUENT_OPENSEARCH_USER value: "fluentd" - name: FLUENT_OPENSEARCH_PASSWORD value: "changeme" ...
FluentD 재배포
kubectl apply -f fluentd-daemonset-opensearch.yaml
로그 확인
fluentd Pod 재기동이 완료되면, 로그를 통해 OpenSearch와 연결 오류 없이 정상 동작하는 지 확인합니다.
$ kubectl apply -f fluentd-daemonset-opensearch.yaml daemonset.apps/fluentd configured $ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE ... fluentd-dl74t 1/1 Running 0 22s fluentd-gc6gk 1/1 Running 0 27s fluentd-v8nfj 1/1 Running 0 32s ... $ kubectl logs -n kube-system -f fluentd-dl74t ... 2023-04-22 14:05:57 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf" ... 2023-04-22 14:05:59 +0000 [info]: adding match pattern="**" type="opensearch" ... 2023-04-22 14:05:59 +0000 [info]: #0 starting fluentd worker pid=14 ppid=6 worker=0 2023-04-22 14:05:59 +0000 [info]: #0 [in_tail_container_logs] following tail of /var/log/containers/coredns-f7c884d6f-xdgnw_kube-system_coredns-3195b55827bcaa7cd928bdf90d486ca7de4d5dd467ff63270dcaf132378d2758.log ...
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.