Docker Swarm үшін Fluentd көмегімен орталықтандырылған логтауды қалай баптауға болады
Осы мониторинг сценарийін орындау үшін келесі жабдықты пайдаланып серверлерді орнатып, баптаңыз:
- Ubuntu 18.04 LTS x86_64 ОС жүйесіндегі Docker.
- Ubuntu 18.04 LTS x86_64 ОС жүйесіндегі Elasticsearch және Kibana.
Docker Swarm - бұл кластер режиміндегі Docker. Кластер бір нодтан немесе бірнеше нодтан тұруы мүмкін. Осы сценарий үшін бір нод жеткілікті.
Fluentd - бұл логтарды жинауға, түрлендіруге және сақтауға жіберуге жауап беретін бағдарламалық кешен. Ұқсас функцияларды ELK стегінің стандартты компоненті болып табылатын Logstash орындайды. Алайда Fluentd логтарды сақтауға жіберу үшін анағұрлым кең мүмкіндіктерге ие (мәлімделген 40-тан астам data outputs), сондай-ақ жұмысының жылдамдығы жоғары және ресурстарға талабы төмен (шамамен 40 мегабайт жедел жад тұтынған кезде секундына 13 000 жол өңделеді). Қазіргі уақытта Fluentd-ті Atlassian, Microsoft және Amazon сияқты ірі компаниялар пайдаланады және қолдайды. Fluentd жобасының бір бөлігі Fluent-bit болып табылады — логтардың жеңіл коллекторы/түрлендіргіші (толығырақ мұнда оқыңыз). Сонымен қатар, Fluentd Kubernetes және Prometheus сияқты жобалармен қатар (толығырақ мұнда оқыңыз) CNCF (Cloud Native Computing Foundation) компаниясының қолдауына ие.
Сценарийді орындау үшін:
- ELK стегінен Fluentd жіберетін логтарды сақтау үшін тек Elasticsearсh және оларды көрсету үшін Kibana пайдаланамыз.
- Docker Swarm кластерінде бірнеше контейнерден тұратын қарапайым қолданбаны өрістетеміз, олардан логтарды жинауды, сондай-ақ логтарды ELK-ке жіберу мен визуализациялауды баптаймыз. Сынақ қолданбасы ретінде Wordpress блогын өрістетеміз. Логтарды Fluentd демонына тікелей жіберу үшін Fluentd лог-драйверін пайдаланамыз. Әдепкі бойынша логтар файлдарға жазылады, оларды Fluent-bit демоны оқи алады, соның нәтижесінде логтарды жоғалту ықтималдығы азаяды, себебі олардың көшірмесі файлда сақталады. Алайда лог-драйверді пайдалану Docker Swarm/k8s кластерлері үшін анағұрлым стандартты тәжірибе болып табылады.
- Суперпользователь құқықтарымен Docker нодына кіріңіз.
- Пакеттерді орнатыңыз:
root@ubuntu-std1-1:~# apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- Docker репозиторийінің кілтін қосыңыз:
root@ubuntu-std1-1:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -OK
- Docker репозиторийін қосыңыз:
root@ubuntu-std1-1:~# add-apt-repository > "deb [arch=amd64] https://download.docker.com/linux/ubuntu > $(lsb_release -cs) > stable"
- Docker орнатыңыз:
root@ubuntu-std1-1:~# apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io
- Кластерді инициализациялаңыз:
root@ubuntu-std1-1:~# docker swarm init
- /root/wordpress директориясын жасап, оған келесі мазмұндағы docker-compose.yml файлын орналастырыңыз:
version: '3'networks:frontend:backend:volumes:db_data: {}wordpress_data: {}services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlenvironment:MYSQL_RANDOM_ROOT_PASSWORD: '1'MYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpressPASSnetworks:- backendlogging:driver: "fluentd"options:fluentd-async-connect: "true"tag: "mysql"wordpress:depends_on:- dbimage: wordpress:latestvolumes:- wordpress_data:/var/www/html/wp-contentenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressPASSWORDPRESS_DB_NAME: wordpressnetworks:- frontend- backendlogging:driver: "fluentd"options:fluentd-async-connect: "true"tag: "wordpress"nginx:depends_on:- wordpress- dbimage: nginx:latestvolumes:- ./nginx.conf:/etc/nginx/nginx.confports:- 80:80networks:- frontendlogging:driver: "fluentd"options:fluentd-async-connect: "true"tag: "nginx"
Әр контейнер үшін Fluentd лог-драйвері сипатталған, Fluentd коллекторына фондық қосылу көрсетілген және кейінгі өңдеу үшін (қажет болған жағдайда) қосымша тегтер қойылған.
- /root/wordpress директориясына nginx.conf конфигурациялық файлын орналастырыңыз:
events {}http {client_max_body_size 20m;proxy_cache_path /etc/nginx/cache keys_zone=one:32m max_size=64m;server {server_name _default;listen 80;proxy_cache one;location / {proxy_pass http://wordpress:80;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}}
- Контейнерлерді іске қосыңыз:
root@ubuntu-std1-1:~# docker stack deploy -c /root/wordpress/docker-compose.yml blogCreating network blog_backendCreating network blog_frontendCreating service blog_wordpressCreating service blog_nginxCreating service blog_db
- Барлығы сәтті іске қосылғанына көз жеткізіңіз:
root@ubuntu-std1-1:~# docker service lsID NAME MODE REPLICAS IMAGE PORTS12jo1tmdr8ni blog_db replicated 1/1 mysql:5.7rbdwd7oar6nv blog_nginx replicated 1/1 nginx:latest \*:80->80/tcpoejvg6xgzcwj blog_wordpress replicated 1/1 wordpress:latest
- Браузердің мекенжай жолағына сервердің IP мекенжайын енгізіп, Wordpress баптауын аяқтаңыз:
Нәтижесінде үш контейнерден тұратын жүйе алынады: MySQL ДҚ, frontend proxy ретіндегі Nginx және Wordpress кодтық базасының жұмыс істеуіне арналған Apache/Modphp бар контейнер. Әр контейнердің өз логтары болады, оларды біз жинау мен өңдеу үшін қосамыз.
- fluentd орнатыңыз:
root@ubuntu-std1-1:~# curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
- fluentd-ті автожүктеуге қосыңыз:
root@ubuntu-std1-1:~# systemctl enable td-agentSynchronizing state of td-agent.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable td-agent
fluentd конфигурациялық файлы /etc/td-agent/td-agent.conf директориясында орналасқан. Ол бірнеше секциядан тұрады, оларды қарастырайық.
source секциясы - логтар көзінің сипаттамасын қамтиды. Docker Fluentd лог-драйвері әдепкі бойынша логтарды tcp://localhost:24224 мекенжайына жібереді. Логтарды қабылдауға арналған source секциясын сипаттайық:
<source>@type forwardport 24224</source>
@type forward - бұл TCP қосылымының үстінде іске қосылатын fluentd-протоколы, оны Docker логтарды Fluentd демонына жіберу үшін пайдаланады.
elasticsearch жүйесіне деректерді шығару секциясы:
<match \*\*>@type elasticsearchhost <IP_ADDRESS_OF_ELK>port 9200logstash_format true</match>
<IP_ADDRESS_OF_ELK> өрісінде Elasticsearch серверінің DNS атауын немесе IP мекенжайын көрсетіңіз.
Мұндай конфигурациялық файл логтарды Elasticsearch-ке жіберудің ең қарапайым нұсқасы болып табылады, бірақ fluentd мүмкіндіктері мұнымен шектелмейді. Онда деректерді сүзгілеу, парсингтеу және пішімдеу мүмкіндіктері кең.
Сүзгілеудің типтік мысалы — regexp бойынша іріктеуді баптау:
<filter foo.bar>@type grep<regexp>key messagepattern /cool/</regexp><regexp>key hostnamepattern /^web\d+\.example\.com$/</regexp><exclude>key messagepattern /uncool/</exclude></filter>
Бұл мысалда ағыннан message өрісінде cool сөзі бар, hostname өрісінде, мысалы, www123.example.com мәні бар және tag өрісінде uncool сөзі жоқ жазбалар таңдалады. Келесі деректер тексеруден өтеді:
{"message":"It's cool outside today", "hostname":"web001.example.com"}{"message":"That's not cool", "hostname":"web1337.example.com"}
Ал келесілері өтпейді:
{"message":"I am cool but you are uncool", "hostname":"db001.example.com"}{"hostname":"web001.example.com"}{"message":"It's cool outside today"}
Бұл мысал fluentd нұсқаулығынан алынған. Сондай-ақ сүзгіні пайдаланудың көрнекі мысалы ретінде геодеректерді қосуды келтіруге болады.
Парсерлер стандартты құрылымы бар логтарды (мысалы, Nginx логтарын) талдауға арналған. Парсерлер source секциясында беріледі:
<source>@type tailpath /path/to/input/file<parse>@type nginxkeep_time_key true</parse></source>
Бұл — Nginx логтарын талдаудың типтік мысалы. Деректерді пішімдеу шығарылатын деректердің пішімін немесе құрылымын өзгерту үшін қолданылады және шығару секциясында сипатталады.
fluentd мүмкіндіктері өте кең, олардың сипаттамасы осы мақаланың форматының шегінен шығады. fluentd мүмкіндіктерін толығырақ зерттеу үшін құжаттаманы қараңыз.
Elasticsearch жүйесіне түскен кезде логтар logstash-YYYY-MM-DD индексіне орналастырылады. Егер логтарды неғұрлым күрделі өңдеу қажет болса, логтарды тікелей Elasticsearch-ке емес, Logstash-қа жіберіп, әрі қарай сол жерде талдап және таратып орналастыруға болады.
Логтарды қарау үшін:
- Браузерде Kibana веб-консоліне өтіп, Management / Index patterns сілтемесін басыңыз.
- Index Pattern енгізу терезесінде logstash-* мәнін енгізіп, Next Step түймесін басыңыз.
- Time filter field name терезесінде @timestamp өрісін таңдап, Create index pattern түймесін басыңыз:
- Index pattern жасалды.
- Discover бөліміне өтіп, индексті таңдаңыз. Онда контейнерлер логтары болады:
Одан кейін Wordpress жүйесінде бірнеше сынақ постын жасап көріп, Kibana-да логтардың өзгеруін қараңыз.





