TheKoguryo's 기술 블로그

 Version 2024.05.05

[Last updated on ] archives/oracle-cloudnative/oci-services/logging/

5.2.2 OCI Search 서비스를 사용한 로그 모니터링

OpenSearch와 OpenDashboards는 2021년에 ElasticSearch와 Cabana에서 포크되어 별도 오픈소스 프로젝트로 운영되고 있습니다. OCI OpenSearch는 OCI에서 제공하는 관리형 서비스입니다.

OCI Search 서비스 사용을 위한 Policy 설정하기

OCI Search 서비스 권한 부여하기

Allow service opensearch to manage vnics in compartment <NETWORK_RESOURCES_COMPARTMENT>
Allow service opensearch to manage vcns in compartment <NETWORK_RESOURCES_COMPARTMENT>
Allow service opensearch to use subnets in compartment <NETWORK_RESOURCES_COMPARTMENT>
Allow service opensearch to use network-security-groups in compartment <NETWORK_RESOURCES_COMPARTMENT>

오라클 클라우드 콘솔에서 OCI Search 서비스 관리 권한 부여하기

  • 사용자가 속한 그룹이 SearchOpenSearchAdmins인 경우 예시
Allow group SearchOpenSearchAdmins to manage opensearch-family in compartment <CLUSTER_RESOURCES_COMPARTMENT>

OCI OpenSearch 클러스터 만들기

  1. 오라클 클라우드 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Databases > OpenSearch > Clusters 로 이동합니다.

  3. 클러스터 생성을 위해 Create Cluster 버튼을 클릭합니다.

  4. 생성할 compartment 위치 및 이름, 버전을 선택합니다.

    image-20220531171336724

  5. 생성할 노드 구성을 선택합니다. 세 가지 구성이 가능하며, 여기서는 Development 구성을 선택합니다.

    • Development: 1 마스터 노드, 1 데이타 노드, 1 OpenSearch 대쉬보드 노드
    • Application Search, Log Analytics: 3 마스터 노드, 3 데이타 노드, 3 OpenSearch 대쉬보드 노드 동일하며 데이타 노드의 CPU 크기가 다릅니다.
    • 구성을 선택후 노드 크기는 모두 수정할 수 있습니다. 또한 클러스터 생성이후에 크기를 변경할 수 있습니다.

    image-20220531171614417

  6. 클러스터가 사용할 서브넷을 설정합니다. 여기서는 OKE 클러스터 생성시 이미 만들어진 VCN과 서브넷을 편의상 선택하였습니다.

    image-20220531171724129

  7. 선택할 구성 정보를 확인하고 클러스터를 생성합니다.

    image-20220531171825297

  8. Development 구성기준으로 테스트 날짜기준, 생성시간은 20분 가량이 소요되었습니다.

  9. 생성된 클러스터 정보

    • 클러스터 정보에서 보듯에 OpenSearch와 OpenSearch Dashboard 모두 Private IP와 Private FQDN만 있습니다. 2022년 5월말 기준으로 아직 Public IP는 지원하지 않습니다.

    image-20220531173539321

  10. 클러스터의 OpenSearch API Endpoint, Private IP와 OpenSearch Dashboard의 API Endpoint 및 private IP를 확인합니다.

클러스터 연결하기 위한 설정하기

JumpBox VM 만들기

OpenSearch Dashboard는 현재 Public IP를 지원하지 않습니다. OpenSearch Dashboard를 접근을 위해 Public IP를 보유한 JumpBox VM를 추가로 생성합니다.

  1. 오라클 클라우드 콘솔, 좌측 상단 햄버거 메뉴에서 Compute > Instances로 이동합니다.

  2. 새로 Compute VM를 만듭니다.

    • Name: 예) jumpbox

    • Networking: 생성한 OpenSearch 클러스터에 접근이 가능한 VCN, Public Subnet을 선택하고 Public IP를 할당합니다.

      예) 여기서는 생성한 OpenSearch 클러스터와 동일한 네트워크를 사용하였습니다.

  3. 생성한 jumpbox VM에 접근할 수 있도록, jumpbox VM에서 OpenSearch에 접근 할 수 있도록 보안규칙을 추가합니다.

    • Ingress Rules
      • 아래 예시는 jumpbox가 위치가 서브넷인 10.0.20.0/24인 경우
    StatelessSourceIP ProtocolSource Port RangeDestination Port RangeDescription
    No0.0.0.0/0TCPAll22SSH
    No10.0.20.0/24TCPAll5601OpenSearch Dashboard
    No10.0.20.0/24TCPAll9200OpenSearch API

