클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

Update History

# 2024-10-05 
- k8s 1.30 설치 검증
- bitnami helm 차트를 이용한 EFK스택 구성으로 변경

# 2022-12 최초작성
k8s 1.23 기준 작성

 

13. 통합 로깅을 위한 EFK 스택

컨테이너로 서비스 할 때는 로그를 기존 처럼 로그 파일에 기록하는 것이 아니라 표준 출력으로 남기고 EFK스택이나 ELK스택을 이용하여 수집, 저장, 가시화해야 합니다.
그 이유는 컨테이너는 언제라도 없어지거나 재시작할 수 있기 때문입니다.

EFK스택은 엘라스틱서치Elasticsearch, 플루언트디Fluentd, 키바나Kibana의 앞자를 모은 용어이고 ELK스택은 엘라스틱서치Elasticsearch, 로그스태시Logstash, 키바나Kibana의 앞자를 모은 용어입니다.
Fluentd 또는 Logstash는 각 컨테이너 내의 어플리케이션이 콘솔에 남긴 로그를 수집하는 툴입니다.
Elasticsearch는 수집된 로그를 저장하는 데이터베이스입니다.
Kibana는 Elasticsearch에 저장된 데이터를 이용하여 로그를 조회하고 검색하는 화면을 제공하는 툴입니다.

쿠버네티스 통합 로깅에는 EFK스택을 더 많이 사용하기 때문에 이번에는 EFK스택으로 통합 로깅 환경을 구축해 보겠습니다.


설치를 위한 사전 준비를 먼저 하겠습니다.
다음으로 엘라스틱 서치, 플루언트디, 키바나를 순서대로 설치 하겠습니다.
그리고 EFK설정을 하여 로그를 수집하고 저장하겠습니다.
마지막으로 수집된 로그를 키바나를 통해 조회하고 검색하는 실습을 하도록 하겠습니다.

13.1 EFK스택 구성 사전 준비

EFK스택을 구성하는 툴들도 쿠버네티스 클러스터에 파드로 설치 됩니다.
파드가 배포될 별도의 네임스페이스를 만들고 쿠버네티스 오브젝트들을 편리하게 설치해주는 패키지 설치 관리자인 헬름을 설치하겠습니다.
NFS 서버와 퍼시스턴트 볼륨 다이내믹 프로비저닝 설정도 필요한데 이건 이미 되어 있습니다.

1) 네임 스페이스 작성
‘efk’라는 이름으로 새로운 네임 스페이스를 만들고 ‘efk’로 네임스페이스를 바꿉니다.

[root@osboxes ~]# k create ns efk
namespace/efk created
[root@osboxes ~]# kubens efk
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "efk".


2) 헬름 설치
아래 글을 참고하여 헬름 CLI를 설치 합니다.
https://happycloud-lee.tistory.com/3



헬름은 헬름 차트Helm Chart라는 템플릿화 되어 있는 야믈파일 묶음들을 이용하여 편리하게 쿠버네티스 오브젝트들을 설치해 주는 툴입니다.
사용해 보시면 느끼겠지만 대부분의 기존 오픈 소스가 헬름 차트로 이미 만들어져 있어 매우 편합니다.
대표적인 헬름 차트 제공 회사는 비트나미bitnami사입니다.
아래 GitHub에서 비트나미사의 헬름 차트를 볼 수 있습니다.
https://github.com/bitnami/charts

헬름은 앞으로 많이 사용할 툴이므로 아래 글에서 사용법을 익히시길 권고 합니다.
https://happycloud-lee.tistory.com/4

또한 헬름 차트를 직접 만들어 사용하실 분들은 아래 글도 참고 하십시오.
https://happycloud-lee.tistory.com/5

3) 기본 스토리지 클래스 확인
기본 스토리지 클래스가 다이내믹 프로비저닝을 지원하는 ‘nfs-dynamic’으로 되어 있어야 합니다.
이미 되어 있겠지만 한번 더 확인해 주십시오.

[root@osboxes ~]# k get sc
NAME                    PROVISIONER                    RECLAIMPOLICY   …
nfs-dynamic (default)   nfs-dynamic                    Retain          …
standard                kubernetes.io/no-provisioner   Delete          …

