Lab 17 – ConfigMapy a Secrety

Lab 17 – ConfigMapy a Secrety

Cíl: stejný image, jiná konfigurace – a zjistit, které změny potřebují restart. Kapitola: ConfigMapy a Secrety

# 1 – z literálů a ze souboru
cd ~
printf 'color=blue\nretries=3\n' > app.properties
kubectl create cm app-cfg \
  --from-literal=DATACENTER=dc01 \
  --from-file=app.properties
kubectl get cm app-cfg -o yaml

--from-literal udělá jeden klíč; --from-file udělá klíč pojmenovaný podle souboru, jehož hodnotou je celý soubor. Obojí končí ve stejné mapě data.

# 2 – spotřebujte obojím způsobem najednou
cat > cfgpod.yaml <<'YAML'
apiVersion: v1
kind: Pod
metadata:
  name: cfgpod
spec:
  containers:
    - name: box
      image: busybox
      command: ["sh", "-c", "env | sort; sleep 3600"]
      env:
        - name: DATACENTER
          valueFrom:
            configMapKeyRef:
              name: app-cfg
              key: DATACENTER
      volumeMounts:
        - name: cfg
          mountPath: /etc/appcfg
  volumes:
    - name: cfg
      configMap:
        name: app-cfg
YAML
kubectl apply -f cfgpod.yaml
kubectl logs cfgpod | grep DATACENTER
kubectl exec cfgpod -- ls /etc/appcfg
kubectl exec cfgpod -- cat /etc/appcfg/app.properties

Z každého klíče vznikl soubor v /etc/appcfg a z jednoho navíc proměnná prostředí.

# 3 – změňte ConfigMapu a počkejte
printf 'color=green\nretries=5\n' > app.properties
kubectl create cm app-cfg --from-literal=DATACENTER=dc02 \
  --from-file=app.properties --dry-run=client -o yaml | kubectl apply -f -
sleep 70
kubectl exec cfgpod -- cat /etc/appcfg/app.properties   # green – aktualizováno
kubectl exec cfgpod -- printenv DATACENTER              # dc01 – NEaktualizováno

Tohle je nejužitečnější poznatek celé kapitoly. Připojené soubory kubelet obnovuje, proměnné prostředí jsou zmrazené od startu kontejneru. Aplikace, která konfiguraci čte z proměnných, potřebuje restart.

Vzor kubectl create ... --dry-run=client -o yaml | kubectl apply -f - je způsob, jak aktualizovat objekt, pro který neexistuje příkaz kubectl set.

Secrety

# 4 –
kubectl create secret generic db-cred \
  --from-literal=username=app \
  --from-literal=password=S3cret
kubectl get secret db-cred -o yaml
kubectl get secret db-cred -o jsonpath='{.data.password}' | base64 -d; echo

Base64 je kódování, ne šifrování. Kdo umí číst Secrety v tomhle namespace, čte i heslo – ochranu dělá RBAC a šifrování at rest.

# 5 – vložte celý Secret jako proměnné prostředí
cat > secpod.yaml <<'YAML'
apiVersion: v1
kind: Pod
metadata:
  name: secpod
spec:
  containers:
    - name: box
      image: busybox
      command: ["sh", "-c", "sleep 3600"]
      envFrom:
        - secretRef:
            name: db-cred
YAML
kubectl apply -f secpod.yaml
kubectl exec secpod -- sh -c 'echo $username / $password'

envFrom vezme všechny klíče najednou; jména klíčů se stanou jmény proměnných.

# 6 – restart, který změnu načte
kubectl create deploy web --image nginx:1.27
kubectl set env deploy/web --from=configmap/app-cfg
kubectl rollout status deploy/web
kubectl exec deploy/web -- printenv DATACENTER      # dc02

kubectl create cm app-cfg --from-literal=DATACENTER=dc03 \
  --from-file=app.properties --dry-run=client -o yaml | kubectl apply -f -
kubectl exec deploy/web -- printenv DATACENTER      # pořád dc02
kubectl rollout restart deploy/web
kubectl rollout status deploy/web
kubectl exec deploy/web -- printenv DATACENTER      # dc03

kubectl rollout restart po změně konfigurace je návyk, který se vyplatí získat.

Úklid

kubectl delete -f cfgpod.yaml -f secpod.yaml
kubectl delete deploy web
kubectl delete cm app-cfg
kubectl delete secret db-cred