GitLab, Prometheus и Grafana с Kubernetes

Post on 19-Mar-2017

151 views 1 download

Transcript of GitLab, Prometheus и Grafana с Kubernetes

GitLab, Prometheus и Grafana с Kubernetes

или как мы строили инфраструктуру для нашей IoT-платформы

Наш воркфлоу и к чему мы пришли

git UI - 09.15GitLab CI - 06.16

(GitLab)

staging 11.15production 01.16

(Kubernetes)

staging 12.16production 02.17

(Prometheus)2

Про нашу инфраструктуру

staging production

3

GitLab воркфлоу

Двенадцать факторовSemVer

4

GitLab

1. Установка

2. Воркфлоу и 12 факторов

3. .gitlab-ci.yaml

4. GitLab раннер

5. Деплой/Редеплой K8S

5

Установка GitLab

1. Исходный код

2. deb/rpm пакеты

3. docker-image

a. Kubernetes

b. Openshift

c. Docker-compose

4. и другие варианты

6

.gitlab-ci.yml1. Пишем таск/работу (job)

build: script:- npm i- git submodule update --init --recursive- npm run build

7

.gitlab-ci.yml

stages:- lint- test- build

eslint: type: lint script:- npm i --only=dev- npm run lint

allow_failure: true

test: type: test script:- npm i --only=dev- npm run test

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

8

.gitlab-ci.yml

before_script:- nvm use 6.2.0 - docker version

stages:- lint- test- build

test: <...>

after_script:- nvm use 4.1.1

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

9

.gitlab-ci.yml

before_script: <...>

image: node:6.9.4-slim

stages:- lint- test- build

eslint: image: node:custom-test-with-dev-package script:- npm run lint

build: image: node:custom-test-with-prod-package <...>

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

5. docker-in-docker

10

.gitlab-ci.yml

before_script: <...>

image: node:6.9.4-slim

stages: <...>test: <...>

build: image: node:custom-test-with-prod-package script:- npm run build- docker build -t $CI_REGISTRY_IMAGE .- docker push $CI_REGISTRY_IMAGE

after_script: <...>

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

5. docker-in-docker

6. docker build, docker push

11

Dockerfileпримерно так выглядят наши

Dockerfile

FROM node:6.x.x-slim

WORKDIR /src

COPY ./modules ./modulesCOPY ./node_modules ./node_modulesCOPY package.json package.jsonCOPY ./public ./ public

EXPOSE 5050

CMD [“npm”, “run”, “start:prod”]

12

.gitlab-ci.yml

# before_script, image, stages, eslint, test

build_production: type: build script:- <...>- docker build -t $CI_REGISTRY_NAME- docker build -t

$CI_REGISTRY_NAME:$CI_BUILD_TAG only: # 1.0.0 1.0.0.1 X.Y.Z - X.Y.Z.{P}- /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1

-9]\d*)\.?(?:0|[1-9]\d*)?$/

# after_script

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

5. docker-in-docker

6. docker build, docker push

7. Немного SemVer’а

13

.gitlab-ci.yml

stages:- <...>- deploy

deploy_staging: type: deploy script:- kubectl config use-context ric-sandbox- kubectl --namespace=rightech \

rolling-update ric-web \ --image-pull-policy=Always \ --image=$CI_REGISTRY_IMAGE:staging only: # 1.0.0-rc1 1.0.0-rc2 X.Y.Z-rc{N}- /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1

-9]\d*)-rc(?:0|[1-9]\d*)$/

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

5. docker-in-docker

6. docker build, docker push

7. Немного SemVer’а

8. И наконец деплой в k8s

14

.gitlab-ci.yml

# before_script, image, eslint, test, build_staging, build_production

stages:- <...>

deploy_staging: type: deploy environment: name: $CI_ENVIRONMENT_NAME # имя репозитория echo-server url: https://echo-server.example.com script: <...> only: <...>

# deploy_production, after_script

1. Пишем таск/работу (job)

2. Добавляем линтер

3. Прогоняем тесты

4. Подготовка окружения

5. docker-in-docker

6. docker build, docker push

7. Немного SemVer’а

8. И наконец деплой в k8s