만약 안되어 있으면 ‘11.7 동적으로 볼륨 생성하기Dynamic Provisioning'를 참고하여 설정 합니다.

13.2 엘라스틱 서치 설치

 

중요: k8s 1.30이상에서 Elasticsearch 8.x 설치는 아래 링크 글로 설치하세요
https://happycloud-lee.tistory.com/294

 


중요: k8s 1.2x 상에서 Elasticsearch 7.x 설치는 아래 글로 설치하세요

 

엘라스틱 서치는 로그가 저장되는 데이터베이스 입니다.
헬름 차트로 설치하기 위해 헬름 차트 저장소를 추가하고 설치 설정 파일을 다운로드 받아 설치 옵션을 설정 합니다.
그리고 설치 설정 파일과 헬름 차트를 이용하여 설치를 합니다.
설치 후에 인증 작업을 한 후 재 배포 합니다.

1) 엘라스틱 서치 헬름 저장소 추가
아래와 같이 엘라스틱 서치 헬름 차트 저장소를 추가 하고 차트 리스트를 업데이트 합니다.

[root@osboxes ~]# helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
[root@osboxes ~]# helm repo update


엘라스틱 서치의 헬름 차트명과 버전을 찾습니다.
여러 결과 중 위에서 저장소명으로 지정한 ‘elastic’으로 시작하는 헬름 차트가 우리가 사용할 차트입니다.

[root@osboxes ~]# helm search repo elasticsearch
NAME                             CHART VERSION    APP VERSION    DESCRIPTION

elastic/elasticsearch            7.16.3           7.16.3         Official Elastic helm chart for Elasticsearch



2) 설치 옵션 설정 

작업 디렉토리를 만들고 이동 합니다.

[root@osboxes ~]# mkdir -p ~/install/efk && cd ~/install/efk

 


헬름차트 버전 7.16.3의 설치 설정 파일을 다운로드 합니다.

[root@osboxes efk]# helm inspect values elastic/elasticsearch --version 7.16.3 > values-es.yaml

<팁>
‘--version’파라미터를 빼면 최신 버전의 설치 설정 파일을 다운로드 합니다.
이 책에서는 버전 7.16.3을 사용하여 설치 합니다.
</>

설치 설정 파일을 열고 아래 항목을 찾아 바꾸십시오.
너무 많아서 수정하기 쉽지 않을 테니 아래와 같이 ‘values-elasticsearch.yaml’파일을 다운로드 하십시오.


위 파일과 같이 재정의할 항목만 있는 파일을 만들어서 배포할 수 있습니다.
이 파일에 정의하지 않은 항목은 위에서 내려 받은 ‘values-es.yaml’에 정의된 값대로 설치 됩니다.

‘values-elasticsearch.yaml’에서 인그레스 host값의 IP를 반드시 본인 노드 VM의 IP로 바꾸십시오.
필요하면 리소스, 볼륨 크기는 적절히 수정 하십시오.
우리는 워커노드가 한개밖에 없으므로 파드는 1개만 배포 가능 합니다.

replicas: 1

esConfig:
  elasticsearch.yml: |-
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.client_authentication: required
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/es-ca.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/es-ca.p12

extraEnvs:
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password

secretMounts:
  - name: elastic-ca
    secretName: elastic-ca
    path: /usr/share/elasticsearch/config/certs

resources:
  requests:
    cpu: "512m"
    memory: "1Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"

volumeClaimTemplate:
  accessModes: [ "ReadWriteOnce" ]
  resources:
    requests:
      storage: 5Gi

ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: elasticsearch.169.56.70.201.nip.io
      paths:
        - path: /


‘values-elasticsearch.yaml’파일에서 아래와 같이 아직 준비되지 않은 설정들을 리마크 하십시오.
다른 곳에 복사 해 놓고 삭제 하셔도 됩니다.
이 항목들은 1차로 설치한 후에 인증 작업을 하고 재배포시에 사용될 겁니다.



esConfig:
  elasticsearch.yml: |-
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    #xpack.security.transport.ssl.verification_mode: certificate
    #xpack.security.transport.ssl.client_authentication: required
    #xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/es-ca.p12
    #xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/es-ca.p12

