Kubernetes perusteet

Konfiguraation ja tilan hallinta

ConfigMapit, Secretit ja pysyvä tallennus (PV, PVC, StorageClass) sekä niiden kytkeminen podeihin.

4 min lukuaika

Konfiguraation ja tilan hallinta

Tässä osiossa opit erottamaan sovelluksen konfiguraation ja salaisuudet koodista sekä ymmärtämään, miten Kubernetes hoitaa pysyvän tallennuksen. Käyt läpi ConfigMapit, Secretit ja tallennuskäsitteet PV, PVC ja StorageClass. Lopuksi kytket ympäristömuuttujat ja salaisuudet ajossa olevaan podiin.


1. Miksi konfiguraatio erotetaan sovelluksesta?

Sama konttikuva (image) halutaan ajaa eri ympäristöissä (kehitys, testi, tuotanto) ilman uudelleenkääntämistä. Siksi ympäristökohtainen konfiguraatio pidetään erillään koodista:

  • ConfigMap – ei-salainen konfiguraatio (asetukset, osoitteet, liput).
  • Secret – salainen tieto (salasanat, API-avaimet, varmenteet).

Näin sama sovellus saa eri asetukset eri ympäristössä pelkästään ConfigMappia tai Secretiä vaihtamalla.


2. ConfigMapit

ConfigMap säilöö ei-salaisen konfiguraation avain–arvo-pareina. Sen voi luoda komennolla tai manifestista:

bash
# Yksittäisistä arvoista
kubectl create configmap app-config \
  --from-literal=APP_GREETING="Hei ConfigMapista" \
  --from-literal=APP_TIER=frontend

# Tiedostosta
kubectl create configmap app-config --from-file=./asetukset.properties

Manifestina:

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_GREETING: "Hei ConfigMapista"
  APP_TIER: frontend

ConfigMapin arvot voi kytkeä podiin kolmella tavalla:

  • yksittäisenä ympäristömuuttujana (configMapKeyRef),
  • kaikki avaimet kerralla ympäristömuuttujiksi (envFrom),
  • tiedostoina levylle (volume mount).

3. Secretit

Secret on kuin ConfigMap, mutta tarkoitettu salaiselle tiedolle. Arvot säilötään base64-koodattuna (huom: koodaus ≠ salaus).

bash
kubectl create secret generic app-secret \
  --from-literal=DB_PASSWORD='s3cret-pw'

Yleisiä Secret-tyyppejä:

  • Opaque – vapaamuotoinen avain–arvo (oletus),
  • kubernetes.io/dockerconfigjson – konttirekisterin tunnukset,
  • kubernetes.io/tls – TLS-varmenne ja -avain.

⚠️ Turvallisuus: base64 ei ole salausta – kuka tahansa voi purkaa sen. Suojaa Secretit RBAC:lla, ota käyttöön etcd-salaus levossa (RKE2 tukee tätä) äläkä tallenna salaisuuksia versionhallintaan selkokielisenä. Käytä tarvittaessa ulkoista salaisuuksien hallintaa (esim. Vault, Sealed Secrets).

Secretin kytkeminen podiin tapahtuu samoin kuin ConfigMapin: ympäristömuuttujana (secretKeyRef / envFrom) tai volumena.


4. Pysyvä tallennus: PV, PVC ja StorageClass

Podit ovat lyhytikäisiä: kun Pod poistuu, sen konttien tiedostojärjestelmä katoaa. Pysyvä tallennus irrottaa datan Podin elinkaaresta.

  • PersistentVolume (PV) – varsinainen tallennusresurssi klusterissa (levy, NFS, pilvivolyymi). Klusteritason objekti.
  • PersistentVolumeClaim (PVC) – Podin pyyntö tietyn kokoisesta ja tyyppisestä tallennustilasta. Pod viittaa PVC:hen, ei suoraan PV:hen.
  • StorageClass – kuvaa, miten tallennustila luodaan automaattisesti (dynaaminen provisiointi). Kun PVC viittaa StorageClassiin, sopiva PV luodaan automaattisesti.
