Skip to content

K8sResource Base Class

The K8sResource class is the foundation for all Kubernetes resources in PHP K8s.

Overview

All Kubernetes resource classes (Pod, Deployment, Service, etc.) extend K8sResource, which provides:

  • Common attribute management
  • Cluster interaction methods
  • State tracking
  • CRUD operations foundation
  • Trait composition support

Class Definition

php
abstract class K8sResource
{
    protected static string $kind;
    protected static string $defaultVersion;
    protected static bool $namespaceable = true;

    protected array $attributes = [];
    protected ?KubernetesCluster $cluster = null;
}

Creating Resource Instances

Via K8s Facade

php
use RenokiCo\PhpK8s\K8s;

$pod = K8s::pod($cluster);
$deployment = K8s::deployment($cluster);
$service = K8s::service($cluster);

Direct Instantiation

php
use RenokiCo\PhpK8s\Kinds\K8sPod;

$pod = new K8sPod($cluster, [
    'metadata' => [
        'name' => 'my-pod',
        'namespace' => 'default',
    ],
    'spec' => [
        'containers' => [...]
    ]
]);

Common Methods

Attribute Management

php
// Set attribute
$pod->setAttribute('spec.containers.0.image', 'nginx:latest');

// Get attribute
$image = $pod->getAttribute('spec.containers.0.image');

// Set multiple attributes
$pod->setAttributes([
    'metadata.name' => 'my-pod',
    'metadata.namespace' => 'default',
]);

// Get all attributes
$attributes = $pod->getAttributes();

// To array
$array = $pod->toArray();

// To JSON
$json = $pod->toJson();

Metadata Methods

php
// Name
$pod->setName('my-pod');
$name = $pod->getName();

// Namespace
$pod->setNamespace('production');
$namespace = $pod->getNamespace();

// Labels
$pod->setLabels(['app' => 'web', 'env' => 'prod']);
$pod->addLabel('version', 'v1.0');
$labels = $pod->getLabels();
$value = $pod->getLabel('app');

// Annotations
$pod->setAnnotations(['key' => 'value']);
$pod->addAnnotation('description', 'My app pod');
$annotations = $pod->getAnnotations();

Resource Information

php
// API version
$apiVersion = $pod->getApiVersion();

// Kind
$kind = $pod->getKind();

// Resource version (from cluster)
$resourceVersion = $pod->getResourceVersion();

// UID (from cluster)
$uid = $pod->getUid();

// Creation timestamp
$created = $pod->getCreationTimestamp();

// Deletion timestamp (if being deleted)
$deleted = $pod->getDeletionTimestamp();

CRUD Operations

Create

php
$pod->create();

// Check if created
if ($pod->isSynced()) {
    echo "Pod created successfully";
}

Read

php
// Get by name
$pod = $cluster->getPodByName('my-pod', 'default');

// Refresh from cluster
$pod->refresh();

Update

php
// Modify and update
$pod->setReplicas(5);
$pod->update();

// Or use createOrUpdate for idempotency
$pod->createOrUpdate();

Delete

php
if ($pod->delete()) {
    echo "Pod deleted";
}

// With options
$pod->delete(
    query: ['pretty' => 1],
    gracePeriod: 30,
    propagationPolicy: 'Foreground'
);

State Tracking

php
// Check if resource has been synced with cluster
$pod->isSynced();  // true after create() or get()

// Check if resource exists in cluster
$pod->exists();

// Check sync status
if (!$pod->isSynced()) {
    $pod->create();
}

Patching

JSON Patch

php
use RenokiCo\PhpK8s\Patches\JsonPatch;

$patch = new JsonPatch();
$patch
    ->replace('/spec/replicas', 5)
    ->add('/metadata/labels/version', 'v2.0');

$deployment->jsonPatch($patch);

JSON Merge Patch

php
use RenokiCo\PhpK8s\Patches\JsonMergePatch;

$patch = new JsonMergePatch();
$patch
    ->set('spec.replicas', 5)
    ->set('metadata.labels.version', 'v2.0');

