← До програми курсу

Модуль 14 / 19

Observability: metrics, logs і events

KUBERNETES

Зміст
01

1. Цілі модуля

Ви навчитеся розрізняти сигнали observability, пов’язувати телеметрію зі станом Kubernetes і діагностувати деградацію за кількома незалежними джерелами.

  • metrics, logs, traces та Events
  • Metrics API і Metrics Server
  • Prometheus, Alertmanager і Grafana
  • структуровані logs та correlation IDs
  • симптом → гіпотеза → evidence
02

2. Теорія: чотири сигнали спостережуваності

Metrics — числові часові ряди для трендів, SLI та alerting. Logs — дискретні записи подій застосунку. Traces показують шлях запиту через сервіси й тривалість spans. Kubernetes Events — короткоживучі повідомлення controllers і kubelet про зміну стану об’єктів.

Сигнали доповнюють один одного, але не взаємозамінні. Metric показує масштаб і час проблеми, trace локалізує затримку, log пояснює конкретне виконання, Event пов’язує симптом із reconciliation Kubernetes.

03

3. Теорія: Metrics API і стан кластера

kubectl top читає resource metrics із Metrics API, який обслуговує Metrics Server. Ці CPU/memory samples призначені для autoscaling та оперативного огляду; вони не є довготривалим monitoring backend і не замінюють Prometheus.

kube-state-metrics перетворює стан Kubernetes objects на Prometheus metrics, але не вимірює CPU контейнера. Node exporter описує host, kubelet/cAdvisor — containers, застосунок — власні business і request metrics.

04

4. Теорія: Prometheus, Alertmanager, Grafana та OpenTelemetry

Prometheus виявляє targets, виконує scrape і зберігає time series. Recording rules попередньо обчислюють запити, alerting rules створюють alerts, Alertmanager групує та маршрутизує сповіщення, Grafana візуалізує дані.

OpenTelemetry Collector приймає metrics, logs і traces через receivers, обробляє їх processors і надсилає exporters. Kubernetes Attributes Processor додає namespace, Pod name та UID, що дозволяє корелювати сигнали після перестворення Pod.

05

5. Теорія: SLI, SLO та alerting

Починайте з користувацького результату: availability, latency, error rate і saturation. SLI є вимірюванням, SLO — цільовою межею за вікно часу, error budget — допустимою часткою неуспіху. Alert має бути actionable і мати owner та runbook.

Не створюйте alert на кожен restart або CPU spike. Використовуйте симптоми, тривалість і burn rate; dashboard відповідає на дослідницьке питання, але не замінює alerting.

06

6. Методичні вказівки

  • Додавайте єдині labels: service, environment, cluster, namespace і version
  • Пишіть структуровані logs у stdout/stderr і не додавайте до них secrets
  • Передавайте trace/correlation ID між сервісами
  • Контролюйте cardinality: не використовуйте user ID або request ID як metric label
  • Задавайте retention, sampling і вартість до масового збору
  • Перевіряйте не лише збір, а й доставку alerts
  • Ураховуйте, що Events мають обмежений строк зберігання
07

7. Лабораторна робота: кореляція вбудованих сигналів

Metrics Server має бути встановлений за модулем 9. Збережіть manifest як observability-lab.yaml. Sidecar logger потрібний лише для навчального зіставлення container logs.

terminal
apiVersion: v1
kind: Namespace
metadata: {name: lab-observe}
---
apiVersion: apps/v1
kind: Deployment
metadata: {name: web, namespace: lab-observe}
spec:
  replicas: 2
  selector:
    matchLabels: {app: web}
  template:
    metadata:
      labels: {app: web}
    spec:
      containers:
        - name: web
          image: nginx:1.29-alpine
          ports: [{name: http, containerPort: 80}]
          readinessProbe:
            httpGet: {path: /, port: http}
            periodSeconds: 5
          livenessProbe:
            httpGet: {path: /, port: http}
            periodSeconds: 10
          resources:
            requests: {cpu: 20m, memory: 32Mi}
            limits: {memory: 64Mi}
        - name: logger
          image: busybox:1.37.0
          command: ["sh", "-c", "while true; do echo "level=info component=logger message=heartbeat"; sleep 10; done"]
          resources:
            requests: {cpu: 5m, memory: 8Mi}
            limits: {memory: 16Mi}
