Kubernetes "Failed Scheduling" -virheiden korjaaminen
Pod-aikatauluongelmat ovat yksi yleisimmistä Kubernetes-virheistä. On useita syitä, miksi uusi kotelo voi juuttua a Pending
tila kanssa FailedScheduling
hänen syykseen. Tämän tilan näyttävä pod ei käynnistä säilöjä, joten et voi käyttää sovellustasi.
Ajoitusongelmien aiheuttamat odottavat podit eivät yleensä käynnisty ilman manuaalista puuttumista. Sinun on löydettävä perimmäinen syy ja ryhdyttävä toimiin klusterin korjaamiseksi. Tässä artikkelissa opit diagnosoimaan ja korjaamaan tämän ongelman, jotta voit lisätä työmäärääsi.
yhteenveto
Epäonnistuneen ajoitusvirheen tunnistaminen
On normaalia, että paloissa näkyy a Pending
tilaksi hetkeksi sen jälkeen, kun olet lisännyt ne klusteriisi. Kubernetesin on ajoitettava säilön esiintymät solmuissasi, ja näiden solmujen on vedettävä kuva rekisteristään. Ensimmäinen merkki pod-aikataulun epäonnistumisesta on, kun se aina näkyy Pending
sen jälkeen, kun tavanomainen käynnistysaika on kulunut. Voit tarkistaa tilan suorittamalla Kubectl'sin get pods
tilattu:
$ kubectl get pods NIMI VALMIS TILA KÄYNNISSÄ UUDELLEEN IKÄ demo-pod 0/1 Odottaa 0 4m05s
demo-pod
yli neljä minuuttia, mutta se on edelleen Pending
Osavaltio. Pods ei yleensä vie niin kauan käynnistää säiliöitä, joten on aika alkaa tutkia, mitä Kubernetes odottaa.
Seuraava diagnostiikkavaihe on noutaa Podin tapahtumahistoria käyttämällä describe pod
tilattu:
$ kubectl kuvaa pod demo-pod ... Tapahtumat: Tyyppi Syy Ikä Lähettäjä Viesti ---- ------ ---- ---- ------- ... Varoitus Epäonnistunut Ajoitus 4 min oletus- ajastin 0/4 solmut ovat käytettävissä: 1 Liian monta podia, 3 Riittämätön suoritin.
Tapahtumaloki vahvistaa a FailedScheduling
virhe on syy laajennukseen Pending
Osavaltio. Tämä tapahtuma raportoidaan, kun Kubernetes ei pysty allokoimaan vaadittua määrää podeja yhdelle klusterin työntekijäsolmuista.
Tapahtumaviesti paljastaa, miksi ajoitus ei ole tällä hetkellä mahdollista: klusterissa on neljä solmua, mutta yksikään niistä ei voi ottaa podia. Kolmella solmulla on riittämätön suorittimen kapasiteetti, kun taas toinen on saavuttanut hyväksyttävien podien enimmäismäärän.
Epäonnistuneiden ajoitusvirheiden ja vastaavien ongelmien ymmärtäminen
Kubernetes voi ajoittaa podeja vain sellaisiin solmuihin, joilla on ylimääräisiä resursseja. Solmut, joiden suoritin tai muisti loppuvat, eivät voi enää ottaa koteloita. Podit voivat myös epäonnistua ajoituksessa, jos ne nimenomaisesti pyytävät enemmän resursseja kuin yksikään solmu pystyy tarjoamaan. Tämä pitää klusterin vakaana.
Kubernetes-ohjaustaso tietää, mitkä podit on jo varattu klusterin solmuille. Se käyttää näitä tietoja määrittääkseen solmujoukon, jotka voivat vastaanottaa uuden podin. Ajoitusvirhe tapahtuu, kun yhtään ehdokasta ei ole saatavilla, jolloin ryhmä jää jumiin Pending
kunnes kyky vapautuu.
Kubernetes ei välttämättä myöskään ajoita podeja muista syistä. Solmut voidaan katsoa kelpaamattomiksi isännöimään podia useilla tavoilla, vaikka niillä olisi riittävät järjestelmäresurssit:
- Järjestelmänvalvoja on saattanut lukita solmun estääkseen sitä vastaanottamasta uusia podeja ennen huoltotoimenpidettä.
- Solmulla voi olla vaikutus, joka estää podeja ajoittamasta. Solmu ei hyväksy podiasi, ellei sillä ole vastaavaa toleranssia.
- Kotelosi saattaa pyytää a
hostPort
joka on jo linkitetty solmuun. Solmut voivat tarjota vain tietyn portin numeron yhdelle Podille kerrallaan. - Kotelosi saattaa käyttää a
nodeSelector
tämä tarkoittaa, että se on ohjelmoitava tietyllä tunnisteella varustettuun solmuun. Merkitsemättömät solmut eivät ole kelvollisia. - Podiden ja solmujen affiniteetit ja anti-affiniteetit voivat olla epätyydyttäviä, mikä aiheuttaa ajoitusristiriidan, joka estää uusien ryhmien hyväksymisen.
- Podissa voi olla a
nodeName
kenttä, joka identifioi tietyn aikataulutettavan solmun. Pod on jumissa, jos tämä solmu on offline-tilassa tai ajoittamaton.
Se on vastuulla kube-scheduler
, Kubernetes-ajoitus, jotta nämä ehdot selviävät ja solmujoukot voidaan tunnistaa, jotka voivat isännöidä uutta podia. A FailedScheduling
Tapahtuma tapahtuu, kun yksikään solmu ei täytä ehtoja.
Aikataulu epäonnistui -tilan ratkaiseminen
Viesti näkyy vieressä FailedScheduling
yleensä paljastaa, miksi kukin klusterin solmu ei voinut ottaa podia vastaan. Voit käyttää näitä tietoja ongelman vianmäärityksen aloittamiseen. Yllä olevassa esimerkissä klusterissa oli neljä podia, joista kolme oli saavuttanut CPU-rajan ja yksi ylitti pod-määrärajan.
Klusterin kapasiteetti on tässä tapauksessa perimmäinen syy. Voit skaalata klusterisi uusilla solmuilla laitteiston kulutusongelmien ratkaisemiseksi ja lisäämällä resursseja, jotka tarjoavat lisää joustavuutta. Koska tämä lisää myös kustannuksiasi, kannattaa ensin tarkistaa, onko klusterissasi ylimääräisiä podeja. Käyttämättömien resurssien poistaminen vapauttaa kapasiteettia uusille.
Voit tarkistaa kussakin solmussasi käytettävissä olevat resurssit käyttämällä describe node
tilattu:
$ kubectl kuvaile solmun demo-solmu ... Allokoidut resurssit: (Kokonaisrajat voivat olla yli 100 prosenttia, eli ylisitovia.) Resurssipyyntörajat -------- -------- ---- -- prosessori 812m (90%) 202m (22%) muisti 905Mi (57%) 715Mi (45%) lyhytaikainen tallennus 0 (0%) 0 (0%) valtavat sivut - 2Mi 0 (0%) 0 (0%)
Tämän solmun podit vaativat jo 57 % käytettävissä olevasta muistista. Jos uusi pod pyysi 1 Gi:tä itselleen, solmu ei pystyisi hyväksymään ajoituspyyntöä. Näiden tietojen tarkkaileminen kunkin solmukohtaisesti voi auttaa sinua arvioimaan, onko klusterisi ylivarattu. On tärkeää, että sinulla on vapaata kapasiteettia siltä varalta, että jokin solmuistasi epäonnistuu ja sen työmäärät on ajoitettava toiseen.
Puuttuvista ajoitetuista solmuista johtuvat ajoitusvirheet näyttävät seuraavan kaltaisen viestin FailedScheduling
Tapahtuma:
0/4 solmua on saatavilla: 4 solmua ei ollut aikataulutettu
Solmut, joita ei voida ajoittaa, koska ne on silmukattu, sisältävät SchedulingDisabled
tilakentässään:
$ kubectl get nodes NIMI TILA ROOLIT IKÄ VERSIO solmu-1 Valmis,AjoitusPoistettu ohjaustaso, Master 26m v1.23.3
Voit poistaa solmun linkityksen, jotta se voi vastaanottaa uusia ryhmiä:
$ kubectl uncordon node-1 node/node-1 uncordoned
Kun solmut eivät ole suljettuja ja niillä on riittävästi resursseja, ajoitusvirheet johtuvat yleensä kontaminaatiosta tai virheestä nodeSelector
kenttä Podissasi. Jos käytät nodeSelector
varmista, että et ole tehnyt kirjoitusvirhettä ja että klusterissasi on podeja, joissa on määrittämäsi tunnisteet.
Kun solmut ovat saastuneet, varmista, että olet sisällyttänyt vastaavan toleranssin pod-luetteloon. Esimerkkinä tässä on solmu, joka on saastunut, joten palot eivät aikatauluta, ellei niillä ole demo-taint: allow
toleranssi:
$ kubectl tait nodes node-1 demo-taint=allow:NoSchedule
Muokkaa pod-luetteloita, jotta ne voivat ajoittaa solmuun:
tekniset tiedot: toleranssit: - avain: demo tait operaattori: Yhtä suuri arvo: sallia vaikutus: NoSchedule
Ratkaise ongelma, joka aiheuttaa FailedScheduling
tila sallii Kubernetesin jatkaa odottavien podien ajoittamista. Ne alkavat toimia automaattisesti pian sen jälkeen, kun ohjaustaso havaitsee muutokset solmuissasi. Sinun ei tarvitse käynnistää podeja uudelleen tai luoda uudelleen manuaalisesti, ellei ongelma johdu pod-luettelon virheistä, kuten virheellisestä affiniteettista tai nodeSelector
kenttiä.
yhteenveto
FailedScheduling
virheitä ilmenee, kun Kubernetes ei voi sijoittaa uutta ryhmää klusterin solmuun. Tämä johtuu usein siitä, että olemassa olevat solmut loppuvat laitteistoresursseista, kuten suorittimesta, muistista ja levystä. Kun näin on, voit korjata ongelman skaalaamalla klusterin sisältämään lisäsolmuja.
Ajoitusvirheitä esiintyy myös silloin, kun podit määrittävät solmuaffiniteetit, anti-affiniteetit ja valitsijat, joita klusterin käytettävissä olevat solmut eivät tällä hetkellä pysty täyttämään. Estetyt ja saastuneet solmut vähentävät Kubernetesin käytettävissä olevia vaihtoehtoja entisestään. Tämän tyyppiset ongelmat voidaan ratkaista tarkistamalla luetteloiden kirjoitusvirheet tarroissa ja poistamalla tarpeettomat rajoitukset.