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, оптимизировать запрос или обработать время ожидания в клиентском приложении (например, повторив запрос с экспоненциальной задержкой).