OpenAPI'den Kubernetes API Delphi İstemcisi

Her Kubernetes kümesi kendi API'sini tanımlar ve sgcOpenAPI bu açıklamayı Delphi'den çağırdığınız bir Pascal birimine dönüştürür. Bu sayfalardaki herkese açık spesifikasyonların en büyüğü budur ve kaynak belge seçiminin sonucu gerçekten değiştirdiği tek örnektir, bu yüzden burada hangi uç noktadan üretmeniz gerektiğini ve bilinen iki sınırın ne olduğunu anlatıyoruz.

Kubernetes + sgcOpenAPI

Aşağıdaki her şey tahmin değildir, kod üreticisi Kubernetes spesifikasyonları üzerinde çalıştırılıp sonuç derlenerek ölçülmüştür.

Bundan üretin

/openapi/v3 altındaki grup başına OpenAPI 3 belgeleri, teker teker. Doğru bir istemci üreten yol budur.

Bundan üretmeyin

Toplu /openapi/v2 belgesi. Swagger 2.0'dır, dönüştürülür ve üretim yapar, ancak iki şey yanlış çıkar. Her ikisi de aşağıda anlatılıyor.

Kimlik doğrulama

-a 2 ile üretin ve Authentication.Token.BearerToken değerini atayın, bu da ServiceAccount belirtecini Authorization: Bearer olarak gönderir.

Temel URL

Kubernetes hiçbir sunucu adresi bildirmez, bu yüzden üretim sırasında -u https://cluster:6443 verin ya da çalışma zamanında SetBaseURL çağırın.

/openapi/v3 bir dizindir, belge değil

Anlaşılması gereken ilk şey budur. Bir küme tek bir OpenAPI 3 dosyası sunmaz. /openapi/v3 bir grup yolları listesi döndürür ve her grup ile sürüm, kendi URL'sinde ayrı bir belgedir.

# API grubu ve sürümü başına bir belge, standart bir kümede 65 tane
> sgcOpenAPI.exe -i "https://10.0.0.1:6443/openapi/v3/api/v1" \
      -o "k8s_core_v1.pas" -a 2 -u "https://10.0.0.1:6443"

File successfully created k8s_core_v1.pas

> sgcOpenAPI.exe -i "https://10.0.0.1:6443/openapi/v3/apis/apps/v1" \
      -o "k8s_apps_v1.pas" -a 2 -u "https://10.0.0.1:6443"

File successfully created k8s_apps_v1.pas

Bu şekilde üretildiğinde çekirdek grup, 42.705 satırlık bir birimde 113 yol, 248 metot ve 293 model sınıfı verir; apps grubu ise 17.061 satırda 38 yol, 77 metot ve 180 model sınıfı verir. Her ikisi de kütüphane yolunda sgcOpenAPI Source klasöründen başka hiçbir şey olmadan RAD Studio 12'de Win32 için sorunsuz derlenir. Grup başına bir birimle çalışmak, tek bir devasa birimle çalışmaktan da kolaydır ve yalnızca gerçekten çağırdığınız grupları üretirsiniz.

Aynı belgeler Kubernetes deposunda api/openapi-spec/v3/ altında yayınlanır, böylece canlı bir küme yerine sürüm denetimine alınmış bir dosyadan üretebilir ve sonucu da sürüm denetiminde tutabilirsiniz.

Bir namespace içindeki pod'ları listeleyin

Kubernetes işlem kimliklerini zaten geçerli tanımlayıcılar olarak yazar, bu yüzden üretilen metot adını spesifikasyondan aynen korur.

uses
  k8s_core_v1;   // az önce ürettiğiniz birim

procedure TfrmK8s.btnPodsClick(Sender: TObject);
var
  oResponse: TsgcOpenAPI_listCoreV1NamespacedPod_Response;
  oPod: TsgcOpenAPI_io_k8s_api_core_v1_Pod_Class;
