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