gitlab, prometheus и grafana с kubernetes

39
GitLab, Prometheus и Grafana с Kubernetes или как мы строили инфраструктуру для нашей IoT-платформы

Upload: victor-login

Post on 19-Mar-2017

188 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: GitLab, Prometheus и Grafana с Kubernetes

GitLab, Prometheus и Grafana с Kubernetes

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

Page 2: GitLab, Prometheus и Grafana с Kubernetes

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

git UI - 09.15GitLab CI - 06.16

(GitLab)

staging 11.15production 01.16

(Kubernetes)

staging 12.16production 02.17

(Prometheus)2

Page 3: GitLab, Prometheus и Grafana с Kubernetes

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

staging production

3

Page 4: GitLab, Prometheus и Grafana с Kubernetes

GitLab воркфлоу

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

4

Page 5: GitLab, Prometheus и Grafana с Kubernetes

GitLab

1. Установка

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

3. .gitlab-ci.yaml

4. GitLab раннер

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

5

Page 6: GitLab, Prometheus и Grafana с Kubernetes

Установка GitLab

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

2. deb/rpm пакеты

3. docker-image

a. Kubernetes

b. Openshift

c. Docker-compose

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

6

Page 7: GitLab, Prometheus и Grafana с Kubernetes

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

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

7

Page 8: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 9: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 10: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 11: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 12: GitLab, Prometheus и Grafana с Kubernetes

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

Page 13: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 14: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 15: GitLab, Prometheus и Grafana с Kubernetes

.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

Page 16: GitLab, Prometheus и Grafana с Kubernetes

GitLab Runner

+ deb/rpm пакеты

+ docker - образ

+ k8s - образ (experimental)

16

Page 17: GitLab, Prometheus и Grafana с Kubernetes

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

+ web-terminal

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

+ Auto-deploy

17

Page 18: GitLab, Prometheus и Grafana с Kubernetes

Будущее GitLab CI с Prometheus

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

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

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

18

Page 19: GitLab, Prometheus и Grafana с Kubernetes

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

Go, Go, Go

19

demo.rightech.io

Page 20: GitLab, Prometheus и Grafana с Kubernetes

Kubernetes

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

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

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

+ Базы данных

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

сервисов

20

Page 21: GitLab, Prometheus и Grafana с Kubernetes

Prometheus

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

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

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

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

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

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

21

Page 22: GitLab, Prometheus и Grafana с Kubernetes

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

22

Page 23: GitLab, Prometheus и Grafana с Kubernetes

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

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

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

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

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

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

23

Page 24: GitLab, Prometheus и Grafana с Kubernetes

Настраиваем 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

Page 25: GitLab, Prometheus и Grafana с Kubernetes

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

25

Page 26: GitLab, Prometheus и Grafana с Kubernetes

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

26

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

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

Page 27: GitLab, Prometheus и Grafana с Kubernetes

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

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

Page 28: GitLab, Prometheus и Grafana с Kubernetes

PromQL

1. Запросы

http_requests_total {method="GET"}

28

Page 29: GitLab, Prometheus и Grafana с Kubernetes

PromQL

1. Запросы

2. Функции

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

29

http_requests_total {method="GET"}

Page 30: GitLab, Prometheus и Grafana с Kubernetes

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"}

Page 31: GitLab, Prometheus и Grafana с Kubernetes

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

31

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

webhook

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

Page 32: GitLab, Prometheus и Grafana с Kubernetes

Grafana

1. Grafana + Prometheus

2. Grafana + Prometheus + Slack

3. Grafana + Prometheus + GitLab

32

Page 33: GitLab, Prometheus и Grafana с Kubernetes

Grafana and Prometheus

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

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

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

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

33

Page 34: GitLab, Prometheus и Grafana с Kubernetes

Grafana and Prometheus

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

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

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

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

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

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

34

Page 35: GitLab, Prometheus и Grafana с Kubernetes

Grafana and Prometheus

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

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

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

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

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

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

35

Page 36: GitLab, Prometheus и Grafana с Kubernetes

Grafana and Prometheus

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

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

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

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

36

Page 39: GitLab, Prometheus и Grafana с Kubernetes

Итог+ Льем

+ Мониторим

+ Уведомляем

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

[email protected]

github.com/batazor