begin
  GetOpenAPIClient.Authentication.Token.BearerToken := vToken;
  GetOpenAPIClient.SetBaseURL('https://10.0.0.1:6443');

  // aNamespace, aPretty, sonra bildirim sırasıyla sorgu parametreleri
  oResponse := GetOpenAPIClient.listCoreV1NamespacedPod('production',
    '', oapiBoolNull, '', '', 'app=api,tier=backend');
  try
    if oResponse.IsSuccessful then
      for oPod in oResponse.Successful.Items do
        memoLog.Lines.Add(Format('%-30s %s %s',
          [oPod.Metadata.Name, oPod.Status.Phase, oPod.Status.HostIP]))
    else
      memoLog.Lines.Add(IntToStr(oResponse.ResponseCode) + ' ' +
        oResponse.ResponseError);
  finally
    oResponse.Free;
  end;
end;

Model sınıfları tam Kubernetes adlarını taşır, bu yüzden bir pod, Metadata, Spec ve Status özelliklerine sahip TsgcOpenAPI_io_k8s_api_core_v1_Pod_Class olur, listesi ise tipli bir Items taşıyan TsgcOpenAPI_io_k8s_api_core_v1_PodList_Class olur. Kubernetes'in isteğe bağlı olarak bildirdiği mantıksal bir sorgu parametresi TsgcOpenAPIBoolean tipine dönüşür ve bunun oapiBoolNull değeri, parametrenin false olarak gönderilmesi yerine URL'den tümüyle çıkarılması anlamına gelir.

Bir deployment'ı ölçeklendirin

Kubernetes bir istek gövdesini adlandırılmış bir şemayla tanımladığında, ki genellikle öyle yapar, üretilen metot bir dize yerine tipli sınıfı alır.

uses
  k8s_apps_v1;

var
  oRead: TsgcOpenAPI_readAppsV1NamespacedDeploymentScale_Response;
  oWrite: TsgcOpenAPI_replaceAppsV1NamespacedDeploymentScale_Response;
begin
  oRead := GetOpenAPIClient.readAppsV1NamespacedDeploymentScale(
    'api', 'production');
  try
    if not oRead.IsSuccessful then
      raise Exception.Create(oRead.ResponseError);

    oRead.Successful.Spec.Replicas := 5;

    oWrite := GetOpenAPIClient.replaceAppsV1NamespacedDeploymentScale(
      'api', 'production', oRead.Successful);
    try
      memoLog.Lines.Add(IntToStr(oWrite.ResponseCode));
    finally
      oWrite.Free;
    end;
  finally
    oRead.Free;
  end;
end;

Kubernetes yüzeyinin tamamında dağılım neredeyse eşittir, istek gövdelerinin kabaca yarısı TsgcOpenAPI_io_k8s_api_autoscaling_v1_Scale_Class gibi tipli bir sınıf olarak, kabaca yarısı da dize olarak gelir; hangisi olacağı belgenin şemayı adlandırıp adlandırmadığına bağlıdır.

Üretilen birimler neler içerir

Birim, işaret ettiğiniz belgeyi birebir yansıtır, dolayısıyla kapsam tam olarak ürettiğiniz grup ve sürümdür.

İş yükleri

Deployment, StatefulSet, DaemonSet ve ReplicaSet için apis/apps/v1. Job ve CronJob için apis/batch/v1. Pod ve ReplicationController için api/v1.

Servisler ve ağ

Service, Endpoint, ConfigMap ve Secret için api/v1. Ingress ve NetworkPolicy için apis/networking.k8s.io/v1. EndpointSlice için apis/discovery.k8s.io/v1.

Depolama, RBAC ve politika

apis/storage.k8s.io/v1, apis/rbac.authorization.k8s.io/v1, apis/policy/v1 ve apis/admissionregistration.k8s.io/v1, her biri kendi belgesi ve kendi birimi.

Özel kaynaklar

CRD'leri kurulu bir küme onları kendi grup yollarında sunar, böylece /openapi/v3 adresindeki dizin onları yerleşik grupların yanında listeler ve aynı şekilde üretilirler.

Bir sınıf olarak her model

ObjectMeta, PodSpec, PodStatus, Container, koşul tipleri, liste tipleri. Yalnızca çekirdek grup bunlardan 293 tane üretir.

Spesifikasyondaki dokümantasyon

Kubernetes alan açıklamaları her metodun ve her özelliğin üstüne Pascal yorumları olarak gelir, birimlerin uzun olmasının büyük bir nedeni de budur.

