Upload
victor-login
View
161
Download
1
Embed Size (px)
Citation preview
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
GitLab
GitLab runner (kubernetes)
Prometheus и GitLab
37
Prometheus + Kubernetes
https://github.com/kayrus/prometheus-kubernetes
https://github.com/giantswarm/kubernetes-prometheus
https://www.robustperception.io/blog
https://prometheus.io/docs/introduction/overview
38
Итог+ Льем
+ Мониторим
+ Уведомляем
+ Все заинтегрировано
github.com/batazor