#extraEnvs:
#  - name: ELASTIC_USERNAME
#    valueFrom:
#      secretKeyRef:
#        name: elastic-credentials
#        key: username
#  - name: ELASTIC_PASSWORD
#    valueFrom:
#      secretKeyRef:
#        name: elastic-credentials
#        key: password

#secretMounts:
#  - name: elastic-ca
#    secretName: elastic-ca
#    path: /usr/share/elasticsearch/config/certs



3) 엘라스틱 서치 설치
아래 명령으로 설치 유효성을 먼저 검증해 봅니다.
‘--dry-run’옵션을 붙이면 실제 설치는 하지 않고 유효성 검증만 수행 합니다. 에러 메시지가 안 나오면 문제가 없는 겁니다.

[root@osboxes efk]# helm install elasticsearch -f values-elasticsearch.yaml elastic/elasticsearch --version 7.16.3 --dry-run


‘--dry-run’ 옵션을 빼고 엘라스틱 서치를 설치 합니다.

[root@osboxes efk]# helm install elasticsearch -f values-elasticsearch.yaml elastic/elasticsearch --version 7.16.3


퍼시스턴트 볼륨 클레임 오브젝트가 바인딩 되었는지를 체크하고 파드가 실행될때까지 기다립니다.
파드의 ‘READY’상태를 보면 계속 ‘0/1’일 겁니다. 인증 작업을 아직 안해서 레디니스 프로브가 실패하기 때문입니다.

[root@osboxes efk]# k get pvc
NAME                                          STATUS   VOLUME   …
elasticsearch-master-elasticsearch-master-0   Bound    pvc-382bf…7-110e051a1eb9
[root@osboxes efk]# k get po -w
NAME                     READY   STATUS    RESTARTS   AGE
elasticsearch-master-0   0/1     Running   0          2m8s


서비스 오브젝트와 인그레스 오브젝트를 확인 합니다.
조금 후 플루언트디에서 엘라스틱 서치의 HOST와 포트를 지정할 때 서비스 명 ‘elasticsearch-master’과 포트 ‘9200’번을 사용 합니다.

[root@osboxes efk]# k get svc
NAME                            TYPE        …   PORT(S)
elasticsearch-master            ClusterIP   …   9200/TCP,9300/TCP
elasticsearch-master-headless   ClusterIP   …   9200/TCP,9300/TCP 
[root@osboxes efk]# k get ing
NAME                   CLASS   HOSTS                                …
elasticsearch-master   nginx   elasticsearch.169.56.70.201.nip.io   …


<팁>
엘라스틱 서치를 삭제할 때는 ‘helm delete {릴리즈명}’ 명령을 사용합니다.
위 예에서는 릴리즈명이 ‘elasticsearch’이므로 ‘helm delete elasticsearch’라고 하면 됩니다.
</>

4) 인증 작업 후 재 배포
엘라스틱 서치는 보안을 위해 인증 작업을 하는 방법을 제공 합니다.
인증 작업은 엘라스틱 서치 접근시 암호 생성과 엘라스틱 서치 DB간에 TLS로 통신하기 위한 인증서를 만드는 것입니다.

먼저 접근 암호를 만들도록 하겠습니다. 엘라스틱 서치 파드 안으로 진입 하십시오.

[root@osboxes efk]# k exec -it elasticsearch-master-0 -- sh
Defaulted container "elasticsearch" out of: elasticsearch, configure-sysctl (init)
sh-5.0$


‘elasticsearch-setup-passwords’ 명령으로 암호를 생성 합니다.
‘interactive’는 직접 암호를 지정하는 방식입니다. 자동으로 생성하고 싶으면 ‘auto’로 바꾸십시오.
아래와 같이 여러 계정에 대한 암호를 입력할 수 있습니다.
이 중에 사용자명 ‘elastic’과 지정한 암호를 사용하게 됩니다.
저는 암호를 ‘happy@cloud’로 지정 하였습니다. 앞으로 예제에서 이 암호를 사용 합니다.

