# kubernetes(k8s) pods stdout,stderr 는 노드의 다음에 경로에 저장된다.
/var/log/pods
/var/log/containers (pods 하위 컨테이너 로그 파일들이 이곳에 링크로 걸려 있음)
# 이런 pod 로그들을 예전에는 fluentd 에서 정재 -> es / kafka 로 보냈는데,
# 요즘에는 fluentd 대신 vector(observability data pipeline - agent & aggregator) 를 많이 사용하는것 같다.
# rust 로 만들어서인지 안정성과 성능이 좋은것 같다.
# helm 으로 설치
helm repo add vector https://helm.vector.dev
helm repo update
# helm value 설정
# vector 는 다음 3가지 형태(role)로 배포 할 수 있다.
# agent: daemonset 으로 모든 노드의 data(stdout)를 수집
# sidecar: 파드별 pod에 사이드카로 vector 를 띄워 pod에 대해서만 수집
# aggregator: 다른 스트림으로 부터 입력(수집)
# customConfig 로 디폴트 설정을 대신할 수 있다.
# config 설정: https://vector.dev/docs/reference/configuration/
# configmap > data 설정된다.
# kubernetes_logs,host_metrics,internal_metrics(source) -> transform -> prometheus_exporter,console(sink) 로 소비하는 흐름
cat << zzz > values.yaml
role: Agent
customConfig:
data_dir: /vector-data-dir
api:
enabled: true
address: 127.0.0.1:8686
playground: false
sources:
kubernetes_logs:
type: kubernetes_logs
host_metrics:
filesystem:
devices:
excludes: [binfmt_misc]
filesystems:
excludes: [binfmt_misc]
mountpoints:
excludes: ["*/proc/sys/fs/binfmt_misc"]
type: host_metrics
internal_metrics:
type: internal_metrics
sinks:
prom_exporter:
type: prometheus_exporter
inputs: [host_metrics, internal_metrics]
address: 0.0.0.0:9090
stdout:
type: console
inputs: [kubernetes_logs]
encoding:
codec: json
zzz
# 설치 하면 Agent 면 daemonset 으로 worker/ingress 노드들에 vector pod 가 설치된다.
helm install vector vector/vector --namespace vector --create-namespace --values values.yaml
# vector 버전업 반영시
helm repo update
helm upgrade vector vector/vector --namespace vector --values values.yaml
# vector 삭제시
helm uninstall vector --namespace vector
# vector 처리 현황 보기
kubectl -n vector exec -it daemonset/vector -- vector top --url http://127.0.0.1:8686/graphql
# k8s log -> filter -> remap -> kafka,elasticsearch,console 로 보내는 경우
# console 은 vector pod log 에서 확인
# vi values.yaml
role: Agent
customConfig:
data_dir: /vector-data-dir
api:
enabled: true
address: 127.0.0.1:8686
playground: false
sources:
k8s_log:
type: kubernetes_logs
# namespace 가 kube_system 아닌것 중 ysoftman 인 것만
# https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/#chained-selectors
extra_field_selector: metadata.namespace=!kube_system,metadata.namespace=ysoftman
transforms:
k8s_transform1:
type: filter
inputs:
- k8s_log
condition: .level != "debug"
k8s_transform2:
type: remap
inputs:
- k8s_transform1
source: |
# % root of the event metadata
# . root of the event
# set es index name
%custom_type = "sample"
if .message == r'.*error.*' {
# % root of the event metadata
%custom_type = "error"
}
sinks:
kafka_log:
type: kafka
inputs: [k8s_transform2]
bootstrap_servers: logis-kafka-dev.daumtools.com:9092
topic: kave-dev-sample
encoding:
codec: json
es_log:
type: elasticsearch
inputs:
- k8s_transform2
endpoints:
- http://ysoftman.es:9200
bulk:
index: "ysoftman-sample-%Y-%m-%d"
console_log:
type: console
inputs: [k8s_transform2]
encoding:
codec: json
comments:
댓글 쓰기