Kubernetes 101: Secret dan ConfigMap

Secret dan ConfigMap di Kubernetes: berbeda tujuan, namun sama-sama menyimpan konfigurasi. Pelajari semua tentang Secret dan ConfigMap di sini!

Kubernetes 101: Secret dan ConfigMap
Kubernetes 101: Secret dan ConfigMap - onxp blog

Kubernetes Secret dirancang untuk menyimpan dan mengelola informasi sensitif, yang mencakup token, kata sandi, atau kunci ssh.

Perkenalan Kubernetes Secret

Kubernetes Secret dirancang untuk menyimpan dan mengelola informasi sensitif, yang mencakup token, kata sandi, atau kunci ssh. Alih-alih menyimpan informasi tersebut di dalam aplikasi atau kode sumber terkait, Kubernetes Secret seringkali menyimpan informasi sensitif tersebut untuk meningkatkan keamanan.

Ada beberapa jenis Secret pada Kubernetes: Opaque, kubernetes.io/service-account-token, kubernetes.io/dockercfg, kubernetes.io/dockerconfigjson, kubernetes.io/basic-auth, kubernetes.io/ssh-auth, dan kubernetes.io/tls. Masing-masing jenis tersebut digunakan untuk skenario berbeda, memberikan cara yang fleksibel untuk menangani berbagai jenis data sensitif.

Kubernetes Secret menyimpan sebuah data dan sebuah bidang stringData. Bidang ini digunakan untuk menyimpan data arbitrer yang dikodekan menggunakan base64.

stringData adalah kolom kemudahan write-only, yang menyediakan cara untuk menentukan informasi non-biner secara langsung, yang akan dikodekan base64 oleh Kubernetes.

Secret pada Kubernetes disimpan etcd dan dikirimkan ke Pod melalui koneksi jaringan, keduanya diamankan oleh server API Kubernetes. Kubernetes juga mendukung enkripsi data yang disimpannya, sehingga membuat data disimpan dalam keamanan ekstra.

Kubernetes Secret - onxp blog

Lifecycle dari Secret melibatkan pembuatannya, penggunaan oleh Pod, hingga di tahap penghapusan. Ketika Secret dihapus, ia tidak akan langsung tersedia untuk Pod baru, tapi Pod yang sudah ada masih bisa mengaksesnya hingga Pod tersebut di-restart.

Namun, Secret memiliki keterbatasan maksimum hingga 1MB. Selain itu, meskipun lebih aman menyimpan data sensitive di Secret daripada dalam spesifikasi atau image Pod, Secret bukanlah solusi komprehensif untuk mengelola data sensitif.

Jenis Secret

Kubernetes mendukung beberapa jenis Secret untuk mengakomodasi berbagai kasus penggunaan. Setiap jenis Secret memiliki tujuan tertentu dan digunakan dalam skenario berbeda. Ayo bahas jenis-jenisnya:

Opaque

Opaque adalah jenis default Secret, yang bisa digunakan untuk menyimpan data Secret arbitrer. Jenis ini tidak memiliki batasan khusus apa pun yang diberlakukan oleh Kubernetes.

Contoh:

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded 'admin'
  password: MWYyZDFlMmU2N2Rm  # base64 encoded '1f2d1e2e67df'

kubernetes.io/service-account-token

Jenis Secret ini dibuat secara otomatis oleh Kubernetes dan dilampirkan ke akun layanan. Mereka digunakan untuk mengautentikasi aplikasi yang ingin berkomunikasi dengan server API Kubernetes. Bidang data untuk Secret ini mencakup token dan sertifikat root server API Kubernetes.

kubernetes.io/dockercfg dan kubernetes.io/dockerconfigjson

Jenis Secret ini digunakan untuk menyimpan informasi konfigurasi Docker. Tipe Secret dockercfg digunakan untuk format file konfigurasi lama Docker, dan dockerconfigjson digunakan untuk config.json format Docker yang lebih baru. Keduanya berisi kredensial yang diperlukan untuk menarik image dari repositori Docker pribadi.

kubernetes.io/basic-auth

Jenis Secret ini dapat menyimpan kredensial untuk autentikasi dasar, yang berisi dua bidang: username dan password. Ia sering digunakan saat berinteraksi dengan REST API yang memerlukan autentikasi dasar.

Contoh:

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: kubernetes.io/basic-auth
stringData:
  username: admin
  password: secret

