Výpisy, stránkovanie a watch
Filtrovanie nechajte na apiserveri namiesto sťahovania všetkého. Metódy selektorov skladajú parametre labelSelector a fieldSelector a dajú sa ľubovoľne reťaziť — viac selektorov sa spojí čiarkou:
use RoundlyConsulting\KubernetesApi\Resources\Pod;
// Label and field selectors build the labelSelector / fieldSelector query params.
$pods = $cluster->pods()
->setNamespace('shop')
->whereLabel('app', 'checkout')
->whereLabelIn('tier', ['web', 'api'])
->whereLabelExists('team')
->whereLabelMissing('canary')
->whereField('status.phase', 'Running')
->limit(100)
->get();
$pods->map(fn (Pod $pod): string => $pod->getName());| Metóda | Posiela |
|---|---|
whereLabel('app', 'web') | labelSelector=app=web |
whereLabelNot('tier', 'cache') | tier!=cache |
whereLabelIn('zone', ['a', 'b']) | zone in (a,b) |
whereLabelNotIn('zone', ['c']) | zone notin (c) |
whereLabelExists('team') | team |
whereLabelMissing('deprecated') | !deprecated |
whereField('status.phase', 'Running') | fieldSelector=status.phase=Running |
whereFieldNot('status.phase', 'Failed') | status.phase!=Failed |
limit(100) · continueFrom($token) | limit=100 · continue=<token> |
allNamespaces() | Vypisuje z celoklastrovej cesty namiesto jedného namespace. |
Stránkovanie a lenivá iterácia
limit() obmedzí veľkosť stránky a getPage() vráti ResourcePage s položkami a stránkovacími metadátami apiservera. lazy() a each() za vás sledujú continue tokeny a v pamäti držia vždy len jednu stránku — veľkosť stránky nastavíte cez limit():
use RoundlyConsulting\KubernetesApi\Resources\Pod;
// List across every namespace.
$all = $cluster->pods()->allNamespaces()->whereLabel('app', 'checkout')->get();
// Page explicitly with a continue token.
$page = $cluster->pods()->setNamespace('shop')->limit(50)->getPage();
$page->items; // ResourcesCollection
$page->continue; // ?string — pass to ->continueFrom(...) for the next page
$page->remainingItemCount; // ?int
$page->hasMore(); // bool
if ($page->hasMore()) {
$next = $cluster->pods()->setNamespace('shop')->limit(50)->continueFrom($page->continue)->getPage();
}
// Or iterate every item lazily, auto-following continue tokens.
foreach ($cluster->pods()->allNamespaces()->limit(200)->lazy() as $pod) {
// one page in memory at a time
}
$cluster->pods()->allNamespaces()->limit(200)->each(function (Pod $pod): void {
// ...
});Sledovanie zmien
watch() otvorí streamované sledovanie nad tým istým výpisom — platia selektory aj allNamespaces() — a pri každej zmene zavolá váš callback s objektom WatchEvent, kým sa spojenie neukončí. Druhý argument pridá k požiadavke parametre dotazu:
use RoundlyConsulting\KubernetesApi\DataTransferObjects\WatchEvent;
$cluster->pods()
->setNamespace('shop')
->whereLabel('app', 'checkout')
->watch(function (WatchEvent $event): void {
$event->type; // ADDED / MODIFIED / DELETED
$event->object; // the Pod resource
if ($event->isDeleted()) {
logger()->warning("Pod {$event->object->getName()} was deleted");
}
});WatchEvent vystavuje type a object a k tomu isAdded(), isModified() a isDeleted(). Každá udalosť sa dostane do callbacku hneď, ako ju apiserver pošle, a watch() skončí, keď sa stream uzavrie:
- keď sledovanie uzavrie apiserver — robí to po vlastnom timeoute, zvyčajne po 30 – 60 minútach;
- po client.stream_timeout sekundách ticha, ak ho nastavíte (predvolená 0 čaká neobmedzene).
Timeout požiadavky v client.options ohraničuje len pripojenie a hlavičky odpovede. Spojenie prerušené uprostred streamu vyhodí ConnectionException od Laravelu. Dlhodobé sledovanie patrí do úloh vo fronte alebo konzolových príkazov, nie do webových požiadaviek — ak má bežať neustále, otvárajte ho znova v cykle.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.