OpenSearch Dashboard 접속확인

  1. SSH 터널링을 통해 jumpbox VM을 통해 OpenSearch Dashboard를 접속합니다.

    • OpenSearch Cluster정보 기준, OpenSearch Dashboard private ip가 10.0.20.197인 경우
    ssh -L 5601:10.0.20.197:5601 opc@jumpbox
    
  2. jumpbox VM에 접속한후 Dashboard API Endpoint에 접속이 되는지 테스트합니다.

    • 아래와 같이 접속이 되는 것을 알 수 있으면, 현재 Self Signed 된 인증서를 사용하는 것을 알 수 있습니다.
    $ ssh -L 5601:10.0.20.197:5601 opc@jumpbox
    Activate the web console with: systemctl enable --now cockpit.socket
    
    Last login: Fri Jun  3 04:51:54 2022 from 192.188.170.86
    
    [opc@jumpbox ~]$ curl -v --insecure https://amaaaaaauzduwfyafs5lx2a77vnnbvz5wt6gbez6r3apldbqzn725kszn2xq.opendashboard.ap-chuncheon-1.oci.oracleiaas.com:5601
    ...
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    * ALPN, server accepted to use http/1.1
    * Server certificate:
    *  subject: CN=*.opendashboard.ap-chuncheon-1.oci.oracleiaas.com
    *  start date: Apr  5 02:07:20 2022 GMT
    *  expire date: Oct  2 02:08:20 2022 GMT
    *  issuer: OU=opc-device:71:a6:a1:f5:40:ae:13:ba:7b:10:71:5e:7e:84:e3:a6:6f:c1:f4:21:61:3a:e3:da:8e:30:2a:56:82:30:cc:9d; CN=PKISVC CrossRegion Intermediate r2
    *  SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
    > GET / HTTP/1.1
    > Host: amaaaaaauzduwfyafs5lx2a77vnnbvz5wt6gbez6r3apldbqzn725kszn2xq.opendashboard.ap-chuncheon-1.oci.oracleiaas.com:5601
    > User-Agent: curl/7.61.1
    > Accept: */*
    >
    < HTTP/1.1 302 Found
    < location: /app/home
    < osd-name: kibana-54c5f88dc9-gt57f
    < cache-control: private, no-cache, no-store, must-revalidate
    < content-length: 0
    < Date: Fri, 03 Jun 2022 04:58:56 GMT
    < Connection: keep-alive
    <
    * Connection #0 to host amaaaaaauzduwfyafs5lx2a77vnnbvz5wt6gbez6r3apldbqzn725kszn2xq.opendashboard.ap-chuncheon-1.oci.oracleiaas.com left intact
    
  3. SSH 터널링이 되어 있으므로, 로컬에서 브라우저로 OpenSearch Dashboard에 접속을 확인합니다.

    • 접속주소: https://localhost:5601

    image-20220603140629705

OKE에서 OpenSearch로 로그 보내기

EFK 구성에서 ElasticSearch와 Kibana 대신 OpenSearch와 OpenSearch Dashboard를 사용합니다.

Fluentd 구성

  1. Fluentd 설치를 위한 Service Account를 생성하고 관련 권한을 정의합니다.

  2. configmap 추가 설정정의

    • Fluentd 관련 설정은 컨테이너 내에 /fluentd/etc/ 하위에 .conf 파일로 모두 정의 되어 있습니다. 이 파일들을 재정의 할 수 있습니다.
    • OCI OpenSearch 클러스터가 현재 기본적으로 Self Signed 인증서를 사용합니다. 연결을 위해 꼭 필요한 기본 항목만 남겨둡니다. 주석 처리된 부분을 그냥 두고 값을 설정하지 않으면 실행시 오류가 발생합니다.
  3. fluentd damonset 정의

    • 설정한 configmap 사용을 위해 Fluentd 문서상의 YAML을 일부 변경하셨습니다.
    • configmap으로 재정의한 fluent.conf을 사용하도록 변경하고 있습니다.
    • OpenSearch Dashboard가 사용하는 Self Signed CA를 설정하고 있습니다.

OpenSearch Dashboard가 사용하는 Self Signed CA 등록

  1. SSH로 접속한 jumpbox VM 다시 돌아갑니다.

  2. 다음 명령어로 OpenSearch Endpoint의 Self Signed CA를 다운로드 합니다.

    • 클러스터의 OpenSearch API Endpoint
    openssl s_client -showcerts -connect ${OPENSEARCH_API_ENDPOINT}:9200 </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' > opensearch-ca.crt
    
    • 실행 예
    opc@jumpbox ~]$ openssl s_client -showcerts -connect amaaaaaauzduwfyafs5lx2a77vnnbvz5wt6gbez6r3apldbqzn725kszn2xq.opensearch.ap-chuncheon-1.oci.oracleiaas.com:9200 </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' > opensearch-ca.crt
    depth=2 CN = Mission Control Root CA (transitional)
    verify error:num=19:self signed certificate in certificate chain
    verify return:1
    depth=2 CN = Mission Control Root CA (transitional)
    verify return:1
    depth=1 OU = opc-device:f7:4a:0c:95:4a:8d:a6:06:a2:1c:d2:12:40:6b:61:ae:c3:a0:e2:4c:ca:7b:3e:df:94:85:cc:39:a4:92:df:93, CN = PKISVC CrossRegion Intermediate r2
    verify return:1
    depth=0 CN = *.opensearch.ap-chuncheon-1.oci.oracleiaas.com
    verify return:1
    DONE
    [opc@jumpbox ~]$ cat opensearch-ca.crt
    -----BEGIN CERTIFICATE-----
    MIIE6TCCAtGgAwIBAgIRAOstTmVRjci44g910KG8+YMwDQYJKoZIhvcNAQELBQAw
    ...
    2cTH4OwgiUBHOzI8tQ==
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MIIFxTCCA62gAwIBAgIRAM/DvpKazV/tYwL/TDrInwIwDQYJKoZIhvcNAQELBQAw
    ...
    37v4yd3CKzhwvmSed7aUsCofDN2WtcVgAp7GA/l12kb+EEafun7QaQI=
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MIIFQzCCAyugAwIBAgIBAjANBgkqhkiG9w0BAQsFADAxMS8wLQYDVQQDEyZNaXNz
    ...
    j3tjZCAkyg==
    -----END CERTIFICATE-----
    
  3. kubectl로 대상 OKE 클러스터에 접속 가능한 곳으로 다운로드한 opensearch-ca.crt 파일을 복사합니다.

  4. OKE 클러스터에 다음 명령으로 CA를 configmap으로 추가합니다.

    kubectl create configmap opensearch-ca.crt --from-file=opensearch-ca.crt -n kube-system
    

FluentD 설치

  1. fluentd-daemonset-opensearch-self-signed.yaml에서 FLUENT_OPENSEARCH_HOST를 대상 OpenSearch 호스트로 변경합니다.

    ...
            env:
              - name:  FLUENT_OPENSEARCH_HOST
                value: "amaaaaaauzduwfyafs5lx2a77vnnbvz5wt6gbez6r3apldbqzn725kszn2xq.opensearch.ap-chuncheon-1.oci.oracleiaas.com"
              - name:  FLUENT_OPENSEARCH_PORT
                value: "9200"
              ...
    
  2. FluentD 설치

    kubectl apply -f fluentd-rbac.yaml
    kubectl apply -f fluentd-configmap-opensearch-self-signed.yaml
    kubectl apply -f fluentd-daemonset-opensearch-self-signed.yaml
    
  3. OKE 클러스터 Worker Node에서 OpenSearch로 로그를 보낼수 있도록 보안규칙을 추가합니다.

    • Worker Node의 보안규칙

      • 대상: 예) oke-nodeseclist-quick-oke-cluster-1-04cdcc334

      • Egress Rules:

        아래 예시는 OpenSearch 위치가 서브넷인 10.0.20.0/24인 경우

        StatelessDestinationIP ProtocolSource Port RangeDestination Port RangeDescription
        No10.0.20.0/24TCPAll9200OpenSearch API
    • OpenSearch의 보안규칙

      • 대상: 예) oke-svclbseclist-quick-oke-cluster-1-04cdcc334

      • Ingress Rules:

        아래 예시는 Worker Node가 위치가 서브넷인 10.0.10.0/24인 경우

      StatelessSourceIP ProtocolSource Port RangeDestination Port RangeDescription
      No10.0.10.0/24TCPAll9200OpenSearch API
  4. 로그 확인

    fluentd Pod가 기동하면, 로그를 통해 OpenSearch와 연결 오류 없이 정상 동작하는 지 확인합니다.

    $ kubectl get pod -n kube-system
    NAME                                   READY   STATUS    RESTARTS      AGE
    ...
    fluentd-bz62z                          1/1     Running   0             99s
    fluentd-c54qn                          1/1     Running   0             99s
    fluentd-x5l2h                          1/1     Running   0             99s
    ...
    $ kubectl logs -f fluentd-t7p87 -n kube-system -f
    2022-06-03 07:28:46 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
    ...
    2022-06-03 07:28:48 +0000 [info]: adding match pattern="**" type="opensearch"
    ...
    2022-06-03 07:28:48 +0000 [info]: #0 starting fluentd worker pid=15 ppid=7 worker=0
    2022-06-03 07:28:48 +0000 [info]: #0 [in_tail_container_logs] following tail of /var/log/containers/kube-flannel-ds-stmfq_kube-system_install-cni-f69fde150aaaf779132c4fc2f2315fc30e703e9e6c39127be21fbec137d7b735.log
    2022-06-03 07:28:48 +0000 [info]: #0 [in_tail_container_logs] following tail of /var/log/containers/proxymux-client-p7nzp_kube-system_proxymux-client-fa4352b8f7ba57325ea3ef2dc6af8016a585df67a0f870058f76761b75c074e7.log
    

OpenSearch Dashboard 설정

  1. SSH 터널링을 통해 jumpbox VM으로 접속하지 않은 경우 다시 접속합니다.

  2. SSH 터널링이 되어 있으므로, 로컬에서 브라우저로 OpenSearch Dashboard에 접속을 확인합니다.

    • 접속주소: https://localhost:5601
  3. 왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.

    image-20220603163755397

  4. Create index pattern을 클릭합니다.

  5. 인덱스 패턴을 생성합니다.

    아래쪽에 보이는 3개의 소스 중에서 fluentd 소스를 사용합니다.

    • Index pattern name: fluentd
    • Time field: time

    image-20220603164348823

    image-20220603164424475

  6. 인덱스 패턴이 추가된 결과를 볼 수 있습니다.

    image-20220603164548680

  7. 왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.

  8. 생성한 인덱스 패턴을 통해 수집된 로그를 확인할 수 있습니다.

    • 테스트 앱의 로그를 확인하기 위해 Add filter를 클릭하여 namespace_name=default 로 지정합니다.

    image-20220603164907499

  9. 테스트 앱을 접속합니다.

  10. 로그 확인

    아래와 같이 OpenSearch Dashboard에서 테스트 앱의 로그를 확인할 수 있습니다.

    image-20220603165356384