sh-5.0$ ./bin/elasticsearch-setup-passwords interactive

Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

<팁>
암호를 바꾸고 싶으면 ‘helm delete’로 파드를 삭제하고 연결된 퍼시스턴트 볼륨 클레임 오브젝트를 지우신 후 다시 ‘helm install’로 설치하고 작업하면 됩니다.
</>

다음으로 엘라스틱 서치 DB간 TLS통신을 위한 인증서를 만들겠습니다.
아래 명령으로 퍼브릭 CA와 프라이빗 키를 담고 있는 파일을 생성 합니다.
파일명은 기본 이름 그대로 하고 암호는 절대 넣지 마십시오. 암호를 넣으면 컨테이너 환경에서는 추가 작업이 더 필요하여 번거롭습니다.

sh-5.0$ ./bin/elasticsearch-certutil ca

Please enter the desired output file [elastic-stack-ca.p12]:
Enter password for elastic-stack-ca.p12 :


이제 아래 명령으로 인증서 파일을 만드십시오. 인증서 파일명은 안 바꾸셔도 되지만 너무 기니까 ‘es-ca.p12’로 바꾸겠습니다. 역시 암호는 절대 넣지 마십시오.

sh-5.0$ ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

Enter password for CA (elastic-stack-ca.p12) :
Please enter the desired output file [elastic-certificates.p12]: es-ca.p12
Enter password for es-ca.p12 :

Certificates written to /usr/share/elasticsearch/es-ca.p12


위 마지막 쯤 메시지를 보면 인증서 파일이 ‘/usr/share/elasticsearch/es-ca.p12’에 만들어졌습니다.

이제 이 인증서 파일을 이용하여 시크릿 오브젝트를 만들고 파드 안에 특정 위치로 마운트 한 후 그 위치를 지정해 주면 됩니다.
인증서 파일을 파드 밖으로 복사부터 해야 합니다. 파드를 빠져나와서 아래 명령으로 인증서 파일을 복사 합니다.

sh-5.0$ exit
exit
[root@osboxes efk]# k cp  elasticsearch-master-0:/usr/share/elasticsearch/es-ca.p12 es-ca.p12

[root@osboxes efk]# ll

-rw-r--r--. 1 root root 3596 Jan 29 12:39 es-ca.p12


인증서 정보를 담고 있는 시크릿 오브젝트 ‘elastic-ca’를 만듭니다.

[root@osboxes efk]# k create secret generic elastic-ca --from-file=es-ca.p12
secret/elastic-ca created


사용자명 ‘elastic’과 지정한 암호를 담고 있는 시크릿 오브젝트 ‘elatic-credentials’도 만듭니다.
암호는 본인이 지정한 암호로 반드시 바꿔야 합니다.

[root@osboxes efk]# k create secret generic elastic-credentials  --from-literal=password=happy@cloud --from-literal=username=elastic


볼륨 마운트와 인증서 위치 지정은 ‘values-elasticsearch.yaml’에서 합니다.
파일을 열고 리마크를 모두 해제 하십시오.
‘esConfig’항목은 엘라스틱 서치의 환경 설정 파일인 ‘elasticsearch.yml’에 추가할 내용을 정의하는 것입니다.
여기에 파드안에 마운트된 인증서 파일의 위치를 지정해 줍니다.
나머지 내용은 보시면 쉽게 이해 되실 겁니다.



esConfig:
  elasticsearch.yml: |-
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.client_authentication: required
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/es-ca.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/es-ca.p12

extraEnvs:
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password

secretMounts:
  - name: elastic-ca
    secretName: elastic-ca
    path: /usr/share/elasticsearch/config/certs


이제 다시 엘라스틱 서치를 재설치 합니다.
재설치할 때는 ‘helm upgrade’명령을 이용하면 됩니다.
파드가 정상 실행될때까지 기다립니다.

[root@osboxes efk]# helm upgrade -i elasticsearch -f values-elasticsearch.yaml elastic/elasticsearch --version 7.16.3
[root@osboxes efk]# k get po -w
NAME                     READY   STATUS    RESTARTS   AGE
elasticsearch-master-0   0/1     Running   0          2m9s
elasticsearch-master-0   1/1     Running   0          3m30s