kubernetes.io/ssh-auth
Jenis Secret ini digunakan untuk menyimpan kredensial autentikasi SSH. Mereka berisi satu bidang ssh-privatekey untuk kunci SSH pribadi. Kamu juga bisa menggunakannya ketika kamu perlu berinteraksi dengan layanan yang memerlukan otentikasi SSH.

kubernetes.io/tls
Jenis ini digunakan untuk menyimpan sertifikat dan kunci privat terkait. Ia biasanya digunakan untuk layanan yang mendukung TLS. Jenis Secret ini mengharapkan dua bidang: tls.crt dan tls.key.

Contoh:

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: kubernetes.io/tls
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key

Jangan lupa bahwa semua data rahasia harus diberi kode base64 sebelum dimasukkan dalam definisi Secret. Kubernetes akan mendekode data ini saat digunakan.

ConfigMap

Kubernetes ConfigMap adalah objek API yang digunakan untuk menyimpan data konfigurasi non-sensitif dalam pasangan key-value. Tujuan utamanya yaitu untuk mengeksternalisasi konfigurasi sehingga aplikasimu bersifat portabel. Kamu bisa menggunakan ConfigMaps untuk konfigurasi spesifik lingkungan dan konfigurasi aplikasi.

Seperti halnya Secrets, ConfigMaps disimpan etcd dan siklus hidupnya dikelola oleh Kubernetes. Siklus hidup ini melibatkan pembuatan, penggunaan oleh Pod, hingga mencapai tahap pembaruan atau penghapusan.

Data ConfigMap disimpan di bidang data, dan dapat menyimpan pasangan key-value sederhana hingga konfigurasi yang lebih kompleks seperti file JSON atau YAML.

Akan tetapi, ConfigMaps tidak dienkripsi saat disimpan atau dalam perjalanan kecuali kamu menggunakan alat atau layanan pihak ketiga. Mereka juga memiliki batasan ukuran 1MB.

Secret vs ConfigMap

Meskipun Secret dan ConfigMap memiliki tujuan yang berbeda di Kubernetes, keduanya memiliki beberapa kesamaan. Misalnya, keduanya disimpan dalam etcd dan memiliki batasan ukuran 1MB.

Mereka juga memiliki siklus hidup yang serupa, mulai dari pembuatan hingga penghapusan, dan keduanya menggunakan bidang data tersebut untuk menyimpan informasi.

Namun, perbedaan di antara keduanya sangatlah penting. Secret digunakan untuk menyimpan data sensitif dan dienkripsi saat transit dan saat disimpan, sedangkan ConfigMaps digunakan untuk data konfigurasi yang tidak sensitif dan tidak dienkripsi.

Secret dan ConfigMap sebagai Environment Variables

Secret dan ConfigMaps dapat digunakan untuk mendefinisikan environment variables di dalam sebuah Pod. Contohnya, kamu dapat mendefinisikan Secret dengan sebuah kunci API dan kemudian mereferensikan Secret tersebut ketika mendefinisikan environment variables untuk Pod-mu. Hal yang sama juga berlaku pada ConfigMaps.

Pertimbangkan contoh berikut untuk Secret:

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded 'admin'
  password: MWYyZDFlMmU2N2Rm  # base64 encoded '1f2d1e2e67df'

Dan kemudian gunakan Secret sebagai environment variable:

---
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

Hal yang sama dapat dicapai dengan ConfigMaps. Pertama, tentukan ConfigMap:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  log_level: "Debug"
  log_location: "/var/log/myapp"

Kemudian, gunakan ConfigMap sebagai environment variable di Pod-mu:

---
apiVersion: v1
kind: Pod
metadata:
  name: config-env-pod
spec:
  containers:
  - name: mycontainer
    image: myapp
    env:
      - name: LOG_LEVEL
        valueFrom:
          configMapKeyRef:
            name: myconfigmap
            key: log_level
      - name: LOG_LOCATION
        valueFrom:
          configMapKeyRef:
            name: myconfigmap
            key: log_location
  restartPolicy: Never

Hal ini memastikan rahasia dan konfigurasi disimpan terpisah dari kode aplikasi dan dapat diubah secara independen dari kode aplikasi.

Perintah Startup Container dengan Secret dan ConfigMaps

Kamu bisa menggunakan Secrets dan ConfigMaps untuk menetapkan argumen baris perintah untuk container-mu saat startup. Ini bisa berguna jika kamu ingin meneruskan token rahasia atau parameter konfigurasi ke aplikasimu tanpa melakukan hardcoding ke dalam kode aplikasi.

