ConfigMaps w CGC SDK
Przegląd
config_maps_data pozwala na przekazywanie danych konfiguracji do kontenerów w formie Kubernetes ConfigMaps. Jest to alternatywa dla zmiennych środowiskowych (environment_data) – zamiast przekazywać pojedyncze klucze, możesz przekazywać całe słowniki danych konfiguracji.
Format danych
config_maps_data przyjmuje listę stringów w formacie:
"NAZWA_CONFIG_MAP=JSON_DANE"
Gdzie:
- NAZWA_CONFIG_MAP – nazwa ConfigMap w Kubernetes
- JSON_DANE – string w formacie JSON reprezentujący słownik
{ "klucz": "wartość", ... }
Przykład formatu:
config_maps_data=[
"app-config={\"DATABASE_URL\": \"postgres://db:5432\", \"CACHE_TTL\": \"3600\"}",
"feature-flags={\"ENABLE_NEW_UI\": \"true\", \"MAX_RETRIES\": \"3\"}"
]
Jak to działa w kodzie
Parsing danych
Kod przetwarza config_maps_data w następujący sposób:
config_maps_data_dict = {}
for config_map in config_maps_data:
key, value = config_map.split("=") # Rozdziela nazwę od danych
config_maps_data_dict[key] = value # value powinno być JSON stringiem
payload["config_maps_data"] = config_maps_data_dict
Ważne: Wartość po = jest przekazywana jako string – backend sam parsuje go jako JSON.
Przykłady użycia
Przykład 1: Podstawowe użycie z resource_create()
import cgc.sdk.resource as resource
response = resource.resource_create(
name="my-app-with-config",
image_name="python:3.9",
cpu=2,
memory=4,
config_maps_data=[
"app-settings={\"LOG_LEVEL\": \"info\", \"DEBUG\": \"false\"}",
"database-config={\"DB_HOST\": \"postgres\", \"DB_PORT\": \"5432\"}"
]
)
Przykład 2: Zmienna środowiskowa vs ConfigMap
Zmienna środowiskowa (prosta):
environment_data=[
"LOG_LEVEL=info",
"DEBUG=false"
]
ConfigMap (strukturalna):
config_maps_data=[
"logging-config={\"LOG_LEVEL\": \"info\", \"LOG_FORMAT\": \"json\", \"LOG_OUTPUT\": \"/var/log/app.log\"}"
]
Przykład 3: Kompleksowy przykład z wieloma ConfigMap
import cgc.sdk.resource as resource
import json
# Przygotowanie danych konfiguracji
app_config = {
"API_URL": "https://api.example.com",
"TIMEOUT": "30",
"MAX_CONNECTIONS": "100"
}
db_config = {
"DB_HOST": "postgres.default.svc",
"DB_PORT": "5432",
"DB_NAME": "myapp",
"DB_POOL_SIZE": "10"
}
feature_flags = {
"ENABLE_CACHE": "true",
"CACHE_TTL": "3600",
"ENABLE_METRICS": "true"
}
response = resource.resource_create(
name="production-app",
image_name="my-registry/app:v1.2.3",
cpu=4,
memory=8,
gpu=0,
environment_data=[
"ENV=production",
"APP_VERSION=1.2.3"
],
config_maps_data=[
f"app-config={json.dumps(app_config)}",
f"database-config={json.dumps(db_config)}",
f"features={json.dumps(feature_flags)}"
],
startup_command="python main.py"
)
if response['code'] == 200:
print("✓ Aplikacja uruchomiona z ConfigMaps")
else:
print(f"✗ Błąd: {response.get('message')}")
Przykład 4: Użycie z jobami (job_create())
import cgc.sdk.job as job
import json
batch_config = {
"BATCH_SIZE": "1000",
"RETRY_COUNT": "3",
"OUTPUT_FORMAT": "parquet"
}
response = job.job_create(
name="data-processing-batch",
image_name="my-registry/batch-processor:latest",
cpu=2,
memory=4,
startup_command="python process_batch.py",
config_maps_data=[
f"batch-settings={json.dumps(batch_config)}"
],
ttl_seconds_after_finished=7200 # Czyszczenie po 2h
)
Jak dostępna jest konfiguracja w kontenerze
W kontenerze Kubernetes, ConfigMaps są domyślnie montowane jako pliki w katalogu /etc/config/ lub jako zmienne środowiskowe, w zależności od konfiguracji deploymentu.
Opcja A: Jako pliki (domyślne)
/etc/config/app-config # Zawartość: {"API_URL": "...", ...}
/etc/config/database-config # Zawartość: {"DB_HOST": "...", ...}
Opcja B: Jako zmienne środowiskowe (jeśli skonfigurowane)
echo $app-config # {"API_URL": "...", ...}
Uwaga: Dokładny sposób montowania zależy od szablonu deploymentu używanego przez CGC. Sprawdź dokumentację cgc-server lub zapytaj o szczegóły montowania ConfigMaps w Twoim namespace.
Najczęstsze błędy
❌ Błąd 1: Niepoprawny format JSON
# ZŁE - brak cudzysłowów w JSON
config_maps_data=[
"app-config={LOG_LEVEL: info}" # ❌ Niepoprawny JSON
]
# DOBRE - poprawny JSON string
config_maps_data=[
"app-config={\"LOG_LEVEL\": \"info\"}" # ✅ Poprawny
]
❌ Błąd 2: Brak równań =
# ZŁE
config_maps_data=[
"app-config{\"LOG_LEVEL\": \"info\"}" # ❌ Brakuje '='
]
# DOBRE
config_maps_data=[
"app-config={\"LOG_LEVEL\": \"info\"}" # ✅
]
❌ Błąd 3: Niepoprawne escapeowanie w Python
# ZŁE - cudzysłowy konflikt
config_maps_data=[
"app-config={"LOG_LEVEL": "info"}" # ❌ SyntaxError
]
# DOBRE - użyj json.dumps() lub escapeuj
import json
config_maps_data=[
f"app-config={json.dumps({'LOG_LEVEL': 'info'})}" # ✅
]
# LUB
config_maps_data=[
"app-config={\\\"LOG_LEVEL\\\": \\\"info\\\"}" # ✅
]
Porównanie: environment_data vs config_maps_data
| Cecha | environment_data | config_maps_data |
|---|---|---|
| Format | KLUCZ=WARTOŚĆ | NAZWA={JSON_DANE} |
| Struktura | Płaski słownik | Zagnieżdżone słowniki |
| Organizacja | Wszystkie zmienne razem | Pogrupowane tematycznie |
| Czytelność | Dobra dla prostych konfiguracji | Lepsza dla złożonych |
| Przykład | ["LOG_LEVEL=info", "DEBUG=false"] | ["logging={\"LOG_LEVEL\": \"info\", \"DEBUG\": \"false\"}"] |
| Zastosowanie | Proste zmienne środowiskowe | Skomplikowane konfiguracje, pliki config |
Best Practices
-
Używaj
json.dumps()do generowania JSON:import jsonconfig_maps_data=[f"my-config={json.dumps({'KEY': 'value'})}"] -
Grupuj konfigurację tematycznie:
config_maps_data=["database={...}","cache={...}","logging={...}"] -
Unikaj przechowywania sekretów w ConfigMaps – użyj Kubernetes Secrets zamiast tego.
-
Waliduj JSON przed wysłaniem:
import jsontry:json.dumps(my_dict) # Walidacjaexcept TypeError as e:print(f"Niepoprawny format: {e}")
Podsumowanie
config_maps_data to potężne narzędzie do przekazywania strukturalnych danych konfiguracji do kontenerów w CGC. Używaj go, gdy:
- Masz złożone konfiguracje z wieloma powiązanymi kluczami
- Chcesz pogrupować konfigurację tematycznie
- Potrzebujesz przekazać dane w formacie JSON/XML/YAML
Dla prostych zmiennych środowiskowych nadal używaj environment_data.
Źródła: Analiza kodu cgc-client:
cgc/commands/jobs/job_utils.py(linie 123-137)cgc/commands/compute/compute_utils.py(linie 310-324)cgc/sdk/resource.py(linie 254, 326, 362-363)cgc/sdk/examples/basic_compute.py