05: ConfigMap — tworzenie i użycie jako env
ConfigMap w Kubernetes: tworzenie i użycie jako zmienne środowiskowe
15 min
Cel zadania
Celem zadania jest nauka tworzenia ConfigMap w Kubernetes i używania go jako źródła zmiennych środowiskowych dla aplikacji.
Teoria
ConfigMap w Kubernetes
- ConfigMap: Obiekt przechowujący dane konfiguracyjne jako pary klucz-wartość
- Dlaczego oddzielenie konfiguracji od kodu?
- Ten sam obraz kontenera działa w dev, staging i prod — zmieniasz tylko ConfigMap
- Zmiana konfiguracji nie wymaga przebudowy obrazu Docker
- Konfiguracja jest wersjonowana razem z innymi obiektami K8s
- 3 sposoby tworzenia ConfigMap:
- Z pliku YAML (
kubectl apply -f) - Z linii poleceń (
kubectl create configmap --from-literal) - Z plików konfiguracyjnych (
kubectl create configmap --from-file)
- Z pliku YAML (
- 2 sposoby użycia w Pod:
- Jako zmienne środowiskowe (
env/envFrom) — to ćwiczenie - Jako pliki zamontowane w wolumenie (
volumeMounts) — kolejne ćwiczenie
- Jako zmienne środowiskowe (
graph LR
CM["ConfigMap<br/>(klucz-wartość)"]
CM -->|"envFrom / env"| ENV["Pod: zmienne środowiskowe<br/>APP_ENV=production"]
CM -->|"volumeMounts"| VOL["Pod: pliki w katalogu<br/>/config/app.properties"]
style CM fill:#fff3e0,stroke:#f57c00
style ENV fill:#e8f5e9
style VOL fill:#e3f2fd
Zadanie 1: Tworzenie ConfigMap
1.1. Z pliku YAML
Utwórz plik basic-config-XX.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-XX
data:
ENVIRONMENT: "production"
DATABASE_URL: "postgres://db:5432"
API_KEY: "123456789"
CACHE_ENABLED: "true"
kubectl apply -f basic-config-XX.yaml
1.2. Z linii poleceń
# Tworzenie z par klucz-wartość
kubectl create configmap cli-config-XX \
--from-literal=ENVIRONMENT="production" \
--from-literal=DATABASE_URL="postgres://db:5432" \
--from-literal=API_KEY="123456789"
# Sprawdzenie utworzonego ConfigMap
kubectl get configmap cli-config-XX -o yaml
1.3. Z plików konfiguracyjnych
# Utwórz plik app.properties
cat > app-XX.properties << EOF
environment=production
database.url=postgres://db:5432
api.key=123456789
EOF
# Utwórz plik redis.conf
cat > redis-XX.conf << EOF
maxmemory 2mb
maxmemory-policy allkeys-lru
EOF
# Tworzenie ConfigMap z plików
kubectl create configmap files-config-XX \
--from-file=app.properties=app-XX.properties \
--from-file=redis.conf=redis-XX.conf
Zadanie 2: Używanie ConfigMap w Pod
2.1. Jako zmienne środowiskowe
Utwórz plik pod-env-config-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-env-config-XX
spec:
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c", "env; sleep 3600"]
env:
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: app-config-XX
key: ENVIRONMENT
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config-XX
key: DATABASE_URL
2.2. Wszystkie zmienne z ConfigMap
Utwórz plik pod-all-env-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-all-env-XX
spec:
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c", "env; sleep 3600"]
envFrom:
- configMapRef:
name: app-config-XX
Zadanie 3: Zarządzanie ConfigMap
3.1. Sprawdzanie ConfigMap
# Lista wszystkich ConfigMap
kubectl get configmap
# Szczegóły konkretnego ConfigMap
kubectl describe configmap app-config-XX
# Wyświetl w formacie YAML
kubectl get configmap app-config-XX -o yaml
3.2. Aktualizacja ConfigMap
# Edycja bezpośrednia
kubectl edit configmap app-config-XX
# Aktualizacja z nowego pliku YAML
kubectl apply -f updated-config-XX.yaml
3.3. Usuwanie ConfigMap
kubectl delete configmap app-config-XX
Zadanie 4: Eksport i konwersja ConfigMap
4.1. Eksport bez tworzenia obiektu
# Z wartości literalnych
kubectl create configmap app-config-XX \
--from-literal=ENVIRONMENT="production" \
--from-literal=DATABASE_URL="postgres://db:5432" \
--dry-run=client \
-o yaml > app-config-XX.yaml
# Z plików
kubectl create configmap files-config-XX \
--from-file=app-XX.properties \
--from-file=redis-XX.conf \
--dry-run=client \
-o yaml > files-config-XX.yaml
4.2. Eksport istniejącego ConfigMap
# Eksport do pliku YAML
kubectl get configmap app-config-XX -o yaml > existing-config-XX.yaml
4.3. Szablon ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: template-config-XX
data:
APP_NAME: "my-app-XX"
ENVIRONMENT: "development"
CONFIG_VERSION: "1.0"
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| ConfigMap nie istnieje | Sprawdź nazwę i namespace |
| Pod nie startuje | Sprawdź logi: kubectl describe pod |
| Zmienne nie widoczne | Sprawdź configMapKeyRef/configMapRef |
Dobre praktyki
- Organizacja ConfigMap
- Grupuj powiązane konfiguracje
- Używaj czytelnych nazw kluczy
- Rozdzielaj konfiguracje na logiczne części
- Bezpieczeństwo
- Nie przechowuj haseł (użyj Secrets)
- Ogranicz dostęp do wrażliwych danych
- Regularnie rotuj dane dostępowe
- Zarządzanie
- Dokumentuj strukturę konfiguracji
- Używaj systemu kontroli wersji
- Testuj zmiany przed wdrożeniem
Podsumowanie
- ConfigMap pozwala na centralne zarządzanie konfiguracją
- Można tworzyć je na różne sposoby (YAML, CLI, pliki)
- Można używać jako zmienne środowiskowe (
env/envFrom) - W następnym ćwiczeniu poznasz montowanie ConfigMap jako wolumeny
Wskazówki
- Zawsze weryfikuj poprawność YAML
- Używaj
kubectl describe configmapdo debugowania - Aktualizuj dokumentację po zmianach
- Twórz kopie zapasowe konfiguracji
- Używaj
--dry-run=clientdo testowania zmian - Regularnie eksportuj ConfigMapy do plików YAML