Contoh berikut mengilustrasikan bagaimana kamu bisa menggunakan Secret dalam argumen command-line container:

---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myapp
    command: [ "/app/start", "--token" ]
    args:
    - valueFrom:
        secretKeyRef:
          name: mysecret
          key: token
  restartPolicy: Never

Demikian pula, ConfigMap dapat digunakan pada command line:

---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myapp
    command: [ "/app/start", "--log-level" ]
    args:
    - valueFrom:
        configMapKeyRef:
          name: myconfigmap
          key: log_level
  restartPolicy: Never

Manajemen Secret dan ConfigMap

Membuat Secret dan ConfigMap

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded 'admin'
  password: MWYyZDFlMmU2N2Rm  # base64 encoded '1f2d1e2e67df'

Secret Manifest ini dibagi menjadi beberapa bagian:

  1. apiVersion: Menunjukkan versi Kubernetes API yang digunakan untuk membuat objek ini.
  2. kind: Menunjukkan tipe objek Kubernetes yang kamu buat. Dalam hal ini adalah Secret.
  3. metadata: Berisi metadata tentang objek Kubernetes, seperti nama dan namespacenya. Dalam hal ini, nama Secret-nya adalah mysecret.
  4. type: Menentukan jenis Secret. Opaque adalah tipe default Secret dan paling fleksibel, karena memungkinkan pasangan key-value yang berubah-ubah.
  5. data: Tempat di mana data rahasia sebenarnya disimpan. Dalam hal ini, ada dua bagian data: username dan password. Nilainya adalah string yang dikodekan dengan base64.

Selanjutnya, ayo kita lihat ConfigMap manifest.

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  log_level: "Debug"
  log_location: "/var/log/myapp"

Manifes ConfigMap juga memiliki beberapa bagian:

  1. apiVersion: Mirip dengan Secret, apiVersion menunjukkan versi Kubernetes API yang kamu gunakan untuk membuat objek tersebut.
  2. kind: Menentukan jenis objek Kubernetes yang kamu buat. Dalam hal ini adalah ConfigMap.
  3. metadata: Berisi metadata tentang objek Kubernetes. Dalam hal ini, nama ConfigMap adalah myconfigmap.
  4. data: Tempat di mana data konfigurasi sebenarnya disimpan. Ini mirip dengan data di Secret, tetapi tidak dikodekan base64. Dalam contoh ini, ia memegang konfigurasi untuk log_level dan log_location.

Untuk membuat Secret, gunakan perintah berikut:

~$ kubectl apply -f secret.yaml

Untuk membuat ConfigMap, gunakan perintah berikut:

~$ kubectl apply -f configmap.yaml

Membaca Secrets dan ConfigMap

Untuk mendapatkan informasi tentang Secret atau ConfigMap tertentu, gunakan perintah berikut:

~$ kubectl get secret mysecret -o yaml
~$ kubectl get configmap myconfigmap -o yaml

Untuk mencantumkan semua Secret atau ConfigMap:

~$ kubectl get secrets
~$ kubectl get configmaps

Memperbarui Secret dan ConfigMap

Kamu bisa memperbarui Secret dan ConfigMaps menggunakan perintah kubectl apply dengan file YAML yang telah diperbarui. Ia akan menerapkan perubahan yang ditentukan dalam file ke Secret atau ConfigMap yang ada.

Jika kamu ingin memperbarui bidang tertentu tanpa mengubah seluruh konfigurasi, gunakan perintah kubectl patch. Berikut ini contoh patching ConfigMap:

~$ kubectl patch configmap myconfigmap -p '{"data":{"log_level":"Info"}}'

Menghapus Secret dan ConfigMap

Untuk menghapus Secret atau ConfigMap, gunakan perintah berikut:

~$ kubectl delete secret mysecret
~$ kubectl delete configmap myconfigmap

Tindakan ini akan menghapus Secret atau ConfigMap dari cluster Kubernetes. Ketahuilah bahwa pod atau sumber daya lain apa pun yang menggunakan Secret atau ConfigMap ini mungkin terpengaruh. Pastikan kamu memverifikasi dampak penghapusan sebelum melanjutkan operasi ini.

Pelajari juga cara melakukan Deployment dengan Kubernetes!

Ayo belajar bareng ONXP!

Read more