9. Добавим удобства

15

GitLab Runner

+ deb/rpm пакеты

+ docker - образ

+ k8s - образ (experimental)

16

Что есть еще для Kubernetes? Если у вас OpenShift...

+ web-terminal

+ генерация .gitlab-ci.yml

+ Auto-deploy

17

Будущее GitLab CI с Prometheus

Также в планах: проверка лицензий,

центр безопасности и дальнейшее

расширение возможностей GitLab CI

18

А теперь как это работает в реальном мире

Go, Go, Go

19

demo.rightech.io

Kubernetes

+ Используем CoreOS

+ Два кластера

+ Десяток серверов

+ Базы данных

+ Ежедневные обновления

сервисов

20

Prometheus

1. Познакомились в декабре 2016

2. Обзор экосистемы

3. Как подружить с Kubernetes?

4. И как получать данные?

5. Пишем алертинги

6. Настраиваем нотификацию

21

Из чего состоит Prometheus?

22

Настраиваем Prometheus

1. Общие настройки

global: # Настройка глобальных значений

rule_files: - "/etc/prometheus-rules/*.rules"

scrape_configs:# Дальше описываем джобы, подключаемся к k8s API

# Пример статичного сервиса- job_name: 'prometheus' static_configs: - targets: ['localhost:9090']

23

Настраиваем Prometheus

1. Общие настройки

2. Подключаем K8S-ноды

# Получаем ноды k8s- job_name: 'kubernetes-nodes' scheme: https tls_config: ca_file: /path/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /path/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+)

24

Настраиваем Prometheus

25

1. Запустить exporter

26

apiVersion: v1kind: Servicemetadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "9121"spec: selector: app: ric-redis-exporter ports: - port: 9121

Как получать данные?

1. Запустить exporter

2. Указать аннотации

# HELP redis_uptime_in_seconds # TYPE redis_uptime_in_seconds gaugeredis_uptime_in_seconds {addr="redis://ric-redis.rightech:6379"} 7.741975e+06# HELP redis_used_cpu_sys # TYPE redis_used_cpu_sys gaugeredis_used_cpu_sys {addr="redis://ric-redis.rightech:6379"} 9021.01# HELP redis_used_cpu_user # TYPE redis_used_cpu_user gaugeredis_used_cpu_user {addr="redis://ric-redis.rightech:6379"} 3202.48

27

Как получать данные?

PromQL

1. Запросы

http_requests_total {method="GET"}

28

PromQL

1. Запросы

2. Функции

sum(http_requests_total {method="GET"} offset 5m)

29

http_requests_total {method="GET"}

PromQL

1. Запросы

2. Функции

3. Алерты

ALERT CountHttpGetRequest IF (sum(http_requests_total {method="GET"} offset 5m) > 500) FOR 10m LABELS {severity=”page”} ANNOTATION {DESCRIPTION=”{{$labels.instance}}”}

30

sum(http_requests_total {method="GET"} offset 5m)

http_requests_total {method="GET"}

Настраиваем нотификацию

31

1. Подключаем slack, smtp,

webhook

2. Подписываемся на события

Grafana

1. Grafana + Prometheus

2. Grafana + Prometheus + Slack

3. Grafana + Prometheus + GitLab

32

Grafana and Prometheus

1. Выбрать источник данных Prometheus

2. Указать путь до Prometheus

3. Basic Auth, CA Cert - опционально

1. Подключение стора

33

Grafana and Prometheus

1. Берем упомянутый ранее запрос

2. Создаем дашборд

3. Вставляем запрос PromQL

4. Видим результат

1. Подключение стора

2. Создаем дашборд

34

Grafana and Prometheus

1. Можем добавить алертинг

2. Добавляем алертинг

3. Настраиваем интеграцию со Slack

1. Подключение стора

2. Создаем дашборд

3. Создаем алерт

35

Grafana and Prometheus

1. Подключение стора

2. Создаем дашборд

3. Создаем алерт

4. Настраиваем нотификацию

36

Итог+ Льем

+ Мониторим

+ Уведомляем

+ Все заинтегрировано

login@rightech.io

github.com/batazor