Notification
새로운 알림이 없습니다.

[ ELK ] ELK Stack Configuration with Portainer(2)

ELK Stack Configuration


  • Agenda
    • ELK Stack Deploy
      • Overview 
      • Prerequisites
    • Docker Swarm Cluster Configuration
    • Use Portainer Deploy ES Cluster
  • Reference
  • Next Actions


ELK Stack Deploy

이전에 배포해둔 Portainer를 통해 Docker Swarm을 활용하여 ELK Stack을 배포하려고 합니다.
Cloud(GCP, AWS, Azure...)환경 어디든 아래와 같이 배치해둘 예정입니다. 

Overview

ELK Stack을 효과적으로 배포하기 위해서는 Docker와 Docker Swarm에 대한 이해가 필수적입니다.
이 두 기술에 대해 간략히 설명드리겠습니다.
  • Docker
    • Application을 Container라는 격리된 환경에서 실행할 수 있도록 하는 도움주는 플랫폼입니다.
      Docker는 Application과 그 종속성을 함께 Packaging하여, 일관된 실행 환경을 제공합니다.
    • 장점
      • 경량성
        • OS Kernel 공유하기 때문에 가상 머신보다 훨씬 가볍고 빠르게 실행
      • 이식성
        • Container에 포함된 App은 동일하게 실행됨
        • Dev 환경, Test 환경, Prod 환경 간의 차이를 줄여줌
      • 격리성
        • 각 Container는 서로 격리되어 있어, 하나의 Container에 문제가 생겨도 다른 컨테이너에 영향을 미치지 않음
      • 확장성
        • 필요에 따라 Container를 빠르고 쉽게 삭제하고 생성할수 있어서 확장성에 용이
  • Docker Swarm 
    • Docker의 Orchestration 툴로, 여러 대의 Docker 엔진을 하나의 클러스터로 묶어 관리합니다.
    • 주요 기능
      • Clustering
        • 여러 Docker 호스트를 하나의 Virtual Host처럼 관리가능
      • Orchestartion
        • 여러 Container의 배포, 관리, 확장을 자동화
      • Service Scaling
        • 각 서비스에 대한 컨테이너 복제본 수를 조정하여 서비스를 빠르고 효율적으로 확장
      • Load Balancing
        • Container 간에 요청을 자동으로 분산하여 Application 성능과 복원력을 향상

Prerequisites

다음은 시스템 요구사항에 맞는 환경 구성에 대한 내용을 공유 하도록 하겠습니다.
  • GCP Server 자원
    • ES Master 3대, Data Node 5대, Log Stash 2대
      • Master중 일부에 Kibana Container 및 Beat 시리즈 배포 예정
      • Data Node의 경우, Host Node의 Volume과 Docker Container상에서 Mount하여 Disk 관리 필요
        • /var/lib/docker Directory를 Attached Disk와 Mount하여 사용
    • Master를 통해서만 ES(Kibana, Elastic Search) 접근이 필요하며, ES Master 윗단에 Load Balancer를 사용한 구성으로 진행 예정 
  • Docker
    • Docker Version은 Latest Version을 추천
  • DisAdvantages
    • 대규모 환경에서는 성능 저하가 발생할수도 있음
    • 사용자 및 권한 관리 기능을 제대로 설정하지 않을 경우, 보안 취약점이 발생할 수 있음

Docker Swarm Cluster Configuration

