ELOS Technologies Blog

Kubernetes: API Priority and Fairness

Written by Jan Nevěděl | 21.10.2020 17:37:22

Aneb z deníku Openshift architekta a implementátora.

Aktuálně jsme s podporou firmy Red Hat řešili problém občasné nedostupnosti API serveru Openshiftu 4.5. Řešitelná byla pouze restartem. Jednalo se o situaci, kdy byl cluster operator openshift-apiserver ve stavu degraded a server samotný vracel velké množství chyb “503 (the server is currently unable to handle the request)”.

Při hledání řešení jsme se soustředili na novou vlastnost Kubernetes API serveru - v jeho nastavení totiž přibyla tzv. feature gate APIPriorityAndFairness=true:

$ oc rsh kube-apiserver-beta-bpsht-master-1 cat /etc/kubernetes/static-pod-resources/configmaps/config/config.yaml
...
    "feature-gates": [
      "APIPriorityAndFairness=true",
      "RotateKubeletServerCertificate=true",
      "SupportPodPidsLimit=true",
      "NodeDisruptionExclusion=true",
      "ServiceNodeExclusion=true",
      "SCTPSupport=true",
      "LegacyNodeRoleBehavior=false"
    ],

...

Jedná se o dlouho očekávanou funkcionalitu umožňující administrátorům optimalizovat a prioritizovat zpracování REST API požadavků podle definovaných pravidel. To se hodí především v situaci, kdy je API server pod natolik velkým náporem API requestů, že je de-facto vyřazen z provozu (např. logická chyba v kódu operátora chrlícího API požadavky). Služby platformy mohou být v tomto případě částečně paralizovány, protože její jednotlivé komponenty nejsou schopny komunikovat s control plane.

Kubernetes API server nyní za tímto účelem disponuje novou skupinou API objektů flowcontrol.apiserver.k8s.io/v1alpha1, mezi něž patří také objekt FlowSchema:

[jan.nevedel@brtnik-x1 OpenShift]$ oc --kubeconfig kubeconfig-beta get flowschema 
NAME                                PRIORITYLEVEL                             MATCHINGPRECEDENCE   DISTINGUISHERMETHOD   AGE   MISSINGPL
exempt                              exempt                                    1                    <none>                72d   False
system-leader-election              leader-election                           100                  ByUser                72d   False
...
global-default                      global-default                            9900                 ByUser                72d   False
catch-all                           catch-all                                 10000                ByUser                72d   False

Objekt FlowSchema definuje pravidla, na jejichž základě API server prioritizuje příchozí požadavky a zpracovává přednostně ty s vyšší prioritou. I při vysokém objemu příchozích požadavků tedy API server zůstává dostupný pro kritické komponenty platformy.

Detaily implementace jsou dobře popsány přímo v dokumentaci Kubernetes na této adrese: https://kubernetes.io/docs/concepts/cluster-administration/flow-control/ .

Výsledkem naší komunikace s podporou Red Hatu byl patch, který upravuje právě pravidla pro API Priority and Fairness. Nasazení na testovacích prostředích proběhlo dnes, efekt budeme vyhodnocovat na konci týdne. V situacích jako je tato jsme rádi, že zákazník zvolil Kubernetes platformu od solidního vendora, se kterým jsme schopni vzniklé problémy řešit. Ačkoliv jde o důležitou novou vlastnost Kubernetes API serveru, s modifikací defaultních pravidel je zapotřebí zacházet velmi opatrně.