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