<팁>
‘helm upgrade’명령의 ‘i’옵션은 기존에 설치가 안되어 있으면 ‘helm install’하라는 파라미터입니다.
</>

확인을 위해 인그레스 주소로 웹브라우저에서 열어 보십시오.
사용자이름과 암호를 묻는 창이 나타날 겁니다. 사용자명은 ‘elastic’이고 암호는 여러분이 지정한 값을 입력하여 로그인 합니다.


로그인 후 아래와 같은 화면이 나오면 성공 입니다.




13.3 플루언트디 설치

플루언트디는 각 파드의 로그를 수집하는 데몬 프로그램입니다.

 


중요: k8s 1.30이상에서 Elasticsearch 8.x을 설치한 경우는 아래 링크 글로 설치하세요

https://happycloud-lee.tistory.com/295

 


중요: k8s 1.2x 상에서 Elasticsearch 7.x을 설치한 경우는 아래 글로 설치하세요

설치를 위한 야믈 파일을 다운로드 합니다.


파일을 열고 내용을 보시면 모든 오브젝트들이 네임 스페이스 ‘kube-system’에 설치되는걸 알 수 있습니다.
시크릿 ‘elastic-credentials’에서 ‘password’를 본인이 지정한 암호로 바꿉니다.


apiVersion: v1
kind: Secret
metadata:
  name: elastic-credentials
  namespace: kube-system
type: Opaque
stringData:
  username: elastic
  password: happy@cloud


파드는 데몬셋으로 배포되어 각 노드에 한개씩 생성 됩니다. 각 노드에 배포된 파드의 로그를 수집해야 하기 때문에 데몬셋으로 배포 합니다.
컨테이너 이미지는 엘라스틱 서치의 버전에 맞는 이미지를 사용해야 합니다.
아래 페이지에서 엘라스틱 서치 버전에 맞는 최신 버전을 찾으면 됩니다.
https://github.com/fluent/fluentd-kubernetes-daemonset

환경 변수로 엘라스틱 서치의 Host, 포트, 사용자명, 암호를 아래와 같이 지정했습니다.
네임스페이스가 다르기 때문에 엘라스틱 서치의 주소는 전체 경로를 다 입력해 줘야 합니다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system

      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.14.3-debian-elasticsearch7-1.0

        env:
        - name: FLUENT_ELASTICSEARCH_HOST
          value: elasticsearch-master.efk.svc.cluster.local
        - name: FLUENT_ELASTICSEARCH_PORT
          value: "9200"
        …
        - name: FLUENT_ELASTICSEARCH_USER
          valueFrom:
            secretKeyRef:
              name: elastic-credentials
              key: username
        - name: FLUENT_ELASTICSEARCH_PASSWORD
          valueFrom:
            secretKeyRef:
              name: elastic-credentials
              key: password
          …
        - name: K8S_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

<팁>
환경변수 ‘K8S_NODE_NAME’을 파드가 배포된 노드의 이름으로 지정하면 그 노드 이름을 키로 파드 정보를 캐싱합니다. 이는 쿠버네티스 API 서버를 불필요하게 호출하지 않게 하여 부하를 줄여 줍니다.
</>

컨피그맵 ‘fluentd-config’를 보시면 매우 긴 환경설정값들이 있습니다.
컨테이너 이미지가 제공하는 기본 설정으로 하면 제대로 로그가 수집되지 않기 때문에 커스터마이징 한 겁니다.
아래 페이지를 참고 했으며 추가로 제가 설정한 부분은 ‘### CUSTOM’으로 주석을 달았습니다.
https://arnoldgalovics.com/java-multiline-logs-fluentd/

플루언트디 설정은 이 책의 범위를 벗어나는 주제이므로 자세한 설명은 생략하겠습니다.
다만 제가 추가한 부분에 대해서만 간략히 설명하겠습니다.

플루언트디에 아래 경고 메시지가 계속 나오는 걸 제거하기 위해 추가 했습니다.
"[types removal] Specifying types in bulk requests is deprecated."


  fluent.conf: |
  …
       ### CUSTOM: remove type name warning
       suppress_type_name true


