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

  1. Montowanie
    • Używaj readOnly: true dla wrażliwych danych
    • Ustawiaj odpowiednie uprawnienia (mode) dla plików
    • Wybieraj czytelne ścieżki montowania
  2. Organizacja
    • Używaj items aby kontrolować, które klucze są montowane
    • Definiuj niestandardowe ścieżki (path) dla lepszej organizacji
    • Grupuj powiązane pliki w jednym ConfigMap/Secret
  3. 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 items pozwala kontrolować strukturę zamontowanych plików
  • Parametr mode kontroluje uprawnienia plików
  • readOnly: true zwiększa bezpieczeństwo zamontowanych wolumenów

results matching ""

    No results matching ""