반응형
Topic
- AWS EKS 환경에서 EFK스택 구성
- AWS EKS, AWS Elasticsearch Service, Fluentd데몬셋 설치, AWS Cloudwatch Logs활용
EFK란?
- E (Elasticsearch란) : Apache Lucene기반의 java 오픈소스 분산 검색 엔진. 방대한 양의 데이터를 신속하게 저장,검색,분석 할 수 있음
- F (Fluentd) : 오픈소스 데이터 수집기 중 하나이며 비정형 데이터를 수집함
- K (kibana) : Elasticsearch 에서 색이된 데이터를 검색하여 분석 및 시각화를 해주는 플랫폼
- 컨테이너는 특성상 컨테이너 단위의 가상서버가 생성/삭제가 빈번하므로 별도의 로그 수집이 필요 함
- 이러한 log를 수집/모니터링 하기 위해 EFK스택을 사용 함
EFK구조도
- 컨테이너에서 생성되는 로그를 Fluentd가 AWS Cloudwatch로 전달
- AWS Cloudwatch의 LogStream기능을 사용하여 AWS Elasticsearch Service로 로그를 전달
- AWS Elasticsearch Service
작업리스트
- Amazon Elasticsearch Service 구축
- Kubernetes에 Fluentd를 데몬셋으로 설치
- Cloudwatch Logs 확인
- Cloudwatch Logs를 ES로 전송
- Kibana 설정 및 대시보드확인
Amazon Elasticsearch Service 구축
- Amazone Elasticsearch Service는 외부에서 접근이 가능한 형태로 생성
Fluentd 설치
configmap생성
kubectl create ns amazon-cloudwatch kubectl create configmap cluster-info --from-literal=cluster.name=<MY_CLUSTER_NAME> --from-literal=logs.region=<MY-AWS-REGION> -n amazon-cloudwatch
Fluentd.yaml 다운로드
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluentd/fluentd.yaml
권장사항1 : 아래 fluentd-containers 애플리케이션 로그와 kuberentes_metadata 삭제
.. ... <source> @type tail @id in_tail_fluentd_logs @label @fluentdlogs path /var/log/containers/fluentd* pos_file /var/log/fluentd.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <label @fluentdlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_fluentd </filter> <filter **> @type record_transformer @id filter_fluentd_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <match **> @type relabel @label @NORMAL </match> </label> ... ...
권장사항2 : 아래 코드 추가
.. ... <filter **> @type record_transformer remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id @id filter_containers_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> ... ... <filter **> @type record_transformer remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id @id filter_cwagent_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> ... ... <filter **> @type record_transformer remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id @id filter_systemd_stream_transformer <record> stream_name ${tag}-${record["hostname"]} </record> </filter> ... ... <filter **> @type record_transformer remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id @id filter_containers_stream_transformer_host <record> stream_name ${tag}-${record["host"]} </record> </filter> ... ...
설치 확인
- kubect get pod -n amazon-cloudwatch
- AWS 콘솔에서 cloudwatch logs 에 로그 쌓이는 지 확인
### Cloucwatch logs 를 ES로 전송하기
- es전송용 policy 및 lambda용 role생성
- policy 규칙
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"es:*"
],
"Effect": "Allow",
"Resource": "arn:aws:es:ap-northeast-2:104818303680:domain/es-nrson-eks-log/*"
}
]
}
- Lambda 용 Role 을 생성하여 위 policy를 attach 해줌
- cloudwatch logs 에서 해당 로그 선택 action - subscription filters - create elasticsearch subscription filter
- 해당 ES랑 위에서만든 Role 선택 하여 생성*
- 여기서 fillter pattern 을 주면 특정 필터에 걸려서 로그 스트리밍이 안될 수 있음*
kibana에서 로그 잘 들어오는지 확인
kibana접속
왼쪽 카테고리 메뉴에서 security 선택
all_access - Backend roles - Add Backend Role - 앞에서 만들었던 lambda role의 ARN 정보 입력
kibana dashboard home - Use Elasticsearch data - Create index pattern (cwl-* 입력 > @timestamp > Create index pattern 선택)
반응형
'IT > DevOps' 카테고리의 다른 글
[Kubernetes] kubectx, kubens 설치 (다중 클러스터, 다중 네임스페이스 전환 툴) (0) | 2021.06.10 |
---|---|
terraform으로 AWS VPC/Subnet 네트워크 구축하기 (0) | 2021.05.28 |
[DevOps] Ansible 설치부터 사용까지 (0) | 2021.05.25 |
IT종사자들을 위한 Mac OS 터미널 커스텀 세팅 (0) | 2020.01.31 |
쿠버네티스(Kubernetes)란? (0) | 2020.01.18 |