Traffine I/O

Bahasa Indonesia

2022-07-01

Kubernetes Secret

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:

bash
$ 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:

bash
$ 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:

bash
$ 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:

bash
$ 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:

bash
$ 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: ""
bash
$ 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:

bash
$ 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:

pod_secret_volume.yaml
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:

bash
$ 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:

bash
$ 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.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!