07: Montowanie ConfigMap i Secrets jako wolumeny
Montowanie ConfigMap i Secrets jako wolumeny
15 min
Cel zadania
Celem zadania jest nauka montowania ConfigMap i Secrets jako woluminów (plików) w kontenerach. Do tej pory używałeś ich jako zmiennych środowiskowych — teraz poznasz drugi sposób: montowanie jako pliki w systemie plików kontenera.
Teoria
Wolumeny z ConfigMap i Secrets
- Volume mount: ConfigMap/Secret zamontowany jako katalog z plikami
- Każdy klucz staje się plikiem, a wartość — jego zawartością
- Zastosowanie: Pliki konfiguracyjne (nginx.conf, redis.conf), certyfikaty, klucze
- Różnica od env: Zmiany w ConfigMap/Secret mogą być automatycznie odzwierciedlone w zamontowanych plikach (bez restartu poda)
Struktura YAML
spec:
containers:
- name: app
volumeMounts: # Montowanie wolumenu w kontenerze
- name: config-volume # Nazwa wolumenu (musi pasować do volumes)
mountPath: /config # Ścieżka montowania w kontenerze
volumes: # Definicja wolumenów
- name: config-volume # Nazwa wolumenu
configMap: # Źródło: ConfigMap
name: my-config # Nazwa ConfigMap
Diagram: Pod z wolumenami
graph TB
subgraph POD["Pod"]
subgraph CONT["Kontener"]
APP["Aplikacja"]
MNT1["/config<br/>(zamontowany ConfigMap)"]
MNT2["/secrets<br/>(zamontowany Secret)"]
end
VOL1["Volume: config-volume<br/>źródło: ConfigMap"]
VOL2["Volume: secret-volume<br/>źródło: Secret"]
end
VOL1 -->|"mountPath"| MNT1
VOL2 -->|"mountPath"| MNT2
style POD fill:#f0f4ff,stroke:#4a6fa5
style CONT fill:#ffffff
Kiedy env, a kiedy volume? — Flowchart decyzji
graph TD
Q1{"Czy dane to plik<br/>konfiguracyjny?<br/>(nginx.conf, redis.conf)"}
Q2{"Czy potrzebujesz<br/>automatycznych aktualizacji<br/>bez restartu Poda?"}
ENV["Użyj env /<br/>envFrom"]
VOL["Użyj volumeMounts"]
Q1 -->|"Tak"| VOL
Q1 -->|"Nie"| Q2
Q2 -->|"Tak"| VOL
Q2 -->|"Nie"| ENV
style ENV fill:#e8f5e9
style VOL fill:#e3f2fd
Zadanie 1: ConfigMap jako wolumen
1.1. Upewnij się, że masz ConfigMap z plików
Jeśli nie masz ConfigMap files-config-XX z poprzedniego ćwiczenia, utwórz go:
# Utwórz pliki konfiguracyjne
cat > app-XX.properties << EOF
environment=production
database.url=postgres://db:5432
api.key=123456789
EOF
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
1.2. Pod z ConfigMap jako wolumen
Utwórz plik pod-volume-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-XX
spec:
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c", "cat /config/*; sleep 3600"]
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: files-config-XX
kubectl apply -f pod-volume-XX.yaml
# Sprawdź zamontowane pliki
kubectl exec pod-volume-XX -- ls /config
kubectl exec pod-volume-XX -- cat /config/app.properties
kubectl exec pod-volume-XX -- cat /config/redis.conf
Zadanie 2: Secret jako wolumen
2.1. Tworzenie Secret z plików
# Tworzenie plików konfiguracyjnych
echo -n "admin" > ./username
echo -n "s3cr3t" > ./password
echo -n "redis.example.com:6379" > ./redis.conf
# Utworzenie Secret z plików
kubectl create secret generic app-config-XX \
--from-file=./username \
--from-file=./password \
--from-file=./redis.conf
# Alternatywnie, można utworzyć Secret z całego katalogu
# kubectl create secret generic app-config-XX --from-file=./config-dir
2.2. Pod z zamontowanymi plikami Secret
Utwórz plik kuard-config-files-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-config-files-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
name: http
volumeMounts:
- name: config-vol
mountPath: "/etc/config"
readOnly: true
volumes:
- name: config-vol
secret:
secretName: app-config-XX
items:
- key: redis.conf
path: redis/redis.conf
- key: username
path: auth/username
mode: 0400
kubectl apply -f kuard-config-files-XX.yaml
# Sprawdź zamontowane pliki
kubectl exec kuard-config-files-XX -- ls -lR /etc/config
# Uruchom port-forward
kubectl port-forward pod/kuard-config-files-XX 8080:8080
# Otwórz http://localhost:8080 i przejdź do "File System Browser"
# aby zobaczyć zamontowane pliki w /etc/config
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| Pliki nie widoczne w kontenerze | Sprawdź nazwę wolumenu w volumeMounts i volumes |
| Błędy montowania | Zweryfikuj ścieżki mountPath |
| ConfigMap/Secret nie istnieje | Sprawdź nazwę i namespace |
| Problemy z uprawnieniami plików | Sprawdź mode w sekcji items |
Dobre praktyki
- Montowanie
- Używaj
readOnly: truedla wrażliwych danych - Ustawiaj odpowiednie uprawnienia (
mode) dla plików - Wybieraj czytelne ścieżki montowania
- Używaj
- Organizacja
- Używaj
itemsaby kontrolować, które klucze są montowane - Definiuj niestandardowe ścieżki (
path) dla lepszej organizacji - Grupuj powiązane pliki w jednym ConfigMap/Secret
- Używaj
- Kiedy env, a kiedy volume?
- env: Proste wartości konfiguracyjne, zmienne używane przez aplikację
- volume: Pliki konfiguracyjne (nginx.conf, redis.conf), certyfikaty, klucze
Podsumowanie
- ConfigMap i Secrets można montować jako pliki w kontenerze
- Każdy klucz staje się plikiem, wartość — jego zawartością
- Sekcja
itemspozwala kontrolować strukturę zamontowanych plików - Parametr
modekontroluje uprawnienia plików readOnly: truezwiększa bezpieczeństwo zamontowanych wolumenów