쿠버네티스 로깅 설정
서론
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 데 유용한 플랫폼입니다. 그러나 여러 컨테이너와 파드가 실행되는 복잡한 환경에서는 로깅(logging)이 매우 중요합니다. 로깅은 시스템의 상태를 모니터링하고, 문제를 해결하며, 성능을 분석하는 데 필수적입니다. 이번 포스팅에서는 EFK(Elasticsearch, Fluentd, Kibana) 스택을 이용하여 쿠버네티스에서 로깅을 설정하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.
본론
EFK 스택 소개
EFK 스택은 Elasticsearch, Fluentd, Kibana로 구성된 로깅 스택입니다. 각 구성 요소의 역할은 다음과 같습니다.
- Elasticsearch: 수집된 로그 데이터를 저장하고 검색할 수 있는 분산 검색 엔진입니다.
- Fluentd: 로그 데이터를 수집하고 다양한 출력 대상으로 전달하는 오픈 소스 데이터 수집기입니다.
- Kibana: Elasticsearch에서 저장된 로그 데이터를 시각화하고 분석할 수 있는 웹 인터페이스입니다.
EFK 스택 설치 및 설정
1. Elasticsearch 설치
Elasticsearch는 로그 데이터를 저장하고 검색하는 역할을 합니다. 다음은 쿠버네티스에 Elasticsearch를 설치하는 예시입니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
spec:
serviceName: "elasticsearch"
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
ports:
- containerPort: 9200
- containerPort: 9300
env:
- name: discovery.type
value: single-node
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
spec:
ports:
- port: 9200
selector:
app: elasticsearch
이 YAML 파일을 사용하여 Elasticsearch를 설치합니다.
kubectl apply -f elasticsearch.yaml
2. Fluentd 설치
Fluentd는 로그 데이터를 수집하고 Elasticsearch로 전송하는 역할을 합니다. 다음은 쿠버네티스에 Fluentd를 설치하는 예시입니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: kube-system
data:
fluent.conf: |
<source>
@type forward
port 24224
</source>
<match **>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y.%m.%d
include_tag_key true
tag_key @log_name
flush_interval 1s
</match>
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v1.11-1
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
volumeMounts:
- name: config-volume
mountPath: /fluentd/etc/fluent.conf
subPath: fluent.conf
- name: varlog
mountPath: /var/log
volumes:
- name: config-volume
configMap:
name: fluentd-config
- name: varlog
hostPath:
path: /var/log
이 YAML 파일을 사용하여 Fluentd를 설치합니다.
kubectl apply -f fluentd.yaml
3. Kibana 설치
Kibana는 Elasticsearch에 저장된 로그 데이터를 시각화하는 역할을 합니다. 다음은 쿠버네티스에 Kibana를 설치하는 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.10.1
ports:
- containerPort: 5601
env:
- name: ELASTICSEARCH_URL
value: "http://elasticsearch:9200"
---
apiVersion: v1
kind: Service
metadata:
name: kibana
spec:
ports:
- port: 5601
selector:
app: kibana
이 YAML 파일을 사용하여 Kibana를 설치합니다.
kubectl apply -f kibana.yaml
EFK 스택 구성 요소 설명
Elasticsearch
Elasticsearch는 로그 데이터를 저장하고 검색할 수 있는 분산형 검색 엔진입니다. 쿠버네티스 클러스터에서 로그 데이터를 수집하여 중앙 집중식으로 저장하고, Kibana와 같은 도구를 통해 쉽게 검색하고 분석할 수 있습니다.
Fluentd
Fluentd는 로그 데이터를 수집하고 다양한 출력 대상으로 전달하는 오픈 소스 데이터 수집기입니다. Fluentd는 플러그인 기반 아키텍처를 가지고 있어 다양한 로그 소스를 수집하고 처리할 수 있습니다. 쿠버네티스 환경에서는 DaemonSet으로 배포되어 각 노드에서 로그 데이터를 수집합니다.
Kibana
Kibana는 Elasticsearch에 저장된 로그 데이터를 시각화하고 분석할 수 있는 웹 인터페이스입니다. Kibana를 사용하면 로그 데이터를 쉽게 탐색하고, 대시보드를 생성하여 시각화할 수 있습니다. 이를 통해 시스템의 상태를 모니터링하고 문제를 빠르게 감지할 수 있습니다.
EFK 스택 활용 예제
로그 데이터 수집
EFK 스택을 사용하면 애플리케이션 로그, 시스템 로그, 보안 로그 등 다양한 로그 데이터를 수집할 수 있습니다. Fluentd는 로그 데이터를 수집하여 Elasticsearch로 전송하고, Elasticsearch는 데이터를 저장합니다.
로그 데이터 검색
Kibana를 사용하여 Elasticsearch에 저장된 로그 데이터를 검색할 수 있습니다. 특정 시간 범위 내의 로그를 검색하거나, 특정 조건에 맞는 로그를 필터링하여 볼 수 있습니다.
GET /fluentd-*/_search
{
"query": {
"match": {
"log": "error"
}
}
}
로그 데이터 시각화
Kibana 대시보드를 사용하여 로그 데이터를 시각화할 수 있습니다. 예를 들어, 특정 시간 범위 내의 에러 로그 수를 그래프로 표시하거나, 각 서비스별 로그 수를 비교하는 차트를 생성할 수 있습니다.
로그 모니터링 및 경고 설정
EFK 스택을 사용하여 로그 데이터를 모니터링하고 경고를 설정할 수 있습니다. 예를 들어, 특정 오류 메시지가 발생할 때 경고를 설정하거나, 로그 수가 일정 임계값을 초과할 때 알림을 받을 수 있습니다.
경고 설정 예제
Elasticsearch와 Kibana를 사용하여 경고를 설정하는 방법은 다음과 같습니다.
- Kibana 경고 설정
Kibana에서 "Alerting" 기능을 사용하여 경고를 설정할 수 있습니다. 특정 조건이 만족되면 이메일, Slack, PagerDuty 등으로 알림을 보낼 수 있습니다.
- Elasticsearch Watcher 설정
Elasticsearch의 Watcher 기능을 사용하여 경고를 설정할 수 있습니다. Watcher는 Elasticsearch 쿼리를 주기적으로 실행하여 조건을 만족하면 알림을 보냅니다.
PUT _watcher/watch/error_watch
{
"trigger": {
"schedule": {
"interval": "1m"
}
},
"input": {
"search": {
"request": {
"indices": [
"fluentd-*"
],
"body": {
"query": {
"match": {
"log": "error"
}
}
}
}
}
},
"actions": {
"email_admin": {
"email": {
"to": "admin@example.com",
"subject": "Error Logs Detected",
"body": "There are {{ctx.payload.hits.total}} error logs in the last minute."
}
}
}
}
이 설정은 1분마다 "fluentd-*" 인덱스를 검색하여 "error" 로그가 있는지 확인하고, 발견되면 이메일 알림을 보냅니다.
결론
EFK(Elasticsearch, Fluentd, Kibana) 스택은 쿠버네티스 클러스터에서 로그 데이터를 수집, 저장, 시각화하는 데 매우 유용한 도구입니다. 이번 포스팅에서는 EFK 스택의 개념, 설치 방법, 설정 방법, 그리고 활용 예제에 대해 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 효과적으로 로그를 관리하고 모니터링할 수 있기를 바랍니다.