OpenAPI에서 Kubernetes API Delphi 클라이언트

모든 Kubernetes 클러스터는 OpenAPI 형식으로 API를 게시해요 — kubectl과 모든 공식 언어 클라이언트가 사용하는 동일한 설명. sgcOpenAPI를 사양에 가리키고 Pascal 애플리케이션이 일반 HTTPS API를 통해 파드를 나열하고, 디플로이먼트를 스케일링하고, 이벤트를 감시하고, 매니페스트를 적용할 수 있도록 하는 타입이 지정된 Delphi 유닛을 내보내세요.

Kubernetes + sgcOpenAPI

Kubernetes API 서버는 /openapi/v2에 자체 OpenAPI 2.0 문서를, /openapi/v3에 OpenAPI 3 문서를 노출해요. sgcOpenAPI는 둘 다 수락하고 공통 내부 모델로 변환해요.

소스 사양

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

인증

Bearer 토큰 / 클라이언트 인증서 / kubeconfig

생성된 유닛

sgcOpenAPI_Kubernetes

플랫폼

Windows, macOS, Linux, iOS, Android

클러스터에서 사양을 다운로드하고 생성하기

모든 클러스터는 자체 사양을 제공하므로 생성된 클라이언트는 해당 클러스터에 설치된 API 버전, CRD 및 집계된 API와 정확히 동기화돼요. 다른 버전을 지원하려면 다른 클러스터에 대해 재생성하세요.

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;

생성기는 Kubernetes API 그룹/버전당 하나의 클래스를 내보내요 — TsgcK8s_CoreV1, TsgcK8s_AppsV1, TsgcK8s_BatchV1, TsgcK8s_NetworkingV1, TsgcK8s_StorageV1, TsgcK8s_RbacV1 등 — 그리고 최상위 TsgcKubernetes 파사드도 함께요.

네임스페이스의 파드 나열하기

인증이 설정되면 세 줄. 결과는 공식 API 참조의 모든 컨테이너, 조건 및 상태 필드를 노출하는 항목이 있는 타입이 지정된 TsgcK8sPodList예요.

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;

디플로이먼트 스케일링 및 이벤트 감시

디플로이먼트 스케일링은 /scale 하위 리소스에 대한 PATCH예요. 이벤트 감시는 생성된 클라이언트가 타입이 지정된 enumerable로 노출하는 장기 HTTP/1.1 청크 GET이에요.

// 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;

생성된 유닛이 제공하는 것

사양이 클러스터에서 가져오기 때문에 해당 클러스터에 설치된 모든 API 그룹, 버전 및 CRD가 Delphi 유닛에 포함돼요.

워크로드

AppsV1 — 디플로이먼트, 스테이트풀셋, 데몬셋, 레플리카셋. BatchV1 — 잡, 크론잡. CoreV1 — 파드, 레플리케이션컨트롤러.

서비스 & 네트워킹

CoreV1 — 서비스, 엔드포인트, 컨피그맵, 시크릿. NetworkingV1 — 인그레스, 인그레스클래스, 네트워크폴리시. DiscoveryV1 — 엔드포인트슬라이스.

스토리지

StorageV1 — 스토리지클래스, 볼륨어태치먼트, CSIDrivers, CSINodes. CoreV1 — PersistentVolumes, PersistentVolumeClaims.

RBAC & 정책

RbacV1 — 롤, 롤바인딩, 클러스터롤, 클러스터롤바인딩. PolicyV1 — PodDisruptionBudgets. AdmissionRegistrationV1 — ValidatingWebhookConfigurations.

커스텀 리소스

클러스터에 설치된 CRD가 자동으로 표시돼요. Argo Rollouts, Cert Manager 인증서, Istio VirtualServices — 오퍼레이터가 OpenAPI 스키마를 등록한 경우 sgcOpenAPI가 타입이 지정된 클래스를 생성해요.

감시 + 로그 스트림

장기 실행 엔드포인트(watch=true, 컨테이너 로그 follow=true)는 서버가 플러시하는 즉시 타입이 지정된 이벤트를 yield하는 enumerable로 노출돼요.

주의할 세 가지

자체 서명된 CA 인증서

대부분의 클러스터는 자체 서명된 클러스터 CA를 사용해요. ~/.kube/config의 CA 번들을 CACertFile을 통해 제공하거나 InsecureSkipTLSVerify := True로 검증을 완전히 비활성화하세요 — 개발 클러스터에 유용하지만 프로덕션에는 절대 안 돼요.

ServiceAccount 토큰의 토큰 만료

바인딩된 ServiceAccount 토큰(Kubernetes 1.21부터 기본값)은 1시간 후에 만료돼요. 클러스터 내부에서 /var/run/secrets/kubernetes.io/serviceaccount/token을 다시 읽거나 외부에서 TokenRequest API를 호출하여 토큰을 새로 고치세요.

Server-Side Apply vs PATCH

최신 컨트롤러는 Content-Type: application/apply-patch+yaml이 있는 Server-Side Apply를 선호해요. 생성기는 두 헬퍼를 모두 내보내요 — 전통적인 strategic-merge 패치에는 PatchNamespacedDeployment를 사용하고 SSA에는 명시적인 Apply 메서드를 사용하세요.

블로그에서

OpenAPI Delphi 파서

파서가 Kubernetes 스타일 집계 API를 포함한 실제 OpenAPI 사양을 처리하는 방법.

게시물 읽기 →

OpenAPI 클라이언트 + 파서

클라이언트 래퍼와 파서 내부를 모두 소개하는 동반 게시물.

게시물 읽기 →

sgcOpenAPI 2026.6

sgcOpenAPI의 최신 릴리스 노트 — 새로운 생성기 옵션 및 파서 개선 사항.

게시물 읽기 →

오늘 Delphi에서 Kubernetes를 구동하세요

sgcOpenAPI는 파서, 코드 생성기, OpenAPI 서버 및 Amazon, Google, Microsoft 및 Azure SDK 번들을 출시해요 — 하나의 제품, 세 가지 등급.