컨테이너 실행 엔진이 도커가 아닌 ‘CRI-O’이기 때문에 로그 파싱을 위한 아래 설정이 필요 합니다.


  ### CUSTOM: Add cri parser
  tail_container_parse.conf: |
    <parse>
      @type cri
      <parse>
        @type json
        time_key time
        time_format %Y-%m-%dT%H:%M:%S.%L%z
        # keep_time_key true # if you want to keep "time" field, enable this parameter
      </parse>
    </parse>


쿠버네티스 엔진이나 EFK의 파드들의 로그는 수집할 필요가 없으므로 제외하기 위해 추가 했습니다.


  kubernetes.conf: |
  …
      ### CUSTOM: exclude unnecessary pods log
      exclude_path [ "/var/log/containers/fluent*", "/var/log/containers/ingress*", "/var/log/containers/dashboard*", "/var/log/containers/kubernetes-dashboard*", "/var/log/containers/elasticsearch*", "/var/log/containers/kibana*", "/var/log/containers/kube*", "/var/log/containers/calico*", "/var/log/containers/tigera*", "/var/log/containers/nfs-client*" ]


스프링부트 로그의 타임 형식이 다르기 때문에 패턴을 추가 했습니다.


  kubernetes.conf: |
  …
      # CUSTOM: Replace parse for stdout log
      time_format %Y-%m-%dT%H:%M:%S.%NZ
      <parse>
        @type multi_format
        <pattern>
          format json
          time_key time
          time_format %Y-%m-%dT%H:%M:%S.%NZ
        </pattern>
        <pattern>
          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
          time_format %Y-%m-%dT%H:%M:%S.%N%:z
        </pattern>
      </parse>


야믈 파일을 이용하여 플루언트디를 설치 합니다.
설치 후 파드가 정상 실행될때까지 기다립니다.

[root@osboxes efk]# k apply -f daemon-fluentd.yaml
serviceaccount/fluentd unchanged
clusterrole.rbac.authorization.k8s.io/fluentd unchanged
clusterrolebinding.rbac.authorization.k8s.io/fluentd unchanged
secret/elastic-credentials configured
configmap/fluentd-config unchanged
daemonset.apps/fluentd configured

[root@osboxes efk]# k get po -w -n kube-system | grep fluentd
fluentd-9b8hr                    1/1     Running   0              119m
fluentd-cnp8h                    1/1     Running   0              119m


설치 후 워커 노드의 플루언트디 파드의 로그를 확인해 보십시오.
아래와 같이 엘라스틱 서치에 로그를 푸시할 수 없다는 에러가 날 수 있습니다.
이 에러가 나면 데몬셋을 재시작하여 파드를 재 생성 하십시오.

[root@osboxes efk]# k logs -f fluentd-9b8hr -n kube-system

[out_es] failed to flush the buffer. … error="could not push logs to Elasticsearch cluster

[root@osboxes efk]# k rollout restart ds fluentd -n kube-system
daemonset.apps/fluentd restarted

<팁>
‘kubectl rollout restart’ 명령은 워크로드 컨트롤러가 통제하는 파드를 모두 재시작할 때 유용한 명령입니다.
</>

아래와 같이 플루언트디가 에러 없이 시작되면 잘 설치된 겁니다.

[root@osboxes efk]# k logs -f fluentd-k655v -n kube-system

2022-02-02 10:45:54 +0000 [info]: starting fluentd-1.14.3 pid=7 ruby="2.6.9"

2022-02-02 10:45:56 +0000 [info]: #0 fluentd worker is now running worker=0




13.4 키바나 설치

키바나는 엘라스틱 서치의 로그를 조회 및 검색할 수 있는 웹 화면을 제공 합니다.
헬름 차트로 설치하기 위해 헬름 차트 저장소를 추가하고 설치 설정 파일을 다운로드 받아 설치 옵션을 설정 합니다.
그리고 설치 설정 파일과 헬름 차트를 이용하여 설치를 합니다.

중요: 위 Elasticsearch 설치 시 'k8s 1.30이상에서 Elasticsearch 8.x 설치'를 하신 분들은 이미 설치가 되어 있습니다. 

