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 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.
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:
- apiVersion: Menunjukkan versi Kubernetes API yang digunakan untuk membuat objek ini.
- kind: Menunjukkan tipe objek Kubernetes yang kamu buat. Dalam hal ini adalah Secret.
- metadata: Berisi metadata tentang objek Kubernetes, seperti nama dan namespacenya. Dalam hal ini, nama Secret-nya adalah
mysecret
. - type: Menentukan jenis Secret.
Opaque
adalah tipe default Secret dan paling fleksibel, karena memungkinkan pasangan key-value yang berubah-ubah. - data: Tempat di mana data rahasia sebenarnya disimpan. Dalam hal ini, ada dua bagian data:
username
danpassword
. 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:
- apiVersion: Mirip dengan Secret, apiVersion menunjukkan versi Kubernetes API yang kamu gunakan untuk membuat objek tersebut.
- kind: Menentukan jenis objek Kubernetes yang kamu buat. Dalam hal ini adalah ConfigMap.
- metadata: Berisi metadata tentang objek Kubernetes. Dalam hal ini, nama ConfigMap adalah
myconfigmap
. - data: Tempat di mana data konfigurasi sebenarnya disimpan. Ini mirip dengan
data
di Secret, tetapi tidak dikodekan base64. Dalam contoh ini, ia memegang konfigurasi untuklog_level
danlog_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.