Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

em huy nop Practice 5 #126

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
560 changes: 560 additions & 0 deletions Practice-4/NguyenTanHuy/README.md

Large diffs are not rendered by default.

81 changes: 81 additions & 0 deletions Practice-4/NguyenTanHuy/alert.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
groups:
- name: alert.rules
rules:
- alert: InstanceDown
# Condition for alerting
expr: up == 0
for: 1m
# Annotation - additional informational labels to store more information
annotations:
title: 'Instance {{ $labels.instance }} down'
description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
# Labels - additional labels to be attached to the alert
labels:
severity: 'critical'

- alert: HostOutOfMemory
# Condition for alerting
expr: node_memory_MemAvailable / node_memory_MemTotal * 100 < 25
for: 5m
# Annotation - additional informational labels to store more information
annotations:
title: 'Host out of memory (instance {{ $labels.instance }})'
description: 'Node memory is filling up (< 25% left)\n VALUE = {{ $value }}\n LABELS: {{ $labels }}'
# Labels - additional labels to be attached to the alert
labels:
severity: 'warning'

- alert: HostHighCpuLoad
# Condition for alerting
expr: (sum by (instance) (irate(node_cpu{job="node_exporter_metrics",mode="idle"}[5m]))) > 80
for: 5m
# Annotation - additional informational labels to store more information
annotations:
title: 'Host high CPU load (instance {{ $labels.instance }})'
description: 'CPU load is > 80%\n VALUE = {{ $value }}\n LABELS: {{ $labels }}'
# Labels - additional labels to be attached to the alert
labels:
severity: 'warning'

- alert: HostOutOfDiskSpace
# Condition for alerting
expr: (node_filesystem_avail{mountpoint="/"} * 100) / node_filesystem_size{mountpoint="/"} < 50
for: 5m
# Annotation - additional informational labels to store more information
annotations:
title: 'Host out of disk space (instance {{ $labels.instance }})'
description: 'Disk is almost full (< 50% left)\n VALUE = {{ $value }}\n LABELS: {{ $labels }}'
# Labels - additional labels to be attached to the alert
labels:
severity: 'warning'

# This rule can be very noisy in dynamic infra with legitimate container start/stop/deployment.
- alert: ContainerKilled
expr: time() - container_last_seen > 60
for: 0m
labels:
severity: warning
annotations:
summary: Container killed (instance {{ $labels.instance }})
description: "A container has disappeared\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"


