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/
위 글을 많이 참조했음을 밝힌다.
EKS대신 로컬 쿠버네티스를 사용하는 점, ECR 대신 일반 도커허브를 사용하는 점, 중간에 SQS 버퍼를 끼고 로그스태시를 두대 활용해 로그를 엘라스틱서치로 보내는 점이 위 포스팅과 다르다.
'인프라,데이터 > Docker, Kubernetes' 카테고리의 다른 글
K6로 부하테스트 하기(도커, 쿠버네티스 환경) (0) | 2023.03.19 |
---|---|
Kubernetes 배포 시 가능한 hook 들 + 특정 스크립트 hook으로 실행하기 (0) | 2022.05.18 |
Mac ssh to docker-desktop node (0) | 2022.05.16 |
Failed to create bus connection: No such file or directory 오류 해결 (0) | 2022.05.04 |
Kubernetes 특정 경로로 로그 파일 수집하기(nginx access 로그 만들기) (0) | 2022.01.11 |