← К программе курса

Модуль 9 / 19

Requests, Limits и Probes

KUBERNETES

Содержание
01

1. Цели модуля

Вы научитесь задавать requests/limits, объяснять QoS и OOM, выбирать startup/readiness/liveness probes, использовать Metrics API и диагностировать stalled rollout из-за readiness.

02

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.

03

3. Теория: probes

startupProbe защищает медленный запуск и до успеха отключает liveness/readiness. readiness исключает Pod из Service endpoints без restart. liveness перезапускает контейнер и должна обнаруживать только состояние, которое restart способен исправить.

Слишком агрессивная livenessProbe усиливает сбой restart storm. Probe должна быть дешёвой, иметь timeout и проверять локальную работоспособность, а не всю цепочку внешних зависимостей.

04

4. Теория: Metrics Server

kubectl top читает Metrics API, поэтому требует работающий Metrics Server. Эти показатели оптимизированы для autoscaling и оперативного обзора, а не заменяют Prometheus и долговременный мониторинг.

05

5. Методические указания

  • Начинайте requests с измерений, затем пересматривайте их по percentiles
  • Проверяйте allocatable Node и суммарные requests
  • Разделяйте startup, traffic readiness и deadlock detection
  • Не используйте одинаковую внешнюю dependency во всех probes
  • Сопоставляйте Ready, restartCount, lastState и Events
  • --kubelet-insecure-tls допустим только в этой kind-лаборатории
06

6. Лабораторная работа: ресурсы и probes

Сохраните манифест как resource-lab.yaml.

terminal
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}]
terminal
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.

07

7. Лабораторная работа: Metrics API

Установите Metrics Server v0.8.1. Patch отключает проверку kubelet certificate только для локального kind; в production настройте доверенный TLS.

terminal
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.

08

8. Диагностика: ошибочная readinessProbe

Неверный path оставляет новые Pods Running, но NotReady. Они не входят в ready endpoints, rollout останавливается, при этом liveness не обязана их перезапускать.

terminal
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 → EndpointSlicerollback.

09

9. Контроль и шпаргалка

  • Что scheduler делает с requests?
  • Чем CPU limit отличается от memory limit?
  • Почему readiness не перезапускает контейнер?
  • Когда нужна startupProbe?
  • Почему top не заменяет мониторинг?

Модуль освоен, если вы объясняете QoS, не смешиваете назначение probes и доказываете, почему Running Pod исключён из Service.

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

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

Скачать PDFPDF