$deployment->jsonMergePatch($patch);

Watching

php
// Watch a specific resource
$pod->watch(function ($type, $pod) {
    echo "{$type}: {$pod->getName()}\n";
    return false; // Continue watching
});

Custom Resource Definition

Extending K8sResource

php
use RenokiCo\PhpK8s\Kinds\K8sResource;
use RenokiCo\PhpK8s\Contracts\InteractsWithK8sCluster;

class MyCRD extends K8sResource implements InteractsWithK8sCluster
{
    protected static $kind = 'MyCRD';
    protected static $defaultVersion = 'mygroup.io/v1';
    protected static $namespaceable = true;
}

Using Traits

php
use RenokiCo\PhpK8s\Traits\Resource\HasSpec;
use RenokiCo\PhpK8s\Traits\Resource\HasStatus;

class MyCRD extends K8sResource implements InteractsWithK8sCluster
{
    use HasSpec;
    use HasStatus;

    protected static $kind = 'MyCRD';
    protected static $defaultVersion = 'mygroup.io/v1';
}

Available Traits

Resources can use these traits for additional functionality:

  • HasSpec - Manage spec section
  • HasStatus - Read status section
  • HasMetadata - Labels, annotations, name, namespace
  • HasSelector - Label/field selectors
  • HasReplicas - Replica management
  • HasPodTemplate - Pod template spec
  • HasStorage - Storage configuration
  • HasAutoscaling - Autoscaling configuration

Macros

Add custom methods to resources:

php
use RenokiCo\PhpK8s\Kinds\K8sPod;

K8sPod::macro('changeDnsPolicy', function ($policy) {
    return $this->setAttribute('spec.dnsPolicy', $policy);
});

// Use the macro
$pod->changeDnsPolicy('ClusterFirst');

Protected Properties

Resource Definition

php
// The Kubernetes kind (e.g., 'Pod', 'Deployment')
protected static string $kind;

// Default API version (e.g., 'v1', 'apps/v1')
protected static string $defaultVersion;

// Whether resource is namespaced
protected static bool $namespaceable = true;

Instance Properties

php
// Resource attributes (metadata, spec, status, etc.)
protected array $attributes = [];

// Cluster connection
protected ?KubernetesCluster $cluster = null;

Example: Complete Resource Lifecycle

php
<?php

use RenokiCo\PhpK8s\K8s;
use RenokiCo\PhpK8s\KubernetesCluster;

$cluster = new KubernetesCluster('http://127.0.0.1:8080');

// Create resource
$configMap = K8s::configMap($cluster)
    ->setName('app-config')
    ->setNamespace('default')
    ->setLabels(['app' => 'myapp'])
    ->setData([
        'DATABASE_HOST' => 'mysql',
        'DATABASE_PORT' => '3306',
    ]);

// Check state before creation
echo "Synced: " . ($configMap->isSynced() ? 'Yes' : 'No') . "\n";  // No
echo "Exists: " . ($configMap->exists() ? 'Yes' : 'No') . "\n";    // No

// Create in cluster
$configMap->create();

// Check state after creation
echo "Synced: " . ($configMap->isSynced() ? 'Yes' : 'No') . "\n";  // Yes
echo "Exists: " . ($configMap->exists() ? 'Yes' : 'No') . "\n";    // Yes

// Get resource information
echo "Name: {$configMap->getName()}\n";
echo "Namespace: {$configMap->getNamespace()}\n";
echo "UID: {$configMap->getUid()}\n";
echo "Created: {$configMap->getCreationTimestamp()}\n";
echo "Resource Version: {$configMap->getResourceVersion()}\n";

// Modify
$configMap->setData(['NEW_KEY' => 'new_value']);
$configMap->update();

// Convert to array
$array = $configMap->toArray();
print_r($array);

// Convert to JSON
$json = $configMap->toJson();
echo $json;

// Delete
$configMap->delete();

See Also


API reference for the K8sResource base class in cuppett/php-k8s fork

Released under the Apache-2.0 License. Originally from renoki-co/php-k8s.