Grafana — Установка

DEB система:

sudo apt install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"

sudo apt update
sudo apt install -y grafana

RPM система:

sudo bash -c 'cat << EOF > /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF'

yum install -y grafana

 

Добавляем в автозапуск и стартуем демона:

systemctl enable grafana-server
systemctl start grafana-server

 

Grafana по умолчанию слушает порт "3000"
Логин и пароль по умолчанию "admin"

Prometheus + Node Exporter — Установка

Создадим группу и пользователя:

groupadd --system prometheus
useradd -s /sbin/nologin --system -g prometheus prometheus

Переходим на официальный сайт и копируем ссылку на скачивание:

https://prometheus.io/download/

Скачиваем архив:

wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz

Разархивируем:

tar -xf prometheus-2.5.0.linux-amd64.tar.gz

Читать далее "Prometheus + Node Exporter — Установка"

Terraform (Google Cloud Platform) — GCN, GCF, Instance

Пример конфигурации Terraform, который создает GCN (Google Compute Network), GCF (Google Compute Firewall), Instance. Пример использования "metadata_startup_script" в Instance

main.tf

provider "google" {
  credentials = "${file("terraform-account.json")}"
  project = "artem-terraform"
  region = "us-central1"
}

variables.tf

variable "PROJECT_NAME" {
  default = "web-server"
}

variable "BITBUCKET_USER" {
  default = "terraform-git-website"
}

variable "BITBUCKET_PASS" {
  default = "MyTempPass1234"
}

Читать далее "Terraform (Google Cloud Platform) — GCN, GCF, Instance"

FIX ERROR — Postgres: database "database_name" is being accessed by other users

Ошибка:

ERROR: database "database_name" is being accessed by other users
DETAIL: There is 1 other session using the database.

Решение:

REVOKE CONNECT ON DATABASE database_name FROM public;
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'database_name';

Fluentd — Kubernetes (Graylog, GELF)

За основу возьмем официальный Docker образ fluntd

Установим необходимые gem'ы для GELF протокола и Kubernetes'а, а так же укажем, что fluentd будет запускаться от пользователя root, иначе будет получать ошибку доступа.

Dockerfile:

FROM fluent/fluentd:latest

USER root
WORKDIR /home/fluent

RUN set -ex \
    && apk add --no-cache --virtual .build-deps \
        build-base \
        ruby-dev \
    && echo 'gem: --no-document' >> /etc/gemrc \
    && gem install fluent-plugin-secure-forward \
    && gem install fluent-plugin-record-reformer \
    && gem install fluent-plugin-gelf-hs \
    && gem install fluent-plugin-kubernetes_metadata_filter \
    && gem install fluent-plugin-rewrite-tag-filter \
    && apk del .build-deps \
    && rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

# Copy plugins
COPY plugins /fluentd/plugins/

# Environment variables
ENV FLUENTD_OPT=""
ENV FLUENTD_CONF="fluent.conf"

# For Kubernetes. Start Fluentd by user root
ENV FLUENT_UID="0"

# Run Fluentd
CMD fluentd -c /fluentd/etc/$FLUENTD_CONF -p /fluentd/plugins $FLUENTD_OPT

Читать далее "Fluentd — Kubernetes (Graylog, GELF)"

Graylog — Kubernetes Ingress Nginx

Скачаем следующий контент пак

В Graylog'е перейдем в "Systems" — "Content Packs", нажмем на "Import content pack" — "Browse…", укажем наш JSON файл с контент паком, и жмем "Upload".

Затем в "Select content packs" открываем "Web Servers", находим там "nginx" и жмем на него, дальше в правой части экрана, где описание контент пака применяем его — "Apply".

Для успешного сбора логов, должен быть настроен сервис Kubernetes для Graylog контейнера на порты 12301 и 12302 UDP.

ConfigMap Ingress'а приводим к следующему виду:

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-staging
  labels:
    app.kubernetes.io/name: ingress-staging
    app.kubernetes.io/part-of: ingress-staging
data:
  use-proxy-protocol: "true"
  enable-access-log: "true"
  http-snippet: |
    log_format graylog2_format '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" <msec=$msec|connection=$connection|connection_requests=$connection_requests|millis=$request_time>';
    access_log syslog:server=graylog-svc.staging.svc.cluster.local:12301 graylog2_format;
    error_log syslog:server=graylog-svc.staging.svc.cluster.local:12302;

В данном примере у меня обращение к Graylog'у происходит по FQDN Kubernetes сервиса.

IngressGraylog'а скажем, чтобы он не логировал обращения к себе, в "annotations" нужно добавить:

nginx.ingress.kubernetes.io/enable-access-log: "false"

Nginx — Graylog2 proxy

Пример файла конфигурации для проксирования Graylog'a Nginx'ом

graylog2.conf:

server
{
    listen 80;
    server_name graylog.example.org;

    location / {
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Graylog-Server-URL http://$server_name/api;
      proxy_pass       http://127.0.0.1:9000;
    }
}

Gralog2 — Slack notify

Находим директорию Graylog'а для хранения плагинов:

grep "plugin_dir =" /etc/graylog/server/server.conf
plugin_dir = /usr/share/graylog-server/plugin

Переходим в нее:

cd /usr/share/graylog-server/plugin

Переходим по ссылке:

https://github.com/Graylog2/graylog-plugin-slack/releases

И находим .jar файл

Качаем .jar файл в директорию для плагинов Graylog

wget https://github.com/graylog-labs/graylog-plugin-slack/releases/download/3.1.0/graylog-plugin-slack-3.1.0.jar

Перезапускаем Graylog Server:

systemctl restart graylog-server

Для работы с плагином необходимо создать новую Webhook'у.

Перейдем по ссылке:

https://YOU_ORGANIZATION_NAME.slack.com/services/new/incoming-webhook

При создании попросит указать канал и пользователя, можно указать любой канал или пользователя, затем в модуле указать нужный канал/пользователя, это значение перезапишется.

Дальше создаем Condition, в котором указываем по каким признакам бить тревогу, и Notification, куда отправлять алармы и с каким содержимым.

Graylog2 — Запуск в Kubernetes

Сервисы в Kubernetes:

  • Elasticsearchelasticsearch
  • MongoDBmongodb-main

Namespace: staging

URL для входа в Web UI: graylog.domain.com

Генерация "PASSWORD_SECRET" и хеш пароля "ROOT_PASSWORD_SHA2"

PASSWORD_SECRET:

pwgen -s 80 1

Если пакет "pwgen" отсутствует в системе, то его необходимо установить.

ROOT_PASSWORD_SHA2:

echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1

Вводим пароль и получаем его хеш:

Enter Password: qwerty

65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5

Читать далее "Graylog2 — Запуск в Kubernetes"

FIX ERROR — AWS EC2 Graylog: Server currently unavailable

На AWS EC2 Instance при открытии Web интерфейса Graylog'а выводилось следующее сообщение:

Server currently unavailable

We are experiencing problems connecting to the Graylog server running on http://172.31.31.109:9000/api/. Please verify that the server is healthy and working correctly.

You will be automatically redirected to the previous page once we can connect to the server.

При этом в файле конфигурации:

/etc/graylog/server/server.conf

Были указаны опции "rest_listen_uri" и "web_listen_uri". Так как EC2 Instance "живет" за NAT'ом, то нам интересна опция:

REST API transport address

Ее описание:

You will need to define this, if your Graylog server is running behind a HTTP proxy that is rewriting
the scheme, host name or URI.

Указываем там внешний IP адрес инстанса и перезапускаем сервис Graylog.

rest_transport_uri = http://1.2.3.4:9000/api/