Cliente Delphi de la API de Kubernetes desde OpenAPI

Cada cluster Kubernetes publica su API en formato OpenAPI — la misma descripción que consumen kubectl y cada cliente oficial de cualquier lenguaje. Apunta sgcOpenAPI a la spec y emite una unit Delphi tipada que permita a una aplicación Pascal listar pods, escalar deployments, observar eventos y aplicar manifiestos sobre la API HTTPS estándar.

Kubernetes + sgcOpenAPI

El API server de Kubernetes expone su propio documento OpenAPI 2.0 en /openapi/v2 y un documento OpenAPI 3 en /openapi/v3. sgcOpenAPI acepta ambos y los convierte a un modelo interno común.

Spec de origen

GET https://<cluster>/openapi/v3

Autenticación

Bearer token / certificado cliente / kubeconfig

Unit generada

sgcOpenAPI_Kubernetes

Plataformas

Windows, macOS, Linux, iOS, Android

Descarga la spec del cluster y genera

Cada cluster sirve su propia spec, lo que significa que el cliente generado está exactamente sincronizado con las versiones de API, CRDs y APIs agregadas instaladas en ese cluster. Regenera contra otro cluster para soportar una versión diferente.

uses
  sgcOpenAPI_Parser, sgcOpenAPI_Generator;

var
  vParser: TsgcOpenAPIParser;
  vGen: TsgcOpenAPIGenerator;
begin
  vParser := TsgcOpenAPIParser.Create(nil);
  try
    // Load directly from the cluster (mTLS or bearer)
    vParser.LoadFromURL('https://10.0.0.1:6443/openapi/v3',
      ['Authorization: Bearer ' + vToken]);

    Memo1.Lines.Add(Format('k8s spec: %d paths, %d schemas',
      [vParser.Paths.Count, vParser.Schemas.Count]));

    vGen := TsgcOpenAPIGenerator.Create(nil);
    try
      vGen.Parser := vParser;
      vGen.OutputUnit := 'sgcOpenAPI_Kubernetes';
      vGen.OutputFolder := 'C:\Generated\k8s';
      vGen.GroupBy := gbTag;
      vGen.Generate;
    finally
      vGen.Free;
    end;
  finally
    vParser.Free;
  end;
end;

El generador emite una clase por cada grupo/versión de la API de Kubernetes — TsgcK8s_CoreV1, TsgcK8s_AppsV1, TsgcK8s_BatchV1, TsgcK8s_NetworkingV1, TsgcK8s_StorageV1, TsgcK8s_RbacV1 y demás — más una fachada de alto nivel TsgcKubernetes.

Lista los pods de un namespace

Tres líneas una vez configurada la autenticación. El resultado es un TsgcK8sPodList tipado cuyos items exponen cada container, condición y campo de status de la referencia oficial de la API.

uses sgcOpenAPI_Kubernetes;

var
  vK8s: TsgcKubernetes;
  vPods: TsgcK8sPodList;
  vPod: TsgcK8sPod;
begin
  vK8s := TsgcKubernetes.Create(nil);
  try
    vK8s.Server := 'https://10.0.0.1:6443';
    vK8s.Token := vToken;
    vK8s.ClientCertFile := 'C:\kube\client.crt';
    vK8s.ClientKeyFile := 'C:\kube\client.key';
    vK8s.CACertFile := 'C:\kube\ca.crt';

    vPods := vK8s.CoreV1.ListNamespacedPod(
      Namespace := 'production',
      LabelSelector := 'app=api,tier=backend');
    try
      for vPod in vPods.Items do
        Memo1.Lines.Add(Format('%-30s  %s  node=%s',
          [vPod.Metadata.Name, vPod.Status.Phase, vPod.Spec.NodeName]));
    finally
      vPods.Free;
    end;
  finally
    vK8s.Free;
  end;
end;

Escala un deployment y observa eventos

Escalar un Deployment es un PATCH contra el sub-recurso /scale. Observar eventos es un GET HTTP/1.1 chunked de larga duración que el cliente generado expone como enumerable tipado.

