Appearance
ConfigMaps & Secrets
Uygulama konfigürasyonlarını container imajından ayırmak için kullanılır. Bu sayede imajı değiştirmeden konfigürasyonu değiştirebilirsiniz (12-Factor App prensibi).
1. ConfigMap
Hassas olmayan veriler için kullanılır (örn: veritabanı hostu, log seviyesi).
YAML ile Oluşturma
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "localhost"
LOG_LEVEL: "info"Komutla Oluşturma
bash
kubectl create configmap app-config \
--from-literal=DB_HOST=localhost \
--from-literal=LOG_LEVEL=infoPod İçinde Kullanım (Env)
yaml
envFrom:
- configMapRef:
name: app-configPod İçinde Kullanım (Volume)
yaml
volumes:
- name: config
configMap:
name: app-config
containers:
- name: api
volumeMounts:
- name: config
mountPath: /etc/app/config2. ConfigMap Güncelleme Davranışı
- Env ile bağlandıysa, mevcut Pod'lar güncellenmez. Yeni Pod'lar yeni değerleri alır.
- Volume ile bağlandıysa, Kubelet belirli aralıklarla dosyaları güncelleyebilir.
subPathile bağlandıysa, dosya güncellenmez (Pod restart gerekir).
Yaygın yöntem: ConfigMap değişince deployment'a restart yaptırmak.
bash
kubectl rollout restart deployment/my-app3. Secret
Hassas veriler için kullanılır (örn: şifreler, API anahtarları). Base64 ile encode edilir, bu şifreleme değildir. etcd'de encryption at rest önerilir.
YAML ile Oluşturma (stringData ile)
stringData kullanırsanız base64 gerekmez.
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DB_PASSWORD: s3cr3tPod İçinde Kullanım (Env)
yaml
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORDPod İçinde Kullanım (Volume)
yaml
volumes:
- name: secret
secret:
secretName: app-secret
containers:
- name: api
volumeMounts:
- name: secret
mountPath: /etc/app/secret
readOnly: true4. Secret Tipleri (Örnekler)
- Opaque: Genel amaçlı secret.
kubernetes.io/tls: TLS sertifikası için (tls.crt,tls.key).kubernetes.io/dockerconfigjson: Private registry içinimagePullSecrets.
Örnek TLS Secret:
yaml
apiVersion: v1
kind: Secret
metadata:
name: my-tls
type: kubernetes.io/tls
stringData:
tls.crt: |-
-----BEGIN CERTIFICATE-----
...
tls.key: |-
-----BEGIN PRIVATE KEY-----
...5. Güvenlik ve İyi Pratikler
- Secret'ları Git'e koyma.
- RBAC ile secret erişimini minimumda tut.
- etcd encryption at rest aktif et.
- CI/CD pipeline'da secret'ları environment variable veya secret manager üzerinden taşı.
- Uygulama loglarında secret sızıntısı riskine dikkat et.
6. Immutable ConfigMap/Secret
Sık değişmeyen config'ler için immutable yapmak performansı artırır ve yanlış değişiklikleri engeller.
yaml
immutable: true