Cliente Delphi para a API do Kubernetes a partir do OpenAPI

Todo cluster Kubernetes publica sua API em formato OpenAPI — a mesma descrição que o kubectl e todos os clientes oficiais de linguagem consomem. Aponte o sgcOpenAPI para a spec e gere uma unit Delphi tipada que permite a uma aplicação Pascal listar pods, escalar deployments, observar eventos e aplicar manifests sobre a API HTTPS habitual.

Kubernetes + sgcOpenAPI

O servidor de API do Kubernetes expõe seu próprio documento OpenAPI 2.0 em /openapi/v2 e um documento OpenAPI 3 em /openapi/v3. O sgcOpenAPI aceita os dois e os converte para um modelo interno comum.

Spec de origem

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

Auth

Bearer token / certificado de cliente / kubeconfig

Unit gerada

sgcOpenAPI_Kubernetes

Plataformas

Windows, macOS, Linux, iOS, Android

Baixe a spec do cluster e gere

Todo cluster serve sua própria spec, o que significa que o cliente gerado está exatamente em sincronia com as versões de API, CRDs e APIs agregadas instaladas naquele cluster. Regenere contra outro cluster para suportar outra versão.

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;

O gerador emite uma classe por grupo/versão de API do Kubernetes — TsgcK8s_CoreV1, TsgcK8s_AppsV1, TsgcK8s_BatchV1, TsgcK8s_NetworkingV1, TsgcK8s_StorageV1, TsgcK8s_RbacV1 e assim por diante — mais uma fachada de topo TsgcKubernetes.

Liste pods em um namespace

Três linhas depois que a autenticação está configurada. O resultado é um TsgcK8sPodList tipado cujos itens expõem cada container, condition e campo de status da referência oficial da 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;

Escale um deployment e observe eventos

Escalar um Deployment é um PATCH no sub-resource /scale. Observar eventos é um GET HTTP/1.1 em chunked de longa duração que o cliente gerado expõe como um enumerável 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;

O que a unit gerada entrega

Como a spec é buscada do cluster, todo grupo de API, versão e CRD instalado naquele cluster acaba na unit Delphi.

Workloads

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

Services & networking

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

Storage

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

RBAC & policy

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

Custom resources

CRDs instalados no seu cluster aparecem automaticamente. Argo Rollouts, Cert Manager Certificates, Istio VirtualServices — se o operator registrou um schema OpenAPI, o sgcOpenAPI gera uma classe tipada.

Streams de watch + log

Endpoints de longa duração (watch=true, container log follow=true) são expostos como enumeráveis que produzem eventos tipados assim que o servidor faz flush.

Três coisas a observar

Certificados de CA autoassinados

A maioria dos clusters usa uma CA autoassinada. Forneça o bundle da CA de ~/.kube/config via CACertFile ou desative a verificação completamente com InsecureSkipTLSVerify := True — útil em clusters de desenvolvimento, nunca em produção.

Expiração de tokens de ServiceAccount

Tokens de ServiceAccount com bound (o padrão desde o Kubernetes 1.21) expiram em uma hora. Renove o token relendo /var/run/secrets/kubernetes.io/serviceaccount/token de dentro do cluster, ou chamando a API TokenRequest de fora.

Server-Side Apply vs PATCH

Controllers modernos preferem Server-Side Apply com Content-Type: application/apply-patch+yaml. O gerador emite ambos os helpers — use PatchNamespacedDeployment para patches strategic-merge tradicionais e o método explícito Apply para SSA.

Do blog

Parser OpenAPI Delphi

Como o parser lida com specs OpenAPI do mundo real — incluindo as APIs agregadas estilo Kubernetes.

Leia o post →

Cliente OpenAPI + parser

Post complementar que apresenta tanto o wrapper de cliente quanto os internos do parser.

Leia o post →

sgcOpenAPI 2026.6

Release notes mais recentes do sgcOpenAPI — novas opções de gerador e melhorias no parser.

Leia o post →

Dirija o Kubernetes a partir do Delphi hoje

O sgcOpenAPI entrega o parser, o gerador de código, o servidor OpenAPI e os bundles dos SDKs Amazon, Google, Microsoft e Azure — um produto, três tiers.