Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Schetinnikov Stas committed Apr 19, 2021
1 parent ec5e560 commit e478f67
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 80 deletions.
2 changes: 1 addition & 1 deletion kube/finish.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Поздравляю! Вы узнали, что такое Prometheus и как он работает, научились инструментировать сервис и узнали базовые запросы в PromQL.
Ты молодец!
3 changes: 3 additions & 0 deletions kube/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
"text": "finish.md"
}
},
"files": [
"pod.yaml"
],
"environment": {
"showdashboard": true,
"dashboards": [{"name": "Prometheus", "port": 9090}],
Expand Down
8 changes: 1 addition & 7 deletions kube/intro.md
Original file line number Diff line number Diff line change
@@ -1,7 +1 @@
Prometheus - это система мониторинга и алертинг с открытым кодом, изначально разработанная в SoundCloud. С момента открытия в 2012 году, многие компании и организации начали использовать Prometheus и у проекта появилось очень активное сообщество пользователей и разработчиков. На текущий момент Prometheus - это отдельный проект, который поддерживается независимо от любых компаний. В 2016 году Prometheus присоединился к Cloud Native Computing Foundation. Больше информации можно узнать на сайте проекта - https://prometheus.io

В это сценарии мы:
* создадим сервис на Python
* выполним деплой сервиса
* запустим Prometheus и настроим мониторинг сервиса с помощью него
* посмотрим с помощью PromQL, как наше приложение ведет себя под нагрузкой
Демо работы Kubernetes
87 changes: 15 additions & 72 deletions kube/step0.md
Original file line number Diff line number Diff line change
@@ -1,81 +1,24 @@
Напишем и запустим сервис, который будет эмулировать работу реального приложения. А в следующем шаге инструментируем, чтобы он отдавал метрики для Prometheus.

Сервис напишем на Python. По пути /probe этот сервис будет отвечать с некоторой задержкой, эмулирующей работу. Длительность задержки будет определяться с помощью некоторого распределения вероятностей, и также с некоторой вероятностью приложения иногда будет отдавать 500ый статус код HTTP.

Откройте закладку файла app.py в редакторе и введите в него код на Python ниже, либо нажмите кнопку "Copy to Editor". Это основной файл нашего приложения.

<pre class="file" data-filename="./app/app.py" data-target="replace">
import os
import json
import random
import time

from flask import Flask, abort

app = Flask(__name__)

FAIL_RATE=float(os.environ.get('FAIL_RATE', '0.05'))
SLOW_RATE=float(os.environ.get('SLOW_RATE', '0.00'))

def do_staff():
time.sleep(random.gammavariate(alpha=1.5, beta=.1))

def do_slow():
time.sleep(random.gammavariate(alpha=30, beta=0.3))

@app.route('/probe')
def probe():
if random.random() < FAIL_RATE:
abort(500)
if random.random() < SLOW_RATE:
do_slow()
else:
do_staff()
return "OK"

if __name__ == '__main__':
app.run(host='0.0.0.0', port='8000', debug=True)
<pre class="file" data-filename="./pod.yaml" data-target="replace">
apiVersion: v1
kind: Pod
metadata:
name: hello-demo
labels:
app: hello-demo
spec:
containers:
- name: hello-demo
image: schetinnikov/hello-app:v1
ports:
- containerPort: 80
</pre>

Теперь давайте запустим этот сервис с помощью Docker. Для этого нам понадобится файл с описанием зависимостей для Python и Dockerfile.


Откройте вкладку файла ./app/Dockefile в редакторе и введите в него код ниже, либо нажмите кнопку "Copy to Editor".

<pre class="file" data-filename="./app/Dockerfile" data-target="replace">
FROM python:3.7-slim
COPY requirements.txt /requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
CMD ["python", "/app/app.py"]
</pre>

Откройте вкладку файла ./app/requirements.txt в редакторе и введите в него код ниже, либо нажмите кнопку "Copy to Editor". Это файл с описанием зависимостей для сервиса

<pre class="file" data-filename="./app/requirements.txt" data-target="replace">
Flask==1.1.2
prometheus-client==0.7.1
</pre>

С помощью команды docker build собираем локальный образ с меткой app:v1. Докер образ будет хранится локально.

```
docker build -t app:v1 app/
```{{execute}}
Запускаем это приложение с помощью docker-a в хост-сети, имя контейнера пусть будет app-v1
```
docker run -d --net=host --name=app-v1 app:v1
kubectl apply -f pod.yaml
```{{execute}}
Проверить работоспособность можно с помощью curl.
```
curl localhost:8000/probe
watch kubectl get pods
```{{execute}}
Наш сервис должен ответить текстом "ОК" в консоли.
Пока наш сервис не предоставляет никаких метрик в Prometheus, но в шаге 3 мы исправим это.

0 comments on commit e478f67

Please sign in to comment.