DevOps в серията K8s bootcamp
NЗабележка, пълната мисловна карта „DevOps в K8s“ е достъпна на: „DevOps в мисловната карта на K8s“
Верига за обработка на заявки за API сървър
По-долу е дадена диаграма на веригата манипулатори на API сървъра:
В тази статия ще се съсредоточим върху „времето за изчакване на заявката“.
Време за изчакване на заявката за API сървър
Какво е таймаут на заявката
В K8s времето за изчакване на заявката за API сървър (60 секунди по подразбиране) се отнася до продължителността, след която API заявка към API сървъра на K8s ще бъде прекратена, ако не е завършена. С други думи, това е максималното време, през което API сървърът ще изчака дадена заявка да бъде обработена, преди да я приеме за неуспешна заявка.
Тази стойност на изчакване може да бъде конфигурирана в зависимост от нуждите на вашата конкретна среда или сложността на извършваните операции. Може да са необходими по-дълги изчаквания за определени заявки, които отнемат повече време за обработка, докато по-кратките изчаквания могат да помогнат за предотвратяване на прекомерно изчакване на неотговарящи заявки.
Ако дадена заявка изтече, клиентите ще получат грешка и може да се наложи да опитат отново заявката или да се справят с неуспеха по съответния начин. Правилното конфигуриране на стойността за изчакване е важно, за да се гарантира безпроблемната работа на вашия клъстер Kubernetes и неговите компоненти.
Как да актуализирате времето за изчакване на заявката
За да конфигурирате времето за изчакване на заявката за K8s API сървър, можете да промените флаговете на командния ред на 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 ...
Стойността на времето за изчакване може да бъде зададена в различни единици, като секунди (s), минути (m) или часове (h). Например 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 сървъра, да оптимизирате заявката или да обработите времето за изчакване във вашето клиентско приложение (напр. като опитате отново заявката с експоненциално забавяне).