Çalıştırdığımızda bulduklarımız

Bunlardan ikisi toplu Swagger 2.0 belgesine özgüdür ve bu sayfanın size bunun yerine grup başına üretmenizi söylemesinin nedeni de onlardır.

Yol düzeyindeki parametreler v2 belgesinden kaybolur

Kubernetes, namespace ve pretty parametrelerini yol öğesinde bir kez bildirir ve onlara bir $ref ile başvurur. /openapi/v2 üzerinden üretildiğinde bu ikisi metoda hiç ulaşmaz, bu yüzden listCoreV1NamespacedPod bir aNamespace argümanı olmadan gelir ve URL {namespace} yer tutucusunu korur. Aynı grup için /openapi/v3 belgesinden üretildiğinde argüman yerindedir. v3 belgelerini kullanın.

CRD grubu derlenmiyor

apis/apiextensions.k8s.io/v1, JSONSchemaProps.enum alanını hiçbir tip bildirmeyen bir şemanın dizisi olarak tanımlar, bu yüzden kod üreticisi TArray<> yazar ve derleyici bunu reddeder. Birimde iki satırdır. Bu grubu atlayın ya da toplu belgeyi, o 14 işlemi -x ve ayrıca -p parametrelerine vererek üretin; bu, sınıfı kaldırır ve birimin tamamı o zaman derlenir.

Toplu belge devasadır

602 yol, 1.202 metot ve yaklaşık 197.000 satır ile 13 MB'lık bir birim. Bir saniyenin altında okunup üretilir, ancak IDE düzenleyicisi bu boyuttaki bir dosyada yavaştır. Grup başına birimler bunun küçük bir kesridir, çekirdek grup için 42.705 satır ve apps için 17.061 satır.

Küme CA'sına güvenmek size kalmıştır

Çoğu küme kendinden imzalı bir CA kullanır, bu yüzden neye güvendiğinizi söyleyene kadar TLS el sıkışması başarısız olur. Üretilen istemci OnSSLVerifyPeer, OnSSLGetHandler ve OnSSLAfterCreateHandler olaylarını sunar, küme CA paketini kubeconfig dosyanızdan buraya kurarsınız.

Watch'lar numaralandırılabilir değildir

watch=true ve follow=true ile alınan bir konteyner günlüğü, uzun ömürlü parçalı yanıtlardır. Üretilen metot, yanıt sona erdiğinde dönen sıradan bir istektir, bu yüzden canlı bir watch, üretilen istemcinin sizin için akıttığı bir şey değil, TsgcHTTP1Client üzerine kurduğunuz bir şeydir.

Bağlı ServiceAccount belirteçlerinin süresi dolar

Kubernetes 1.21'den bu yana süre sınırlıdırlar. Küme içinden /var/run/secrets/kubernetes.io/serviceaccount/token dosyasını yeniden okuyun ya da dışarıdan TokenRequest API'sini çağırın ve Authentication.Token.BearerToken değerini yeniden atayın. İstemci, ona en son ne verdiyseniz onu tutar.

Blogdan

OpenAPI Delphi ayrıştırıcısı

Okuyucunun gerçek spesifikasyonları nasıl işlediği ve bir şeyi yerine getiremediğinde Warnings içine ne kaydettiği.

Yazıyı okuyun →

OpenAPI istemcisi ve ayrıştırıcısı

Üretilen istemciyi ve onun üzerine kurulduğu okuyucuyu tanıtan tamamlayıcı yazı.

Yazıyı okuyun →

sgcOpenAPI 2026.6

Güncel sürümün sürüm notları, üretici seçenekleri ve okuyucu değişiklikleriyle birlikte.

Yazıyı okuyun →
En avantajlı seçenek: All-AccessTüm eSeGeCe ürünleri, Premium Destek dahil, yılda €1,059'dan itibaren.
All-Access fiyatlarına bakın

Kubernetes'i bugün Delphi'den yönetin

sgcOpenAPI; okuyucuyu, kod üreticisini, OpenAPI sunucusunu ve Amazon, Azure, Google ile Microsoft için hazır SDK'leri sunar. Tek ürün, üç kademe, özelliğe göre değil kullanıcı başına fiyatlandırılır.