Background

  • 컨테이너 환경에서의 로그 수집을 위해 EFK(ElastiSearch + Fluentd + Kibana) Stack을 구축
  • 로그 저장소인 ElastiSearch, 로그 수집기인 Fluentd, 로그 시각화 툴인 Kibana를 EKS 환경에서 구축
    • ElastiSearch 구축
    • Fluentd 구축
    • Kibana 구축
  • 이전 버전까지 진행된 상태에서 진행(EKS 클러스터, NodeGroup의 WorkerNode(Instance type은 t3.medium으로 생 성해야 out of memory 발생 X) 생성, Nginx 배포)

EFK?

  • ElasticSearch + Fluentd + Kibana
  • 쿠버네티스는 파드가 정상상태가 아니면 새로 생성
    • 죽은 파드에 있는 컨테이너가 남긴 로그는 어디로..?
  • 컨테이너의 로그를 로그 저장소에 수집
    • 죽은 컨테이너의 로그도 남는다
  • Fluentd
    • 컨테이너의 스트림 로그를 수집하는 로그 수집기. 모든 노드마다 동일하게 배포되어야함 → Daemonset
  • ElasticSearch – 로그를 저장하기 위한 대용량 저장소
  • Kibana - ElasticSearch와 연동하여 로그 시각화
    • 로그 시각화를 통한 문제 해결 및 예방 가능

1

Daemonset?

  • 쿠버네티스 컨트롤러(Deployment, ReplicaSet 등) 중 하나
    • 컨트롤러란? 쿠버네티스 기본 object를 생성하고 관리하는 역할
  • Daemonset은 Pod가 각각의 노드에 하나씩만 배포되게 하는 Pod 관리 컨트롤러
    • ex) 모든 노드에 로그 수집용 Daemonset pod를 띄움

ELK Stack 구축을 통한 로그 수집(실행)

노드그룹 생성

  • 이름 : mission-wn
  • 노드 IAM role : WorkerNodeInstanceRole
  • 서브넷 : 이전에 생성한 private 서브넷
  • 키페어 : Nat instanc의 키페어 또는 Worker node 전용 키페어 생성하여 사용 (컴퓨팅 구성 설정 비용 때문에)
  • AMI : Amazon Linux2
  • 인스턴스 유형 : t3.medium(t3.medium 이하는 memory 부족함)
  • 디스크 크기 : 4GB
  • 조정 구성 설정
    • 최소 : 1 최대 1 원하는 크기 1(비용 때문에)

ElasticSearch란?

  • 텍스트, 숫자, 위치기반정보, 정형 및 비정형 데이터 등 모든 유형의 데이터를 위한 분산형 오픈소스검색 및 분석엔진
    • 많은 양의 데이터를 보관하고 실시간으로 분석하는 엔진
  • ElasticSearch를 설치하려면..?
    • java 8 설치(ElasticSearch는 jvm 위에서 돌기 때문) > ElasticSearch install > service 재시작 ……
    • But Kubernetes로 시작하면?
      • elasticSearch.yaml로 elasticSearch 배포 > NodePortType으로 배포
      • ElasticSearch yaml 파일 작성 > kubectl apply로 배포하면 끝
  • ElasticSearch를 NodePort type의 서비스로 배포하여 2주차 때 생성한 Nginx의 LoadBalancer에 연결하여 통신 확인

ElasticSearch 배포

  • elasticSearch.yaml로 elasticSearch 배포 > NodePortType으로 배포
## filename: elasticSearch.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elastic/elasticsearch:6.4.0
        env:
        - name: discovery.type
          value: "single-node"
        ports:
        - containerPort: 9200
        - containerPort: 9300
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: elasticsearch
  name: elasticsearch-svc
  namespace: default
spec:
  ports:
  - name: elasticsearch-rest
    nodePort: 30920
    port: 9200 
    protocol: TCP
    targetPort: 9200
  type: NodePort
# 배포
$ kubectl apply f elasticSearch.yaml 

# 배포된 서비스 확인
$ kubectl get service 

Loadbalancer 리스너에 추가

  • 리스너란?
    • 리스너는 정의한 프로토콜과 포트를 사용하여 연결요청을 확인하는 프로세스.
    • 리스너에 정의한 규칙에 따라 로드밸런서가 등록된 대상으로 요청을 라우팅하는 방법 결정
  • [EC2] → [로드밸런서] → [Listeners]탭 클릭 → [Edit]

2

LoadBalancer의 9200 포트로 외부 접근 허용 위해 Loadbalancer security group inbound rule 추가

  • [EC2] → [로드밸런서] → [Security]탭 클릭 → Security Group ID 클릭 → security group 화면에서 inbound rule 편집

3

4

Kibana

  • Elastic Stack을 기반으로 구축된 오픈 소스 프론트엔드 애플리케이션으로, Elasticsearch에서 색인된 데이터를 검색하고 시각화하는 기능을 제공
    • 오픈 소스 기반의 분석 및 시각화 플랫폼
  • Kibana 배포
    • kibana.yaml로 kibana 배포 > NodePortType으로 배포
    • kibana를 NodePort type의 서비스로 배포하여 2주차 때 생성한 Nginx의 LoadBalancer에 연결하여 외부 접근

Kibana 배포

  • kibana.yaml로 kibana 배포 > NodePortType으로 배포
## filename: kibana.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: elastic/kibana:6.4.0
        env:
        - name: SERVER_NAME
          value: "kibana.kubenetes.example.com"
        - name: ELASTICSEARCH_URL
          value: "http://elasticsearch-svc.default.svc.cluster.local:9200"
        ports:
        - containerPort: 5601
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kibana
# 배포
$ kubectl apply f kibana.yaml 

# 배포된 서비스 확인
$ kubectl get service

Loadbalancer 리스너에 추가

  • [EC2] → [로드밸런서] → [Listeners]탭 클릭 → [Edit]

5

LoadBalancer의 5601 포트로 외부 접근 허용 위해 Loadbalancer security group inbound rule 추가

  • [EC2] → [로드밸런서] → [Security]탭 클릭 → Security Group ID 클릭 → security group 화면에서 inbound rule 편집

6

  • Kibana web 접근 확인
    • LB DNS:5601

7

Fluentd

  • Fluentd란?
    • 로그 수집기
    • 다양한 데이터소스(HTTP, TCP 등)로부터 원하는 형태로 가공되어 여러 목적지(EasticSearch, s3) 등으로 전달 가능
  • luentd.yaml로 fluentd Daemonset pod 배포
## filename: fluentd.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: fluentd
  namespace: kube-system
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: fluentd
roleRef:
  kind: ClusterRole
  name: fluentd
  apiGroup: rbac.authorization.k8s.io
subjects:
# 배포
$ kubectl apply f fluentd.yaml 

# 배포된 서비스 확인
$ kubectl get service

Kibana로 로그 시각화

  • Kibana 인덱스 패턴 생성
    • 인덱스 패턴 생성
      • [Management] → [Index Patterns] → Index pattern : logstash-*→ next step → @timestamp→ create index pattern
  • 로그 시각화
    • 검색필터를 설정하여 nginx의 로그 확인
      • [Discover] → 검색필터 설정 → kuberntes.labels.run is my-nginx(nginx 배포 때 사용 한 Label)
  • [클라우드 코멘토]