NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Kubernetes API for Laravel

Patch, scale, rollout a dry-run

patch() pošle cielenú zmenu s Content-Type zvolenej stratégie a vráti aktualizovaný zdroj — bez cyklu načítať, upraviť, zapísať:

use RoundlyConsulting\KubernetesApi\DataTransferObjects\KubernetesPatch;

// Strategic merge patch
$cluster->deployments()->setNamespace('shop')->withName('checkout')
    ->patch(KubernetesPatch::strategicMerge(['spec' => ['replicas' => 4]]));

// JSON merge patch
$cluster->deployments()->setNamespace('shop')->withName('checkout')
    ->patch(KubernetesPatch::merge(['spec' => ['paused' => true]]));

// JSON Patch — a list of operations
$cluster->deployments()->setNamespace('shop')->withName('checkout')
    ->patch(KubernetesPatch::json([
        ['op' => 'replace', 'path' => '/spec/replicas', 'value' => 6],
        ['op' => 'add', 'path' => '/metadata/labels/release', 'value' => 'v1.4.0'],
    ]));

Server-side apply

KubernetesPatch::apply() pošle telo ako JSON s typom obsahu application/apply-patch+yaml (JSON je platný YAML). Každý zápis nesie vaše meno managera ako fieldManager; server-side apply bez neho použije kubernetes-api-for-laravel. force: true pošle force=true — vždy len pri server-side apply —, aby ste prevzali polia iného managera namiesto zlyhania s konfliktom 409:

use RoundlyConsulting\KubernetesApi\DataTransferObjects\KubernetesPatch;

// Server-side apply: sent with your manager name as fieldManager. force: true takes over
// fields another manager owns instead of failing with a 409 conflict.
$cluster->deployments()->setNamespace('shop')->withName('checkout')->patch(
    KubernetesPatch::apply([
        'apiVersion' => 'apps/v1',
        'kind' => 'Deployment',
        'metadata' => ['name' => 'checkout', 'namespace' => 'shop'],
        'spec' => ['replicas' => 4],
    ], force: true),
);

// A fieldManager in the query array wins over the manager name.
$cluster->deployments()->setNamespace('shop')->withName('checkout')->patch(
    KubernetesPatch::apply(['apiVersion' => 'apps/v1', 'kind' => 'Deployment', 'metadata' => ['name' => 'checkout']]),
    ['fieldManager' => 'shop-app'],
);

Typy patchov

Každá stratégia je prípad enumu PatchType, ktorého hodnotou je jej Content-Type. Enum má spoločné pomocné metódy z enums-for-laravel — praktické, keď stratégia prichádza zo vstupu používateľa:

use RoundlyConsulting\KubernetesApi\DataTransferObjects\KubernetesPatch;
use RoundlyConsulting\KubernetesApi\Enums\PatchType;

PatchType::StrategicMerge->contentType(); // 'application/strategic-merge-patch+json'
PatchType::StrategicMerge->label();       // 'Strategic Merge'
PatchType::values();                      // the four content types
PatchType::toOptions();                   // content type => label, for a select input
PatchType::validationRule();              // 'in:application/strategic-merge-patch+json,…'
PatchType::fromName('Json');              // PatchType::Json

// Build a patch from validated input
$patch = new KubernetesPatch(PatchType::from($request->input('type')), $request->input('body'));

Škálovanie a rollout restart

scale() zmení spec.replicas merge patchom cez subresource /scale a vráti odpoveď apiservera Scale — DTO s name, namespace, replicas (želaný stav), currentReplicas (pozorovaný stav), selector a resourceVersion —, nie samotný workload; ten získate cez find(). rolloutRestart() zapíše do šablóny podu anotáciu kubectl.kubernetes.io/restartedAt s aktuálnym časom — presne ako kubectl rollout restart:

// Scale via the /scale subresource. Returns the apiserver's Scale answer (a DTO), not the
// Deployment: $scale->replicas (desired), ->currentReplicas (observed), ->selector.
$scale = $cluster->deployments()->setNamespace('shop')->withName('checkout')->scale(5);
$cluster->statefulSets()->setNamespace('shop')->withName('search')->scale(3);

// Roll the pods by stamping the restartedAt annotation (like kubectl rollout restart).
$cluster->deployments()->setNamespace('shop')->withName('checkout')->rolloutRestart();
$cluster->daemonSets()->setNamespace('monitoring')->withName('node-agent')->rolloutRestart();

// Validate a write without persisting it by appending ?dryRun=All.
$preview = $cluster->deployments()->setNamespace('shop')->withName('checkout')->dryRun()->scale(5);
  • scale() — deploymenty, replica sety, stateful sety a replication controllery.
  • rolloutRestart() — deploymenty, stateful sety a daemon sety.
  • dryRun() pridá dryRun=All ku každému nasledujúcemu zápisu — create, update, updateOrCreate, patch, delete, scale aj rolloutRestart — takže apiserver požiadavku overí a vráti výsledok bez uloženia. dryRun(false) režim opäť vypne.

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 kryptomien

Odoslaní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.