본문 바로가기

인프라,데이터/Docker, Kubernetes

Kubernetes에서 Logstash(sqs output)를 사용해 elasticsearch, kibana로 로그 확인

1. Hombrew를 사용하여 logstash 설치

brew tap elastic/tap
brew cask install homebrew/cask-versions/adoptopenjdk8
brew install elastic/tap/logstash-full

로그스태시가 최신버전으로 설치된다.

2. 폴더 생성 후 conf 파일 생성

input {
  file {
    path => "/usr/share/logstash/data/*.log"
    codec => "json"
  }
}

output {
  stdout { }
  sqs {
    access_key_id => "***"
    secret_access_key => "****"
    codec => "json"
    queue => "test_queue"
    region => "ap-northeast-2"
    }
}

test 폴더 안의 log 파일을 받아와 sqs로 보내는 conf 파일을 작성한다.

그리고 output에 사용된 플러그인을 설치해준다. 

logstash-plugin install logstash-output-sqs

 

로그스태시 실행

logstash -f test.conf

 

test.log 파일을 만들어 로그를 적당히 생성한다.

{"message":"Hello, Aimb!"}

위에서 input에 codec=> "json"을 사용했는데, json 형태의 로그 메시지를 사용할 것이라 그렇다.


3. 전송된 로그 확인

aws 콘솔을 사용해 sqs가 메시지를 받았는지 확인할 수 있다.

aws sqs receive-message --queue-url https://sqs.ap-northeast-2.amazonaws.com/num/test_queue --max-number-of-messages 10

이제 로그스태시는 종료해 주자. 다음으로는 쿠버네티스 Pod 아래에 로그스태시를 설치할 거다.


 

4. Dockerfile로 이미지 도커허브에 올리기

Dockerfile 생성

FROM logstash:7.16.2

RUN logstash-plugin install logstash-output-sqs

COPY test.conf /User/user/path/
COPY logstash.yml /User/user/path/logstash.yml

CMD ["logstash", "-f", "test.conf"]

 

logstash.yml은 다음과 같이 생성한다.

http.host: "0.0.0.0"
xpack.monitoring.enabled: false
config.reload.automatic: true
config.reload.interval: 3s

Dockerfile로 이미지를 빌드하고, 도커허브에 올려준다. 

도커 홈페이지에서 로그인 후 <userid>/logstash 레파지토리를 만든다.

$ docker login

$ docker build -t <userid>/logstash .

$ docker run <userid>/logstash

$ docker push <userid>/logstash

그러면 <userid>/logstash:latest 라는 이미지를 불러올 수 있다.


5. Kubernetes에 pod으로 배포 및 로그 확인

 

kubectl create namespace logstash

명령어로 네임스페이스를 생성해 준다.

logstash_deployment.yaml 이란 파일을 생성한다. pod의 app 배포를 담당하는 파일이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-logstash-deployment
  namespace : logstash
  labels:
    app: test-logstash
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-logstash
  template:
    metadata:
      labels:
        app: test-logstash
    spec:
      containers:
        - name: test-logstash
          image: user/logstash:latest
          command: ["logstash"]
          args: ["-f", "test.conf"]
          imagePullPolicy: Always
          livenessProbe:
            exec:
              command:
                - ls
            initialDelaySeconds: 0
            periodSeconds: 60
            timeoutSeconds: 10
          ports:
            - containerPort: 9000
              name: logstash
          resources:
            limits:
              cpu: 500m
              memory: 1Gi
            requests:
              cpu: 300m
              memory: 300Mi

컨테이너의 image 부분에 아까 도커허브로 배포한 이미지 이름을 넣어준다.

다음으로는 logstash_service.yaml 파일을 생성한다. pods에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 역할을 한다.

kind: Service
apiVersion: v1
metadata:
  name: test-logstash-service
  namespace : logstash
spec:
  selector:
    app: test-logstash
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000
      name: logstash
  type: LoadBalancer
kubectl apply -f logstash_deployment.yaml
kubectl apply -f logstash_service.yaml

로 deployment와 service를 배포한다.

kubectl get pods -n logstash

명령어를 통해서 파드의 상태를 확인할 수 있다.

만약 문제가 생겼다면

kubecgl logs <pods name> -n logstash

로 로그를 확인해볼 수 있다. 로그를 보면 로그스태시가 자동으로 실행되는 것을 볼 수 있다.

문제가 없다면,

kubectl exec -ti <pods name> -n logstash -- /bin/sh

로 pods에 접근한다.

아까 logstash test.conf 파일을 다음과 같이 만들었었다.

input {
  file {
    path => "/usr/share/logstash/data/*.log"
    codec => "json"
  }
}

output {
  stdout { }
  sqs {
    access_key_id => "***"
    secret_access_key => "****"
    codec => "json"
    queue => "test_queue"
    region => "ap-northeast-2"
    }
}

/usr/share/logstash/data/ 폴더 아래에 test.log 파일을 만들고, 로그가 정상적으로 sqs에 보내지는지 확인한다.


6. SQS에서 다른 로그스태시로 로그를 받아와 엘라스틱서치에 전송

다음으로는 도커 컨테이너에 

엘라스틱서치 마스터노드1, 데이터노드1, 로그스태시, 키바나 총 4개의 컨테이너를 만들고 각각 프로그램을 설치한다.
이 글에선 도커 컨테이너 생성과 ELK 스택 설치는 생략한다.

로그스태시 컨테이너로 들어가

/etc/logstash에 다음과 같은 conf 파일을 만든다.

input {
    sqs {
        codec => "json"
        queue => "test_queue"
        region => "ap-northeast-2"
        threads => 8
        polling_frequency => 1
        access_key_id => "***"
        secret_access_key => "****"
    }
}
output {
    elasticsearch {
        index => "test-log-%{+YYYY-MM-dd}"
        hosts => ["xxx.xx.x.x:9200"]
        workers => 1
        }

 

로그스태시2 실행

/usr/share/logstash/bin/logstash -f /etc/logstash/test.conf

 

그리고 아까 첫번째 로그스태시의 input 폴더로 돌아가 log 파일을 생성해주면,

elasticsearch head 플러그인을 통해 인덱스가 생기는 것을 확인,

kibana로 (인덱스 생성 후) 인덱스별 로그를 확인할 수 있다. 

 

https://devstarsj.github.io/development/2020/03/22/Devops.Logstash.on.Kubernetes/

 

Deploying Logstash to Kubernetes Tutorial

Logstash는 ELK Stack(Elastic Stack)에서 L에 해당하는 Application이다. (Elastic Search, Kibana가 나머지 2개) Logstash는 실시간 파이프라인 기능을 가진 오픈소스 데이터 수집 엔진이다.

devstarsj.github.io

위 글을 많이 참조했음을 밝힌다.

EKS대신 로컬 쿠버네티스를 사용하는 점, ECR 대신 일반 도커허브를 사용하는 점, 중간에 SQS 버퍼를 끼고 로그스태시를 두대 활용해 로그를 엘라스틱서치로 보내는 점이 위 포스팅과 다르다.