다음은 GCE를 통해서 Docker Swarm Cluster를 구성 해보겠습니다. 
필자는 GCP환경에 Docker를 설치한 뒤, 위와 같이 서버 10대를 통해 Docker Swarm 구성하였습니다. 

  • ES Data Node들에 Additional Disk를 사용하기 위한 Mount 과정
    ### Docker Daemon Stop $ systemctl disable docker.socket $ systemctl stop docker.socket $ systemctl stop docker.service ### 임의의 Mount Directory로 전체 복사 mkdir -p /tmp/docker-data/ cp -avprf /var/lib/docker /tmp/docker-data/ ### Linux Disk Partiton lsblk ( /dev/sdb 확인 ) fdisk /dev/sdb ------------------- p ( partition 확인 ) n ( partition Number 지정 ) p(primary) first sector Default(2048) End ( 1TiB ) w(Save) ------------------- mkfs.ext4 /dev/sdb1 #FileSystem ext4 ### blkid로 Disk UUID 확인 /etc/fstab UUID=/dev/sdb1_DISK_UUID /var/lib/docker ext4 discard,defaults 0 2 ### Mount 이후 다시 Docker Data 이관
    cp -avprf /tmp/docker-data/* /var/lib/docker ### Docker Daemon Start $ systemctl enable docker.socket $ systemctl start docker.socket $ systemctl start docker.service

  • Docker Swarm Cluster Configuration(1)
    ### Master Docker Node에서 Docker Swarm init 진행 ## docker swarm init $ docker swarm init --advertise-addr LEADER_SERVER_IP ## Manager Or Worker 등록 $ docker swarm join --token SWMTKN_MANAGER_OR_WORKER_TOKEN LEADER_SERVER_IP:2377 

  • Docker Network Create with Portainer
    docker network create --driver overlay --opt com.docker.network.driver.mtu=1460 \ portainer_agent_network docker network create --driver overlay \ --opt com.docker.network.driver.overlay.vxlanid_list=4096,com.docker.network.driver.mtu=1460 --ingress --subnet "10.0.0.0/24" ingress
    ### docker portainer_agent docker service create \ --name portainer_agent \ --network portainer_agent_network \ -p 9001:9001/tcp \ --mode global \ --constraint 'node.platform.os == linux' \ --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \ --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \ --mount type=bind,src=//,dst=/host \ portainer/agent:2.19.2
  • Docker Swarm Cluster Configuration Check
    ## Docker Node 확인 $ docker node ls --format "table {{.Hostname}}\t{{.Status}}\t{{.ManagerStatus}}" HOSTNAME STATUS MANAGER STATUS docker-manager-01 Ready Leader docker-manager-02 Ready Reachable docker-manager-03 Ready Reachable docker-worker-01 Ready docker-worker-02 Ready docker-worker-03 Ready docker-worker-04 Ready docker-worker-05 Ready docker-worker-06 Ready docker-worker-07 Ready docker-worker-08 Ready

  • ES Docker Image Create
    ### Elastic Search User & Group ( Ubuntu 22.04.3 LTS ) sed -i 's/^ubuntu\:x\:1000/ubuntu\:x\:1003/g' /etc/group sed -i 's/^ubuntu\:x\:1000\:1000/ubuntu\:x\:1003\:1003/g' /etc/passwd chown -R ubuntu.ubuntu /home/ubuntu groupadd -g 1000 elasticsearch useradd -g 1000 -u 1000 -d /home/elasticsearch -m -s /usr/sbin/nologin elasticsearch mkdir -p /home/apps/elasticsearch/config mkdir -p /home/apps/elasticsearch/logs chown -R elasticsearch.elasticsearch /home/apps/elasticsearch

    ### Docker Image Configuration

    cd /tmp docker create elasticsearch:ES_VERSION docker export $(docker ps -a|grep 'elasticsearch:ES_VERSION'|grep Created|awk '{print $1}') -o elastic-ES_VERSION.tar mkdir /tmp/elastic mv elastic-ES_VERSION.tar elastic && cd elastic tar -xpf elastic-ES_VERSION.tar cp -avprf /tmp/elastic/usr/share/elasticsearch/config/* /home/apps/elasticsearch/config/ docker container rm $(docker ps -a|grep 'elasticsearch:ES_VERSION'|grep Created| awk '{print $1}') docker image rm elasticsearch:ES_VERSION mkdir -p /home/apps/elasticsearch/certs chown -R elasticsearch.elasticsearch /home/apps/elasticsearch
  • ES에 사용할 CA 인증서 생성
    ### CA 인증서 생성 $./bin/elasticsearch-certutil ca --days 3650 --out elastic-stack-ca.p12 $openssl pkcs12 -in elastic-stack-ca.p12 -nocerts -nodes -out ca.key $openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nodes -out ca.crt ### Subject Name: localhost, IP 대역 ( 10.0.100.0/24 )로 생성한 Self Signed Cert 생성 $bin/elasticsearch-certutil cert --silent --in instances.yml --out test1.zip \ --pass testpassword --ca elastic-stack-ca.p12 $openssl pkcs12 -in elastic-stack-certificates.p12 -nocerts -nodes -out localhost.key $openssl pkcs12 -in elastic-stack-certificates.p12 -clcerts -nodes -out localhost.crt #openssl x509 -text -noout -in localhost/localhost.crt 위 명령어로 IP Address, Subject Name: localhost Check

Use Portainer Deploy ES Cluster

Portainer를 사용하여 아래와 같이 ES Cluster를 배포할수 있습니다.
관련해서 Reference의 GitHub Link를 확인하시면, ES 배포시 사용했던 Docker Compose YAML을 확인하실수 있으실 겁니다.

해당 YAML을 확인하시게 되면 아래 2가지 사항(Configmap, Secret)만 확인하시면 됩니다.
  • ELK Cluster w/Portainer

  • Docker Configmap
    • Configmap은 아래와 같이 Portainer에 별도로 생성하여 yaml에서 external로 불러올수 있게끔 정의 하였습니다.
  • Secrets
    • Configmap과 동일하게 구성하여 보안을 강화하였습니다. 

  • Elastic Search UI
  • ES Dashboard
    • 아래는 ES에서 수집한 Metric을 기반으로 Chart 일부를 가져왔습니다.

Summary

이번 프로젝트에서는 Docker 기반의 컨테이너 관리 플랫폼인 Portainer를 활용하여 ELK(Elasticsearch, Logstash, Kibana) 스택을 배포하였습니다. Portainer의 Stacks 기능을 이용해 Docker Swarm 환경에서 Elasticsearch를 성공적으로 배포하였으며, 이를 통해 다음과 같은 결과를 도출하였습니다.

  • 설치 및 구성 
    • Portainer를 통해 Elasticsearch 컨테이너를 손쉽게 배포하고 관리
    • 설정 파일과 환경 변수를 활용하여 Elasticsearch 클러스터의 노드와 데이터를 구성
  • 모니터링 및 관리
    • Kibana를 활용해 Elasticsearch에 저장된 로그 데이터를 시각화하고 분석
    • 시스템의 상태와 성능을 실시간으로 모니터링
  • 확장성
    • Docker Swarm의 클러스터링 기능을 통해 Elasticsearch 노드를 쉽게 확장
    • 높은 가용성과 확장성을 보장
Portainer를 이용한 Docker Swarm 환경에서의 ELK 스택 배포의 용이성과 효율성을 확인할 수 있었습니다. 향후 필요에 따라 ELK 스택을 확장하거나 다른 데이터 소스를 추가하여 더욱 강력한 로그 분석 환경을 구축할 수 있습니다.

Reference

끝으로 이 포스팅을 보시는 분들이 관련 정보를 얻으시는데 도움이 되었으면 합니다.
ELK
Stan Cloud
Stan Cloud
An avid cloud engineering Fan
대화 참여하기
댓글 쓰기