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

Заключение