Модуль 9 / 19
Requests, Limits и Probes
Содержание
1. Цели модуля
Вы научитесь задавать requests/limits, объяснять QoS и OOM, выбирать startup/readiness/liveness probes, использовать Metrics API и диагностировать stalled rollout из-за readiness.
2. Теория: requests и limits
Scheduler использует requests для размещения Pod. CPU limit обычно реализуется throttling, а превышение memory limit может привести к OOM kill. Limit не резервирует ресурс и не гарантирует производительность.
QoS Guaranteed требует равных requests и limits CPU/memory для каждого контейнера; Burstable имеет неполный или неравный набор, BestEffort не задаёт их. QoS влияет на eviction при дефиците Node.
3. Теория: probes
startupProbe защищает медленный запуск и до успеха отключает liveness/readiness. readiness исключает Pod из Service endpoints без restart. liveness перезапускает контейнер и должна обнаруживать только состояние, которое restart способен исправить.
Слишком агрессивная livenessProbe усиливает сбой restart storm. Probe должна быть дешёвой, иметь timeout и проверять локальную работоспособность, а не всю цепочку внешних зависимостей.
4. Теория: Metrics Server
kubectl top читает Metrics API, поэтому требует работающий Metrics Server. Эти показатели оптимизированы для autoscaling и оперативного обзора, а не заменяют Prometheus и долговременный мониторинг.
5. Методические указания
- Начинайте requests с измерений, затем пересматривайте их по percentiles
- Проверяйте allocatable Node и суммарные requests
- Разделяйте startup, traffic readiness и deadlock detection
- Не используйте одинаковую внешнюю dependency во всех probes
- Сопоставляйте Ready, restartCount, lastState и Events
- --kubelet-insecure-tls допустим только в этой kind-лаборатории
6. Лабораторная работа: ресурсы и probes
Сохраните манифест как resource-lab.yaml.
apiVersion: v1
kind: Namespace
metadata: {name: lab-resources}
---
apiVersion: apps/v1
kind: Deployment
metadata: {name: app, namespace: lab-resources}
spec:
replicas: 3
progressDeadlineSeconds: 30
selector:
matchLabels: {app: resource-demo}
template:
metadata:
labels: {app: resource-demo}
spec:
containers:
- name: web
image: busybox:1.37.0
command: ["sh", "-c", "mkdir -p /www; echo ok > /www/ready; exec httpd -f -p 8080 -h /www"]
ports: [{name: http, containerPort: 8080}]
resources:
requests: {cpu: 50m, memory: 32Mi}
limits: {cpu: 200m, memory: 64Mi}
startupProbe:
tcpSocket: {port: http}
periodSeconds: 2
failureThreshold: 15
readinessProbe:
httpGet: {path: /ready, port: http}
periodSeconds: 3
livenessProbe:
tcpSocket: {port: http}
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata: {name: app, namespace: lab-resources}
spec:
selector: {app: resource-demo}
ports: [{name: http, port: 80, targetPort: http}]kubectl apply -f resource-lab.yaml
kubectl rollout status deployment/app -n lab-resources --timeout=120s
kubectl get pods -n lab-resources
kubectl describe pod -n lab-resources -l app=resource-demo
kubectl get pods -n lab-resources -o jsonpath='{range .items[*]}{.metadata.name}{" qos="}{.status.qosClass}{" ready="}{.status.containerStatuses[0].ready}{" restarts="}{.status.containerStatuses[0].restartCount}{"\n"}{end}'
kubectl get endpointslices -n lab-resources -l kubernetes.io/service-name=appКритерий: три Ready Pod, QoS=Burstable, restartCount=0 и три ready endpoint.
7. Лабораторная работа: Metrics API
Установите Metrics Server v0.8.1. Patch отключает проверку kubelet certificate только для локального kind; в production настройте доверенный TLS.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.8.1/components.yaml
kubectl patch deployment metrics-server -n kube-system --type=json -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
kubectl rollout status deployment/metrics-server -n kube-system --timeout=120s
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl top nodes
kubectl top pods -n lab-resources --containersКритерий: APIService Available=True, top nodes и top pods возвращают CPU/memory.
8. Диагностика: ошибочная readinessProbe
Неверный path оставляет новые Pods Running, но NotReady. Они не входят в ready endpoints, rollout останавливается, при этом liveness не обязана их перезапускать.
kubectl patch deployment app -n lab-resources --type=json -p='[{"op":"replace","path":"/spec/template/spec/containers/0/readinessProbe/httpGet/path","value":"/missing"}]'
kubectl rollout status deployment/app -n lab-resources --timeout=40s
kubectl get deployment,replicaset,pod,endpointslice -n lab-resources
kubectl get pods -n lab-resources -o jsonpath='{range .items[*]}{.metadata.name}{" ready="}{.status.containerStatuses[0].ready}{" restarts="}{.status.containerStatuses[0].restartCount}{"\n"}{end}'
kubectl describe pods -n lab-resources -l app=resource-demo
kubectl events -n lab-resources --types=Warning
kubectl rollout undo deployment/app -n lab-resources
kubectl rollout status deployment/app -n lab-resources --timeout=120s
kubectl delete namespace lab-resourcesЦепочка: Deployment Conditions → Pod Ready → probe Warning Events → ручная проверка endpoint → EndpointSlice → rollback.
9. Контроль и шпаргалка
- Что scheduler делает с requests?
- Чем CPU limit отличается от memory limit?
- Почему readiness не перезапускает контейнер?
- Когда нужна startupProbe?
- Почему top не заменяет мониторинг?
Модуль освоен, если вы объясняете QoS, не смешиваете назначение probes и доказываете, почему Running Pod исключён из Service.
PDF для работы офлайн
Скачайте оформленную версию модуля для чтения без подключения к сети.