---
apiVersion: v1
kind: Service
metadata: {name: web, namespace: lab-observe}
spec:
  selector: {app: web}
  ports: [{name: http, port: 80, targetPort: http}]
terminal
kubectl apply -f observability-lab.yaml
kubectl rollout status deployment/web -n lab-observe --timeout=120s
kubectl get pod -n lab-observe -l app=web -o wide
kubectl logs -n lab-observe -l app=web -c logger --prefix --tail=20
kubectl events -n lab-observe --for deployment/web
kubectl get endpointslice -n lab-observe -l kubernetes.io/service-name=web
kubectl top node
kubectl top pod -n lab-observe --containers
kubectl port-forward -n lab-observe service/web 8080:80

Критерій: два Pod Ready, EndpointSlice містить два ready endpoint, logs мають container prefix, Events зрозумілі, top показує кожен контейнер. Port-forward виконується в окремому терміналі.

08

8. Лабораторна робота: Prometheus і Grafana

Для кластера щонайменше з 4 CPU та 8 GiB RAM установіть stack в окремий namespace monitoring. Chart 88.0.1 зафіксовано для відтворюваності; перед production перевірте release notes, storage, retention, RBAC, ingress і backup. Команди port-forward блокують термінал і виконуються по одній.

terminal
helm show chart oci://ghcr.io/prometheus-community/charts/kube-prometheus-stack --version 88.0.1
helm upgrade --install monitoring oci://ghcr.io/prometheus-community/charts/kube-prometheus-stack --version 88.0.1 --namespace monitoring --create-namespace --rollback-on-failure --wait --timeout 10m
kubectl get pod -n monitoring
kubectl get prometheus,alertmanager,servicemonitor,prometheusrule -n monitoring
kubectl port-forward -n monitoring service/monitoring-kube-prometheus-prometheus 9090:9090
curl -fsS 'http://127.0.0.1:9090/api/v1/query?query=up'
kubectl port-forward -n monitoring service/monitoring-grafana 3000:80

kube-prometheus-stack установлює Prometheus Operator, Prometheus, Alertmanager, Grafana, exporters, rules і CRDs. CRDs можуть не видалятися з helm uninstall та потребують окремого lifecycle; major chart upgrade звіряйте з UPGRADE.md.

09

9. Діагностика: Running, але не Ready

Зламайте readiness path. Нові Pods залишаться Running, але зникнуть із ready endpoints; rollout очікувано отримає timeout. Зіставте Conditions, Warning Events, EndpointSlice і logs, потім виконайте rollback.

terminal
kubectl patch deployment web -n lab-observe --type=json -p='[{"op":"replace","path":"/spec/template/spec/containers/0/readinessProbe/httpGet/path","value":"/missing"}]'
kubectl rollout status deployment/web -n lab-observe --timeout=45s
kubectl get pod -n lab-observe -l app=web
kubectl describe deployment web -n lab-observe
kubectl events -n lab-observe --types=Warning
kubectl get endpointslice -n lab-observe -l kubernetes.io/service-name=web -o yaml
kubectl logs -n lab-observe -l app=web -c web --tail=20 --prefix
kubectl rollout undo deployment/web -n lab-observe
kubectl rollout status deployment/web -n lab-observe --timeout=120s
kubectl delete namespace lab-observe

Діагностичний ланцюжок: користувацький симптом → Deployment/Pod Conditions → traffic endpoints → resource saturation → logs → traces → recent changes. Відсутність помилки в одному сигналі не доводить справність системи.

10

10. Контроль і шпаргалка

  • Чим Metrics Server відрізняється від Prometheus?
  • Що вимірює kube-state-metrics?
  • Чому request ID небезпечний як metric label, але корисний у logs і traces?
  • Чим Event відрізняється від application log?
  • Як SLI пов’язаний із SLO та error budget?
  • Чому Running Pod може не отримувати traffic?

Модуль засвоєно, якщо ви обираєте сигнал під питання, корелюєте його за Kubernetes metadata і доводите причину деградації щонайменше двома джерелами evidence.

PDF для роботи офлайн

Завантажте оформлену версію модуля для читання без підключення до мережі.

Завантажити PDFPDF