https://happycloud-lee.tistory.com/294

 

* 아래 글은 Kibana 7.16.x 버전 설치 가이드입니다. 


1) 키바나 헬름 저장소 추가
키바나 헬름 저장소는 엘라스틱 서치 헬름 차트 저장소와 동일 하므로 추가할 필요 없습니다.
아래 명령으로 ‘elastic’ 저장소가 추가 되었는지만 확인 합니다.

[root@osboxes ~]# helm repo ls
NAME         URL

elastic      https://helm.elastic.co


키바나의 헬름 차트명과 버전을 찾습니다.
‘elastic/kibana 7.16.3’이 우리가 사용할 헬름 차트입니다.

[root@osboxes ~]# helm search repo kibana
NAME                      CHART VERSION  APP VERSION …

elastic/kibana            7.16.3             7.16.3        



2) 설치 옵션 설정
작업 디렉토리로 이동 하여 설치 설정 파일을 다운로드 합니다.

[root@osboxes ~]# cd ~/install/efk
[root@osboxes efk]# helm inspect values elastic/kibana --version 7.16.3 > values-kibana.yaml

설치 설정 파일을 열고 아래 항목을 찾아 바꾸십시오.
찾기 어려우면 아래 내용으로 ‘values-kibana.yaml’파일을 새로 만드셔도 됩니다.
또는 아래와 같이 다운로드 하셔도 됩니다.


단 인그레스 host값의 IP는 반드시 본인 노드 VM의 IP로 바꾸셔야 합니다.
리소스는 적절히 수정 하십시오.
우리는 워커노드가 한개밖에 없으므로 파드는 1개만 배포 가능 합니다.

elasticsearchHosts: "http://elasticsearch-master:9200"

replicas: 1

resources:
  requests:
    cpu: "512m"
    memory: "1Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"

ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: kibana.169.56.70.201.nip.io
      paths:
        - path: /



3) 키바나 설치
‘--dry-run’옵션으로 설치 유효성 검증을 수행하고 에러가 없으면 키바나를 설치 합니다.
파드가 정상 실행될때까지 기다립니다.

[root@osboxes efk]# helm install kibana -f values-kibana.yaml elastic/kibana --version 7.16.3 --dry-run

[root@osboxes efk]# helm install kibana -f values-kibana.yaml elastic/kibana --version 7.16.3
[root@osboxes efk]# k get po -w


인그레스 오브젝트를 확인 합니다.

[root@osboxes efk]# k get ing
NAME                   CLASS   HOSTS                         …

kibana-kibana          nginx   kibana.169.56.70.201.nip.io   …


인그레스 주소를 웹브라우저에서 열었을 때 아래와 같이 나오면 잘 설치 된 겁니다.


로그인 후 최초 페이지에서 아무거나 선택하여 홈으로 이동 합니다.



13.5 EFK스택 환경 설정

로그 데이터베이스를 만드는 작업과 로그 보관 정책과 기간을 설정하는 작업을 합니다.

1) 로그 데이터베이스 생성
이제 엘라스틱 서치에 플루언트디가 수집한 로그를 저장할 로그 데이터베이스를 만들어야 합니다.
로그DB 생성은 키바나에서 쉽게 할 수 있습니다.
키바나 홈의 ❶ 좌측 상단에 있는 햄버거 메뉴를 클릭하고 ❷ Management > Stack Management를 클릭 하십시오.

❶ Kibana > Index Patterns를 클릭하고 ❷ 우측 화면에서 [Create index pattern]을 누릅니다.

<팁>
엘라스틱 서치에서 ‘index’라는 용어는 데이터베이스와 유사한 의미입니다.
</>

인덱스 패턴을 만드는 작업은 각 로그 데이터베이스의 네이밍 규칙을 만드는 것입니다.
❶ Name에 ‘logstash-*’를 입력하고 ❷ Timestamp field는 ‘@timestamp’로 선택 하십시오.
그리고 ❸ [Create index pattern]버튼을 누릅니다.