#Container CPU usage is above 80%
- alert: ContainerCpuUsage
expr: (sum(rate(container_cpu_usage_seconds_total{name!=""}[3m])) BY (instance, name) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: Container CPU usage (instance {{ $labels.instance }})
description: "Container CPU usage is above 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"

# Container Memory usage
- alert: ContainerMemoryUsage
expr: (sum(container_memory_working_set_bytes{name!=""}) BY (instance, name) / sum(container_spec_memory_limit_bytes > 0) BY (instance, name) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: Container Memory usage (instance {{ $labels.instance }})
description: "Container Memory usage is above 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
12 changes: 12 additions & 0 deletions Practice-4/NguyenTanHuy/ansible.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[defaults]
host_key_checking = False
inventory = /etc/ansible/hosts

[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

[ssh_connection]
pipelining=true
10 changes: 10 additions & 0 deletions Practice-4/NguyenTanHuy/hosts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[server1]
10.0.2.15

[server2]
192.168.5.117

[all:vars]
ansible_ssh_user =huy
ansible_ssh_pass =1
ansible_become_pass =1
Binary file added Practice-4/NguyenTanHuy/imgs/check1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-4/NguyenTanHuy/imgs/check2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-4/NguyenTanHuy/imgs/grafana-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-4/NguyenTanHuy/imgs/prometheus-ark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-4/NguyenTanHuy/imgs/prometheus-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
121 changes: 121 additions & 0 deletions Practice-4/NguyenTanHuy/playbook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
---
- hosts: all
become: true
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest

- name: Install required system packages
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- python3-pip
- virtualenv
- python3-setuptools
state: latest

- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present

- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu focal stable
state: present


- name: Update apt and install docker-ce
apt:
name: docker-ce
state: latest

- name: Install Docker Module for Python
pip:
name: docker

- hosts: server1
become: true
tasks:
- name: Pull Prometheus Docker image
docker_image:
name: prom/prometheus:latest
source: pull

- name: Copy prometheus.yml file to /tmp
copy:
src: prometheus.yml
dest: /tmp

- name: Copy alert.rules.yml file to
copy:
src: alert.rules
dest: /tmp

- name: Run Prometheus Docker image
docker_container:
name: prometheus
image: prom/prometheus:latest
restart_policy: unless-stopped
volumes:
- /tmp/prometheus.yml:/etc/prometheus/prometheus.yml
- /tmp/alert.rules.yml:/etc/prometheus/alert.rules
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- "9090:9090"

- name: Pull Grafana Docker image
docker_image:
name: grafana/grafana-enterprise:lastest
source: pull

- name: Run Grafana Docker image
docker_container:
name: grafana
image: grafana/grafana-enterprise:lastest
restart_policy: unless-stopped
ports:
- "3000:3000"

- hosts: server2
tasks:
- name: Pull Node Exporter Docker image
docker_image:
name: prom/node-exporter:latest
source: pull

- name: Run Node Exporter Docker image
docker_container:
name: node-exporter
image: prom/node-exporter:latest
restart_policy: unless-stopped
ports:
- "9100:9100"

- name: Pull Alertmanager Docker image
docker_image:
name: prom/alertmanager:latest
source: pull

- name: alertmanager.yml file to /tmp
copy:
src: alertmanager.yml
dest: /tmp

- name: Run Alertmanager Docker image
docker_container:
name: alertmanager
image: prom/alertmanager:latest
ports:
- "9093:9093"
restart_policy: unless-stopped
volumes:
- /tmp/alertmanager.yml:/alertmanager.yml
command:
- '--config.file=/alertmanager.yml'
137 changes: 137 additions & 0 deletions Practice-5/NguyenTanHuy/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# Bài Thực Hành 5
# Chủ đề: ELASTICSEARCH, KIBANA, FLUENTD
---
Thực hiện: Nguyễn Tấn Huy
---

# **Table of Contents:**

## I. Tổng quan

### 1. ELASTICSEARCH

### 2. KIBANA

### 3. FLUENTD

## II. Thực Hành
- ### A. Cài Đặt
- ### B. Kết Quả

## III. Tài Liệu Tham Khảo
----------
# **I. Tổng quan**
## **1. ELASTICSEARCH**
- Elasticsearch là một search engine.
- Elasticsearch được kế thừa từ Lucene Apache
- Elasticsearch thực chất hoặt động như 1 web server, có khả năng tìm kiếm nhanh chóng (near realtime) thông qua giao thức RESTful
- Elasticsearch có khả năng phân tích và thống kê dữ liệu
- Elasticsearch chạy trên server riêng và đồng thời giao tiếp thông qua RESTful do vậy nên nó không phụ thuộc vào client viết bằng gì hay hệ thống hiện tại của bạn viết bằng gì. Nên việc tích hợp nó vào hệ thống bạn là dễ dàng, bạn chỉ cần gửi request http lên là nó trả về kết quả.
- Elasticsearch là 1 hệ thống phân tán và có khả năng mở rộng tuyệt vời (horizontal scalability). Lắp thêm node cho nó là nó tự động auto mở rộng cho bạn.
- Elasticsearch là 1 open source được phát triển bằng Java

<img src="./imgs/elasticsearch.jpg">

## **2. KIBANA**
- Kibana là một công cụ hiển thị trực quan và khám phá dữ liệu được sử dụng trong những trường hợp phân tích nhật ký và chuỗi thời gian, giám sát ứng dụng và thông tin kinh doanh. Công cụ này cung cấp những tính năng mạnh mẽ, dễ sử dụng như biểu đồ tần suất, biểu đồ đường, biểu đồ tròn, biểu đồ nhiệt và hỗ trợ không gian địa lý được tích hợp sẵn.
- Ngoài ra, công cụ này còn cung cấp khả năng tích hợp chặt chẽ với Elasticsearch, một công cụ phân tích và tìm kiếm phổ biến, khiến Kibana trở thành lựa chọn hàng đầu cho hoạt động hiển thị trực quan dữ liệu được lưu trữ trong Elasticsearch.

<img src="./imgs/kibana.png">

## **3. FLUENTD**

- Fluentd là một công cụ thu thập, xử lý và tổng hợp nhật ký mã nguồn mở được tạo ra vào năm 2011 bởi những người tại Treasure Data .
- Được viết bằng Ruby, Fluentd được tạo ra để hoạt động như một lớp ghi nhật ký thống nhất - một thành phần duy nhất có thể tổng hợp dữ liệu từ nhiều nguồn, thống nhất dữ liệu được định dạng khác nhau thành các đối tượng JSON và định tuyến nó đến các đích đầu ra khác nhau.
- Fluentd đã xuất hiện được một thời gian và đã phát triển một hệ sinh thái phong phú bao gồm hơn 700 plugin khác nhau giúp mở rộng chức năng của nó.
- Fluentd là trình tổng hợp nhật ký tiêu chuẩn de-facto được sử dụng để đăng nhập Kubernetes và như đã đề cập ở trên, là một trong những hình ảnh Docker được sử dụng rộng rãi.

<img src="./imgs/fluentd.png">

# **II. Thực Hành**
## **1. Cài Đặt**
Trong Project bài thực hành 3, ta tạo folder `fluentd`
```
mkdir fluentd
```
Trong folder `fluentd` sẽ chứa flie `Dockerfile` và file configure `fluent.conf`
Nội dung cụ thể như sau:
- Dockerfile
```
FROM fluentd
USER root

RUN apk add --no-cache --update --virtual .build-deps \
sudo build-base ruby-dev \
&& gem install fluent-plugin-elasticsearch \
&& gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

COPY fluent.conf fluentd/etc

USER fluent
```
- fluent.conf
```
<source>
@type forward
port 24224
bind 0.0.0.0
</source>

# <filter nginx>
# @type parser
# key_name log
# <parse>
# @type nginx
# </parse>
# </filter>

<match *.**>
@type copy
<store>
@type elasticsearch
host 27.71.229.80
port 9200
logstash_format true
logstash_prefix huyuet
include_tag_key true
</store>
<store>
@type stdout
</store>
</match>
```

Tiếp theo ta thêm nội dung sau vào file `docker-compose.yml`
```
fluentd:
build: fluentd
volumes:
- ./fluentd:/fluentd/etc
# - ./fluentd:/etc/fluentd
ports:
- "24224:24224"
```
## **2. Kết Quả**

Tiến hành chạy lại file `ocker-compose.yml` bằng câu lệnh:
```
docker-compose up -d
```
<img src="./imgs/docker-compose_up.png">

Chạy lệnh `docker ps` để kiểm tra.

<img src="./imgs/docker-ps.png">

Kiểm tra kết quả

<img src="./imgs/result.png">

# **III. Tài liệu tham khảo**
[ElasticSearch](https://topdev.vn/blog/elasticsearch-la-gi/)

[Kibana](https://aws.amazon.com/vi/opensearch-service/the-elk-stack/kibana/)

[Fluentd](https://hicubex2k.wordpress.com/2016/11/03/tim-hieu-ve-fluentd/)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-5/NguyenTanHuy/imgs/docker-ps.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-5/NguyenTanHuy/imgs/elasticsearch.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-5/NguyenTanHuy/imgs/fluentd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-5/NguyenTanHuy/imgs/kibana.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Practice-5/NguyenTanHuy/imgs/result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.