Konfiguraation ja tilan hallinta
ConfigMapit, Secretit ja pysyvä tallennus (PV, PVC, StorageClass) sekä niiden kytkeminen podeihin.
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:
# 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.propertiesManifestina:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_GREETING: "Hei ConfigMapista"
APP_TIER: frontendConfigMapin 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).
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| PVKeskeisiä käsitteitä:
- accessModes –
ReadWriteOnce(yksi solmu),ReadOnlyMany,ReadWriteMany. - reclaimPolicy – mitä PV:lle tapahtuu, kun PVC poistetaan (
DeletetaiRetain).
💡 RKE2/Rancher-ympäristössä dynaamisen provisioinnin hoitaa jokin StorageClass, esim. pilven levypalvelu tai
local-path. Tarkista saatavilla olevat luokat komennollakubectl 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:
# 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:
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:
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
EOF4. Varmista, että arvot näkyvät ajossa olevassa podissa:
# 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ä:
cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
EOF
kubectl get pvc dataJos 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:
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.