2) 로그 보관 정책과 기간 설정
index의 보관 정책 및 기간을 설정합니다.
엘라스틱 서치의 index Lifecycle은 아래와 같이 4단계로 나눌 수 있으며, Hot과 Delete단계는 필수로 지정해야 합니다.
- Hot: 빈번하게 검색 해야할 최신 로그
- Warm: Hot보다 덜 찾는 로그
- Cold: 간헐적으로 찾는 로그
- Delete: 더 이상 필요 없어 삭제할 로그

<주의>
Index 보관 주기를 바꾸지 않으면 기본 설정대로 90일 후에나 로그가 삭제되므로 저장공간이 모자랄 수 있습니다.
</>

❶ Data > Index Lifecycle Policies을 클릭하고 ❷ kibana-event-log-policy를 선택 합니다.


Hot/Warm/Cold/Delete Phase별로 로그 정책과 보관 기간을 설정 합니다.

 



13.6 로그 조회 및 검색 실습

헬스체크때 배포한 ‘probe-httpreq’파드를 이용하여 로그를 조회해 보겠습니다.

아래와 같이 ‘probe-httpreq’ 파드를 재시작 하십시오.

[root@osboxes efk]# kubens ott
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "ott".
[root@osboxes efk]# k rollout restart sts probe-httpreq
statefulset.apps/probe-httpreq restarted


이 파드는 ‘member’서비스를 시작하면서 여러분이 NFS 서버의 ‘/ data/ott/members.properties’파일에 만든 데이터를 콘솔에 표시 합니다.

[root@osboxes efk]# k logs -f probe-httpreq-0
… ondal=온달,남자,hiondal@gmail.com
… user1=유저1,여자,user1@gmail.com
… user2=유저2,여자,user2@gmail.com


이 로그가 플루언트디에 의해 수집되어 엘라스틱 서치 DB에 저장될 것이고 키바나에서 검색할 수 있습니다.
키바나의 좌측 상단 햄버거 메뉴를 누르고 ‘Discover’를 클릭 하십시오.


아래와 같이 거의 실시간으로 로그가 수집되는걸 볼 수 있습니다.


상단의 검색 박스에 ‘kubernetes.pod_name : probe-httpreq and user1’이라고 입력하여 검색해 보십시오.
❶ 아래와 같이 수집된 로그에서 검색하여 결과를 하단에 보여 줍니다.
또한 ❷ 자주 사용하는 검색식을 저장하여 나중에 빠르게 로그를 볼 수 있습니다.

 

쿠버네티스 쉽게 이해하기 시리즈 목차

[쿠버네티스 쉽게 이해하기 1] 쿠버네티스 설치하기
[쿠버네티스 쉽게 이해하기 2] 쿠버네티스 아키텍처
[쿠버네티스 쉽게 이해하기 3] 한장으로 이해하는 쿠버네티스 리소스
[쿠버네티스 쉽게 이해하기 4] 쿠버네티스 개발에서 배포까지 실습
[쿠버네티스 쉽게 이해하기 5] 쿠버네티스 오브젝트 정의 파일 쉽게 만들기
[쿠버네티스 쉽게 이해하기 6] 꼭 알아야 할 쿠버네티스 주요 명령어
[쿠버네티스 쉽게 이해하기 7] 파드 실행 및 통제를 위한 워크로드 컨트롤러
[쿠버네티스 쉽게 이해하기 8] 파드 로드 밸런서 서비스
[쿠버네티스 쉽게 이해하기 9] 서비스 로드 밸런서 인그레스
[쿠버네티스 쉽게 이해하기 10] 환경변수 컨피그맵과 시크릿
[쿠버네티스 쉽게 이해하기 11] 데이터 저장소 사용을 위한 PV/PVC
[쿠버네티스 쉽게 이해하기 12] 헬스 체크를 위한 스타트업 프로브, 라이브니스 프로브, 레디니스 프로브
[쿠버네티스 쉽게 이해하기 13] 통합 로깅을 위한 EFK 스택
[쿠버네티스 쉽게 이해하기 14] 인증Authentication과 알백RBAC 방식의 인가Authorization
[쿠버네티스 쉽게 이해하기 15] 더 알면 좋을 주제들: 무중단 배포, 모니터링, HPA

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림