Przejdź do głównej zawartości

Zadania - procesy krótkotrwałe

Zadania w CGC są idealne do uruchamiania zadań, które mają wyraźny początek i koniec. W przeciwieństwie do zwykłych zasobów, które działają nieprzerwanie, zadania wykonują swoją pracę, a następnie się zatrzymują. Ten przewodnik obejmuje wszystko, co musisz wiedzieć o tworzeniu i zarządzaniu zadaniami.

  • Obciążenia o jednorazowym wykonaniu
  • Konfigurowalny TTL (Time To Live) do automatycznego czyszczenia
  • Wsparcie dla przetwarzania równoległego
  • Zasady ponawiania dla nieudanych wykonań
  • Może czekać w stanie Pending, gdy zasoby nie są dostępne w instancji CGC

Tworzenie zadań

informacja

Moduł job jest bardzo podobny do używania modułu resource

import cgc.sdk.job as job

# Create a simple job
response = job.job_create(
name="hello-world-job",
image_name="busybox:latest",
startup_command="echo 'Hello, World!'",
cpu=1,
memory=1
)

if response['code'] == 200:
print("Job created successfully!")

Zarządzanie TTL (Time To Live)

Zrozumienie TTL

TTL kontroluje pole ttlSecondsAfterFinished w zadaniach Kubernetes, umożliwiając automatyczne odśmiecanie.

Zadanie, które jest completed, pozostaje do celów logowania. Ten parametr umożliwia automatyczne usuwanie ukończonego zadania (zarówno udanego, jak i nieudanego).

Wyświetlanie zadań

Pobierz wszystkie zadania

import cgc.sdk.job as job

# List all jobs
jobs_response = job.job_list()

if jobs_response['code'] == 200:
job_list = jobs_response['details'].get('job_list', [])

for j in job_list:
name = j.get('name', 'unknown')
status = j.get('status', {}).get('phase', 'unknown')
created = j.get('created_at', 'unknown')
print(f"Job: {name}")
print(f" Status: {status}")
print(f" Created: {created}")
print()

Filtruj zadania według statusu

def get_jobs_by_status(target_status):
"""Get jobs with specific status"""
response = job.job_list()

if response['code'] != 200:
return []

matching_jobs = []
for j in response['details'].get('job_list', []):
if j.get('status', {}).get('phase') == target_status:
matching_jobs.append(j)

return matching_jobs

# Get all running jobs
running = get_jobs_by_status('Running')
print(f"Found {len(running)} running jobs")

# Get all succeeded jobs
succeeded = get_jobs_by_status('Succeeded')
print(f"Found {len(succeeded)} succeeded jobs")

Usuwanie zadań

Podstawowe usuwanie

import cgc.sdk.job as job

# Delete a specific job
response = job.job_delete("my-job-name")

if response['code'] == 200:
print("Job deleted successfully")
else:
print(f"Failed to delete job: {response['message']}")

Usuwanie wsadowe

def delete_completed_jobs():
"""Delete all completed jobs"""
response = job.job_list()

if response['code'] != 200:
print("Failed to list jobs")
return

deleted_count = 0
for j in response['details'].get('job_list', []):
job_phase = j.get('status', {}).get('phase')
if job_phase == 'Succeeded':
delete_response = job.job_delete(j['name'])
if delete_response['code'] == 200:
deleted_count += 1
print(f"Deleted: {j['name']}")

print(f"Total deleted: {deleted_count}")

# Clean up completed jobs
delete_completed_jobs()

Najlepsze praktyki

Konwencje nazewnictwa

from datetime import datetime

def generate_job_name(prefix, suffix=None):
"""Generate unique job name with timestamp"""
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
if suffix:
return f"{prefix}-{suffix}-{timestamp}"
return f"{prefix}-{timestamp}"

# Use it
job_name = generate_job_name("backup", "postgres")
# Result: "backup-postgres-20240115-143022"

Rozwiązywanie typowych problemów

Zadanie pozostaje w stanie Pending

  • Sprawdź dostępność zasobów
  • Zweryfikuj, czy obraz można pobrać

Zadanie kończy się niepowodzeniem natychmiast

  • Sprawdź składnię komendy startowej
  • Zweryfikuj zmienne środowiskowe
  • Sprawdź punkt wejścia obrazu

Zadanie działa, ale się nie kończy

  • Zadanie może czekać na dane wejściowe
  • Proces może się zawiesić
  • Sprawdź nieskończone pętle