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ě.