DevOps в серии буткемпов K8s

Обратите внимание, полная ментальная карта DevOps в K8s доступна по адресу: «DevOps в ментальной карте K8s»

Цепочка обработчиков запросов сервера API

Ниже представлена ​​схема цепочки обработчиков сервера API:

В этой статье мы сосредоточимся на «тайм-ауте запроса».

Тайм-аут запроса сервера API

Что такое тайм-аут запроса

В K8s тайм-аут запроса API-сервера (по умолчанию 60 секунд) относится к продолжительности, по истечении которой API-запрос к API-серверу K8s будет прекращен, если он не был завершен. Другими словами, это максимальное время, в течение которого сервер API будет ожидать обработки запроса, прежде чем считать его неудачным.

Это значение тайм-аута можно настроить в зависимости от потребностей вашей конкретной среды или сложности выполняемых операций. Для некоторых запросов, обработка которых занимает больше времени, могут потребоваться более длительные тайм-ауты, а более короткие тайм-ауты могут помочь предотвратить чрезмерное ожидание неотвечающих запросов.

Если время ожидания запроса истекло, клиенты получат сообщение об ошибке, и им может потребоваться повторить запрос или соответствующим образом обработать ошибку. Правильная настройка значения тайм-аута важна для обеспечения бесперебойной работы вашего кластера Kubernetes и его компонентов.

Как обновить время ожидания запроса

Чтобы настроить время ожидания запроса сервера API K8s, вы можете изменить флаги командной строки сервера API или отредактировать его файл конфигурации. Вот как это сделать с помощью флагов командной строки:

  • Найдите конфигурацию kube-apiserver: конфигурация обычно находится в файле с именем kube-apiserver.yaml или kube-apiserver.manifest в каталоге /etc/kubernetes/manifests/ на главном узле.
  • Добавьте или измените флаг --request-timeout: в файле kube-apiserver.yaml или kube-apiserver.manifest найдите раздел command, а затем добавьте или измените флаг --request-timeout, за которым следует желаемое значение времени ожидания. Например, чтобы установить 5-минутный тайм-аут, вы должны добавить следующее:
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
+   - kube-apiserver
+   - --request-timeout=5m
    image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
    ...

Значение времени ожидания может быть указано в различных единицах измерения, например, в секундах (с), минутах (м) или часах (ч). Например, 30s, 5m и 1h являются допустимыми значениями времени ожидания.

  • Перезапустите kube-apiserver: сохраните изменения в файле конфигурации и перезапустите kube-apiserver, чтобы новая настройка времени ожидания вступила в силу. Это может варьироваться в зависимости от вашей настройки, но обычно kube-apiserver автоматически перезапускается, когда вы изменяете конфигурацию в каталоге /etc/kubernetes/manifests/.

Исходный код

Функциональность тайм-аута запроса в основном реализована в пакете k8s.io/apiserver. Вот несколько важных файлов исходного кода, связанных с тайм-аутом запроса:

  • k8s.io/apiserver/pkg/server/config.go: Этот файл содержит структуру Config, которая включает поле RequestTimeout, в котором хранится время ожидания запроса (https://github.com/kubernetes/apiserver/blob/master/pkg/server/config.go).
  • k8s.io/apiserver/pkg/server/filters/timeout.go: В этом файле реализована функция WithTimeoutForNonLongRunningRequests, которая применяет тайм-аут к непродолжительным запросам, используя контекст с тайм-аутом («https://github.com/kubernetes/apiserver/blob/master/pkg/server/filters/timeout .идти").
  • k8s.io/apiserver/pkg/server/options/server_run_options.go: этот файл содержит структуру ServerRunOptions, которая включает поле RequestTimeout, которое заполняется флагом командной строки --request-timeout (https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/ apiserver/pkg/server/options/server_run_options.go).

Пример тайм-аута запроса сервера API

Когда вы делаете запрос к API-серверу K8s, используя curl, и время запроса истекает, вы получите код состояния 504 Gateway Timeout и ответ JSON с сообщением об ошибке. Вот пример того, как может выглядеть вывод:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "Timeout: request did not complete within the allowed duration",
  "reason": "Timeout",
  "details": {},
  "code": 504
}

В этом примере показано, что запрос не выполнен из-за тайм-аута, на что указывают поля reason и поля code, содержащие код состояния 504.

Важно отметить, что ответ тайм-аута, подобный этому, может быть возвращен для любого запроса API K8s, который занимает больше времени, чем настроенная продолжительность тайм-аута. Если вы столкнулись с таким ответом, вам может потребоваться увеличить время ожидания запроса сервера API, оптимизировать запрос или обработать время ожидания в клиентском приложении (например, повторив запрос с экспоненциальной задержкой).

Заключение