// Scale "api" Deployment in "production" to 5 replicas
var
  vScale: TsgcK8sScale;
begin
  vScale := vK8s.AppsV1.ReadNamespacedDeploymentScale(
    Name := 'api', Namespace := 'production');
  try
    vScale.Spec.Replicas := 5;
    vK8s.AppsV1.ReplaceNamespacedDeploymentScale(
      Name := 'api', Namespace := 'production',
      Body := vScale);
  finally
    vScale.Free;
  end;

  // Watch events on Pods in the same namespace
  for vEvent in vK8s.CoreV1.WatchNamespacedPodList(
    Namespace := 'production',
    ResourceVersion := vPods.Metadata.ResourceVersion,
    TimeoutSeconds := 600) do
  begin
    Memo1.Lines.Add(Format('[%s] %s — %s',
      [vEvent.EventType, vEvent.&Object.Metadata.Name,
       vEvent.&Object.Status.Phase]));
  end;
end;

Lo que te da la unit generada

Como la spec se obtiene del cluster, cada grupo de API, versión y CRD instalados en ese cluster acaban en la unit Delphi.

Workloads

AppsV1 — Deployments, StatefulSets, DaemonSets, ReplicaSets. BatchV1 — Jobs, CronJobs. CoreV1 — Pods, ReplicationControllers.

Servicios y networking

CoreV1 — Services, Endpoints, ConfigMaps, Secrets. NetworkingV1 — Ingress, IngressClass, NetworkPolicy. DiscoveryV1 — EndpointSlices.

Almacenamiento

StorageV1 — StorageClasses, VolumeAttachments, CSIDrivers, CSINodes. CoreV1 — PersistentVolumes, PersistentVolumeClaims.

RBAC y políticas

RbacV1 — Roles, RoleBindings, ClusterRoles, ClusterRoleBindings. PolicyV1 — PodDisruptionBudgets. AdmissionRegistrationV1 — ValidatingWebhookConfigurations.

Recursos personalizados

Los CRDs instalados en tu cluster aparecen automáticamente. Argo Rollouts, Certificates de Cert Manager, VirtualServices de Istio — si el operador registró un esquema OpenAPI, sgcOpenAPI genera una clase tipada para él.

Watch + log streams

Los endpoints de larga duración (watch=true, log de contenedor follow=true) se exponen como enumerables que producen eventos tipados en cuanto el servidor los emite.

Tres cosas a vigilar

Certificados CA autofirmados

La mayoría de clusters usan una CA de cluster autofirmada. Aporta el bundle CA desde ~/.kube/config vía CACertFile o desactiva la verificación por completo con InsecureSkipTLSVerify := True — útil en clusters de desarrollo pero nunca en producción.

Caducidad de tokens de ServiceAccount

Los tokens bound de ServiceAccount (por defecto desde Kubernetes 1.21) caducan tras una hora. Refresca el token releyendo /var/run/secrets/kubernetes.io/serviceaccount/token desde dentro del cluster, o llamando a la API TokenRequest desde fuera.

Server-Side Apply frente a PATCH

Los controladores modernos prefieren Server-Side Apply con Content-Type: application/apply-patch+yaml. El generador emite ambos helpers — usa PatchNamespacedDeployment para los strategic-merge patches tradicionales y el método explícito Apply para SSA.

Desde el blog

Parser OpenAPI Delphi

Cómo el parser maneja especificaciones OpenAPI del mundo real — incluyendo APIs agregadas al estilo Kubernetes.

Leer post →

Cliente OpenAPI + parser

Post complementario que presenta tanto el wrapper de cliente como los internos del parser.

Leer post →

sgcOpenAPI 2026.6

Últimas notas de versión de sgcOpenAPI — nuevas opciones del generador y mejoras del parser.

Leer post →

Conduce Kubernetes desde Delphi hoy

sgcOpenAPI incluye el parser, generador de código, servidor OpenAPI y los bundles SDK de Amazon, Google, Microsoft y Azure — un producto, tres niveles.