Ana içeriğe geç

Python Yapılandırması New v0.0.88

Python Task (type 23), Execution host'unun Python appsettings bölümü ile yapılandırılır. Tüm değerler standart .NET configuration provider'ları ve Python__Enabled, Python__DefaultMode gibi environment variable'lar ile override edilebilir (iç içe alanlar için __ ayracı kullanılır, örn. Python__Process__MaxConcurrency).

Kaynak dosya: execution/BBT.Workflow.Execution.HttpApi.Host/appsettings.json.

Örnek Yapılandırma

{
"Python": {
"Enabled": false,
"DefaultMode": "pythonNet",
"EnabledModes": ["pythonNet", "process"],
"MaxTimeoutSeconds": 50,
"MaxCodeBytes": 262144,
"MaxInputBytes": 2097152,
"MaxOutputBytes": 2097152,
"MaxStdoutBytes": 32768,
"MaxStderrBytes": 32768,
"AllowedModules": ["*"],
"PythonNet": {
"PythonDll": "libpython3.12.so.1.0",
"PythonHome": "/usr",
"PythonPath": "/opt/vnext-python/venv/lib/python3.12/site-packages",
"RunnerDirectory": "/opt/vnext-python",
"MaxConcurrency": 1
},
"Process": {
"PythonExecutable": "/opt/vnext-python/venv/bin/python",
"RunnerPath": "/opt/vnext-python/runner.py",
"MaxConcurrency": 2,
"UsePrlimit": true,
"PrlimitExecutable": "/usr/bin/prlimit",
"MemoryBytes": 4294967296,
"CpuTimeSeconds": 45,
"OpenFiles": 256
},
"Container": {
"Driver": "docker",
"Endpoint": "unix:///var/run/docker.sock",
"ApiVersion": "v1.43",
"Image": "ghcr.io/burgan-tech/vnext/python-runner:latest",
"PullPolicy": "ifNotPresent",
"NetworkMode": "none",
"MaxConcurrency": 2,
"MemoryBytes": 2147483648,
"NanoCpus": 1000000000,
"PidsLimit": 128,
"TmpfsBytes": 67108864,
"Kubernetes": {
"Namespace": "default",
"ContainerName": "python-runner",
"RunnerServiceAccountName": null,
"ImagePullSecrets": [],
"PodStartTimeoutSeconds": 30,
"PollIntervalMilliseconds": 250,
"JobTtlSecondsAfterFinished": 60,
"RuntimeClassName": null
}
}
}
}

Kök Alanlar

AlanTipVarsayılanAçıklama
EnabledbooleanfalsePython task yürütmesini global olarak açar/kapatır
DefaultModestringpythonNetTask executionMode belirtmediğinde kullanılacak mod
EnabledModesstring[]["pythonNet", "process"]Kullanılabilir modların açık listesi. DefaultMode, Enabled=true iken bu listede bulunmak zorundadır; aksi halde başlangıçta doğrulama hatası verir
MaxTimeoutSecondsinteger50Task'ın timeoutSeconds alanı için üst sınır; 1–50 aralığında olmalıdır
MaxCodeBytesinteger262144 (256 KiB)Decode edilmiş Python kaynak kodu boyut sınırı
MaxInputBytesinteger2097152 (2 MiB)config.input boyut sınırı
MaxOutputBytesinteger2097152 (2 MiB)main() dönüş değeri boyut sınırı
MaxStdoutBytesinteger32768 (32 KiB)Yakalanan stdout sınırı
MaxStderrBytesinteger32768 (32 KiB)Yakalanan stderr sınırı
AllowedModulesstring[]["*"]İzinli Python modülleri — paylaşılan runner bootstrap'ı tarafından her modda (dinamik import'lar dahil) uygulanır. Yönetişim politikasıdır, güvenlik sınırı değildir

PythonNet

AlanTipVarsayılanAçıklama
PythonDllstringlibpython3.12.so.1.0Yüklenecek CPython paylaşımlı kütüphanesi
PythonHomestring?/usrPYTHONHOME
PythonPathstring?/opt/vnext-python/venv/lib/python3.12/site-packagesPYTHONPATH
RunnerDirectorystring/opt/vnext-pythonRunner script dizini
MaxConcurrencyinteger1Eşzamanlı pythonNet çağrı sınırı (GIL nedeniyle düşük tutulur)

Process

AlanTipVarsayılanAçıklama
PythonExecutablestring/opt/vnext-python/venv/bin/pythonpython -I runner.py için yürütülebilir dosya
RunnerPathstring/opt/vnext-python/runner.pyRunner script yolu
MaxConcurrencyinteger2Eşzamanlı process sınırı
UsePrlimitbooleantrueLinux'ta CPU/adres-alanı/açık-dosya limitleri için prlimit kullanımı
PrlimitExecutablestring/usr/bin/prlimitprlimit binary yolu
MemoryBytesinteger (long)4294967296 (4 GiB)Adres-alanı limiti
CpuTimeSecondsinteger45CPU zaman limiti
OpenFilesinteger256Açık dosya sayısı limiti