flowchart LR
    POD[Pod] --> PVC[PersistentVolumeClaim]
    PVC -->|sitoutuu| PV[PersistentVolume]
    SC[StorageClass] -->|provisioi| PV

Keskeisiä käsitteitä:

  • accessModesReadWriteOnce (yksi solmu), ReadOnlyMany, ReadWriteMany.
  • reclaimPolicy – mitä PV:lle tapahtuu, kun PVC poistetaan (Delete tai Retain).

💡 RKE2/Rancher-ympäristössä dynaamisen provisioinnin hoitaa jokin StorageClass, esim. pilven levypalvelu tai local-path. Tarkista saatavilla olevat luokat komennolla kubectl get storageclass.


5. Hands-on: ympäristömuuttujien ja salaisuuksien kytkeminen podiin

Luot ConfigMapin ja Secretin sekä kytket ne ajossa olevaan podiin ympäristömuuttujina ja tiedostoina. Varmista ensin, että sinulla on klusterin kubeconfig käytössä (ks. arkkitehtuuri-osion harjoitus).

1. Luo ja ota käyttöön oma nimiavaruutesi:

bash
# Korvaa <oma-nimi> omalla nimelläsi
kubectl create namespace <oma-nimi> --dry-run=client -o yaml | kubectl apply -f -
kubectl config set-context --current --namespace=<oma-nimi>

2. Luo ConfigMap ja Secret:

bash
kubectl create configmap app-config \
  --from-literal=APP_GREETING="Hei ConfigMapista" \
  --from-literal=APP_TIER=frontend

kubectl create secret generic app-secret \
  --from-literal=DB_PASSWORD='s3cret-pw'

3. Ota käyttöön Deployment, joka kuluttaa molempia:

bash
cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: config-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: config-demo
  template:
    metadata:
      labels:
        app: config-demo
    spec:
      containers:
        - name: app
          image: nginx
          env:
            - name: APP_GREETING
              valueFrom:
                configMapKeyRef:
                  name: app-config
                  key: APP_GREETING
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: app-secret
                  key: DB_PASSWORD
          volumeMounts:
            - name: config-vol
              mountPath: /etc/app-config
              readOnly: true
      volumes:
        - name: config-vol
          configMap:
            name: app-config
EOF

4. Varmista, että arvot näkyvät ajossa olevassa podissa:

bash
# Ympäristömuuttujat (ConfigMapista ja Secretistä)
kubectl exec deploy/config-demo -- printenv APP_GREETING DB_PASSWORD

# ConfigMap tiedostoina volumessa
kubectl exec deploy/config-demo -- ls /etc/app-config
kubectl exec deploy/config-demo -- cat /etc/app-config/APP_GREETING

🔎 Havainto: Kun päivität ConfigMapia tai Secretiä, ympäristömuuttujat eivät päivity ajossa olevaan podiin automaattisesti (ne luetaan käynnistyksessä). Volumeen liitetyt arvot sen sijaan päivittyvät viiveellä. Ympäristömuuttujien muutos vaatii podin uudelleenkäynnistyksen (kubectl rollout restart deploy/config-demo).

5. (Valinnainen) Pyydä pysyvää tallennustilaa PVC:llä:

bash
cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 1Gi
EOF

kubectl get pvc data

Jos klusterissa on oletus-StorageClass, PVC saa tilan Bound. Muuten se jää tilaan Pending, kunnes sopiva StorageClass tai PV on saatavilla.

6. Siivoa harjoitus poistamalla oma nimiavaruus:

bash
kubectl delete namespace <oma-nimi>

Yhteenveto

  • ConfigMap säilöö ei-salaisen ja Secret salaisen konfiguraation; molemmat kytketään podiin ympäristömuuttujina tai volumena.
  • Secret on vain base64-koodattu – suojaa se RBAC:lla ja etcd-salauksella.
  • Ympäristömuuttujat luetaan podin käynnistyksessä; muutos vaatii uudelleenkäynnistyksen.
  • Pysyvä tallennus rakentuu kolmesta osasta: PV (resurssi), PVC (pyyntö) ja StorageClass (dynaaminen provisiointi).
  • Pod viittaa aina PVC:hen, ei suoraan PV:hen.