Recraftory

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=info

Dari File

kubectl create configmap nginx-config --from-file=nginx.conf

Dari 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_HOST

Environment dari Semua Key

spec:
  containers:
  - name: app
    envFrom:
    - configMapRef:
        name: app-config

Volume Mount

spec:
  volumes:
  - name: config-vol
    configMap:
      name: nginx-config
  containers:
  - name: nginx
    volumeMounts:
    - name: config-vol
      mountPath: /etc/nginx/conf.d

Secret

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=admin

Dari YAML (Manual Base64)

echo -n 'secret123' | base64
c2VjcmV0MTIz
apiVersion: 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-tls

Keamanan 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