ConfigMap dan Secret
Mengelola konfigurasi dan data sensitif di Kubernetes
ConfigMap
Apa itu ConfigMap
- Resource untuk menyimpan konfigurasi non-sensitif
- Key-value pair atau file konfigurasi
- Dapat di-mount sebagai environment variable atau file
Membuat ConfigMap
Dari Literal
kubectl create configmap app-config \
--from-literal=DATABASE_HOST=db.example.com \
--from-literal=LOG_LEVEL=infoDari File
kubectl create configmap nginx-config --from-file=nginx.confDari YAML
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db.example.com"
LOG_LEVEL: "info"
nginx.conf: |
server {
listen 80;
location / {
root /var/www/html;
}
}Menggunakan ConfigMap
Environment Variable
spec:
containers:
- name: app
env:
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DATABASE_HOSTEnvironment dari Semua Key
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-configVolume Mount
spec:
volumes:
- name: config-vol
configMap:
name: nginx-config
containers:
- name: nginx
volumeMounts:
- name: config-vol
mountPath: /etc/nginx/conf.dSecret
Apa itu Secret
- Resource untuk menyimpan data sensitif
- Dienkode base64 (bukan encryption)
- Harus digabung dengan RBAC untuk keamanan
Membuat Secret
Dari Literal
kubectl create secret generic db-secret \
--from-literal=password=secret123 \
--from-literal=username=adminDari YAML (Manual Base64)
echo -n 'secret123' | base64
c2VjcmV0MTIzapiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: c2VjcmV0MTIz
username: YWRtaW4=Tipe Secret
- Opaque: Secret umum (default)
- kubernetes.io/tls: Certificate dan private key
- kubernetes.io/dockerconfigjson: Docker registry credentials
- kubernetes.io/basic-auth: Username dan password
Menggunakan Secret
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
volumeMounts:
- name: tls-certs
mountPath: /etc/tls
readOnly: true
volumes:
- name: tls-certs
secret:
secretName: app-tlsKeamanan Secret
Limitasi Default
- Secret di-encode base64, bukan di-encrypt
- Siapa pun dengan akses ke etcd dapat membaca secret
- Pod di node yang sama dapat membaca secret jika RBAC lemah
Best Practice
- Gunakan External Secret Operator untuk integrasi dengan Vault
- Aktifkan encryption at rest di etcd
- Gunakan RBAC untuk membatasi akses secret
- Pertimbangkan tools: Sealed Secrets, External Secrets, Vault
Command
kubectl get configmaps
kubectl get secrets
kubectl describe configmap app-config
kubectl get secret db-secret -o yaml