Apa itu Secret di Kubernetes
Di Kubernetes, Secret adalah resource yang membantu kita menyimpan pasangan kunci-nilai dalam bentuk terenkripsi, khususnya dalam format Base64. Secret berfungsi sebagai cara untuk mengelola data sensitif seperti kata sandi, token, atau kunci yang mungkin dibutuhkan oleh aplikasi selama berjalan. Fakta bahwa data yang disimpan dienkripsi dalam format Base64 berarti meskipun tidak dapat dibaca secara langsung, data tersebut tidak benar-benar terenkripsi. Siapa pun dengan nilai yang terenkripsi dapat mendekode data tersebut tanpa kunci dekripsi, jadi meskipun Secret membantu menghindari penyimpanan data sensitif dalam teks biasa pada aplikasi Anda, mereka bukanlah solusi mandiri untuk mengamankan informasi sensitif.
Perbedaan antara Secret dan ConfigMap
Meskipun baik Secret maupun ConfigMap memungkinkan Anda untuk memisahkan detail konfigurasi dari kode aplikasi yang di-containerkan, keduanya digunakan untuk tipe data yang berbeda.
ConfigMap ideal digunakan untuk menyimpan dan berbagi data konfigurasi statis yang tidak sensitif dalam bentuk pasangan kunci-nilai. Anda dapat menggunakan ConfigMap untuk menyimpan file konfigurasi, file properti, atau bahkan objek JSON.
Secret, di sisi lain, dirancang khusus untuk informasi yang bersifat sensitif. Secret menawarkan solusi yang lebih aman dan fleksibel dibandingkan dengan ConfigMap dalam menyimpan data rahasia. Meskipun Secret tidak secara default dienkripsi, Kubernetes menawarkan integrasi dengan sistem manajemen kunci penyedia cloud untuk menyimpan Secret yang dienkripsi saat berada dalam keadaan diam.
Demonstrasi Secret di Kubernetes
Saya akan menjelaskan cara membuat dan menggunakan Secret di Kubernetes.
Memulai Minikube
Sebelum kita memulai, pastikan bahwa Minikube sudah berjalan di mesin Anda. Untuk memulai Minikube, gunakan perintah berikut:
$ minikube start
Membuat Secret
Proses pembuatan Secret mirip dengan pembuatan ConfigMap. Di sini, kita akan menggunakan perintah kubectl create secret
.
Kita akan menggunakan opsi --dry-run
untuk menjalankan simulasi, dan -o yaml
untuk menghasilkan manifest. Lihat perintah berikut:
$ kubectl create secret generic my-secret \
--from-literal=SECRET_KEY1=SECRET_VALUE1 \
--from-literal=SECRET_KEY2=SECRET_VALUE2 \
--dry-run=client -o yaml
Ini akan menghasilkan output yang terlihat seperti ini:
apiVersion: v1
data:
SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
creationTimestamp: null
name: my-secret
Kemudian, setelah memastikan manifestnya, kita akan menyimpannya ke file secret.yaml
dengan perintah berikut:
$ kubectl create secret generic my-secret \
--from-literal=SECRET_KEY1=SECRET_VALUE1 \
--from-literal=SECRET_KEY2=SECRET_VALUE2 \
--dry-run=client -o yaml > secret.yaml
Membuat Secret dari Manifest
Kemudian, kita dapat menerapkan manifest tersebut menggunakan kubectl apply
untuk membuat Secret:
$ kubectl apply -f secret.yaml
secret/my-secret created
Menampilkan dan Memeriksa Informasi Secret
Setelah Secret dibuat, Anda dapat menampilkan informasinya dalam format YAML atau memeriksa detailnya dengan perintah berikut:
$ kubectl get secret -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"SECRET_KEY1":"U0VDUkVUX1ZBTFVFMQ==","SECRET_KEY2":"U0VDUkVUX1ZBTFVFMg=="},"kind":"Secret","metadata":{"annotations":{},"creationTimestamp":null,"name":"my-secret","namespace":"default"}}
creationTimestamp: "2022-06-25T02:01:34Z"
name: my-secret
namespace: default
resourceVersion: "644"
uid: f46d9fae-afeb-46e5-8fbd-eff006a59993
type: Opaque
kind: List
metadata:
resourceVersion: ""
$ kubectl describe secret my-secret
Name: my-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
SECRET_KEY2: 13 bytes
SECRET_KEY1: 13 bytes
Mendekode Secret
Ingat, nilai-nilai Secret dienkripsi dalam format Base64, bukan terenkripsi. Ini berarti siapa pun yang memiliki akses ke data yang terenkripsi dapat mendekode dan mendapatkan nilai-nilai aslinya:
$ echo U0VDUkVUX1ZBTFVFMQ== | base64 --decode
SECRET_VALUE1
Ini akan menampilkan nilai asli dari kunci Secret kita.
Mounting Secret sebagai Volume di Pod
Di sini, saya akan menunjukkan cara menggabungkan Secret di Kubernetes sebagai volume di dalam Pod. Kita akan menggunakan Secret yang telah kita buat pada bab sebelumnya.
Mendefinisikan Referensi ke Secret dalam Manifest Pod
Kita mulai dengan mendefinisikan manifest Pod di mana kita menentukan cara menggunakan Secret. Di sini, kita akan memasang Secret sebagai volume di dalam Pod. Berikut contoh manifest Pod yang mencakup referensi ke Secret my-secret
:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: helloworld-secret-volume
name: helloworld-secret-volume
spec:
containers:
- image: bhargavshah86/kube-test:v0.1
name: helloworld-secret-volume
ports:
- containerPort: 8080
resources: {}
volumeMounts:
# Specify the volume name
- name: my-secret-volume
# Specify the path in the container where the volume should be mounted
mountPath: /my-secret
readOnly: true
volumes:
# Specify the volume name to be created
- name: my-secret-volume
secret:
# Specify the Secret name
secretName: my-secret
status: {}
Membuat Pod
Setelah mendefinisikan manifest Pod, kita dapat membuat Pod dengan perintah berikut:
$ kubectl apply -f pod_secret_volume.yaml
Memeriksa Nilai Secret di dalam Pod
Setelah Pod berjalan, kita dapat memeriksa nilai Secret di dalam Pod dengan perintah berikut:
$ kubectl exec -it helloworld-secret-volume -- cat /my-secret/SECRET_KEY1
SECRET_VALUE1%
Ini akan menampilkan nilai asli dari Secret, menunjukkan bahwa Secret berhasil dipasang sebagai volume di dalam Pod dan dapat digunakan oleh aplikasi yang berjalan di dalam Pod.