Container

AlanTipVarsayılanAçıklama
Driverstringdockerdocker veya kubernetes
Endpointstringunix:///var/run/docker.sockDocker Engine endpoint'i (Docker driver)
ApiVersionstringv1.43Docker Engine API versiyonu
Imagestringghcr.io/burgan-tech/vnext/python-runner:latestRunner container image'ı
PullPolicystringifNotPresentImage çekme politikası
NetworkModestringnoneContainer network modu
MaxConcurrencyinteger2Eşzamanlı container sınırı
MemoryBytesinteger (long)2147483648 (2 GiB)Container bellek limiti
NanoCpusinteger (long)1000000000 (1 CPU)Container CPU limiti
PidsLimitinteger (long)128Container PID limiti
TmpfsBytesinteger (long)67108864 (64 MiB)/tmp tmpfs boyutu
ClientCertificatePathstring?nullDocker TLS client sertifikası (yalnızca Docker driver)
ClientCertificatePasswordstring?nullDocker TLS client sertifika şifresi
CaCertificatePathstring?nullDocker TLS CA sertifikası

Container driver varsayılan olarak non-root UID/GID 65532, read-only root filesystem, düşürülmüş capability'ler, no-new-privileges ve host mount yasağı ile çalışır. Container çalıştırma opt-in'dir; normal geliştirme Compose dosyası Docker socket'ini mount etmez — yalnızca açıkça onaylanmış bir ortamda etc/docker/docker-compose.python-container.yml kullanılmalıdır.

Container.Kubernetes

AlanTipVarsayılanAçıklama
NamespacestringdefaultJob/Pod'ların oluşturulacağı namespace
KubeConfigPathstring?nullKubeconfig dosya yolu (in-cluster çalışırken gerekmez)
Contextstring?nullKubeconfig context adı
ContainerNamestringpython-runnerPod içindeki container adı
RunnerServiceAccountNamestring?nullImage-pull veya admission policy amaçlı service account (runner pod'unun kendi token mount'u her zaman kapalıdır)
ImagePullSecretsstring[][]Image pull secret adları
PodStartTimeoutSecondsinteger30Pod başlatma zaman aşımı
PollIntervalMillisecondsinteger250Job/Pod durumu polling aralığı
JobTtlSecondsAfterFinishedinteger60Job'un tamamlanma sonrası TTL'i (ek güvence; asıl silme finally bloğunda yapılır)
RuntimeClassNamestring?nullKullanılacak RuntimeClass

Kubernetes driver, invocation başına bir batch/v1 Job oluşturur (backoffLimit: 0), JSON girdiyi pods/attach streaming API'si ile gönderir (ConfigMap/Secret/env/command-line kullanmaz), stdout/stderr'i ayrı okur, ardından Job'u finally içinde siler. Runner pod'unda automountServiceAccountToken: false her zaman geçerlidir. Kubernetes taşınabilir bir per-Pod PID limiti sunmadığı için PidsLimit yalnızca politika metadata'sı olarak Job üzerine yazılır — asıl uygulama node/container runtime veya uyumlu bir admission/runtime politikasına bırakılır.

RBAC

Execution servisinin Kubernetes'te namespace-scoped Job (create/get/list/watch/delete), Pod (get/list/watch) ve pods/attach (create/get) izinlerine ihtiyacı vardır. Bu RBAC kaynakları (ServiceAccount, Role, RoleBinding) vnext-helm-charts reposundaki Helm chart'tan gelir — bu repo bunları sağlamaz.

Timeout Bütçe Hiyerarşisi

Başlangıçta doğrulanan (WorkflowExecutionOptionsValidator, fail-fast) katmanlı bütçe kuralı:

Python:MaxTimeoutSeconds < ExecutionApi:InvocationTimeoutSeconds < WorkflowExecution:TransitionJobTimeoutSeconds < (chain lock lease)
  • Python:MaxTimeoutSeconds, Dapr çağrısının Python cleanup'ından ve response propagation'ından daha kısa olmalıdır → ExecutionApi:InvocationTimeoutSeconds'tan küçük olmak zorunda.
  • ExecutionApi:InvocationTimeoutSeconds, tek bir task invocation'ının tüm job yürütme bütçesini tüketmemesi için WorkflowExecution:TransitionJobTimeoutSeconds'tan küçük olmak zorunda.
  • WorkflowExecution:TransitionJobTimeoutSeconds, chain lock lease süresinden (TransitionLockLeaseSeconds veya türetilmiş varsayılanı) küçük olmak zorunda — kilit, job bütçesini ve timeout-recovery yolunu aşmalıdır.

Hiyerarşi ihlal edilirse uygulama boot'ta başarısız olur (ValidateOnStart), production'da bir race window olarak ortaya çıkmak yerine.

İlgili