Mendistribusikan Kredensial dengan Aman Menggunakan Secret
Laman ini menjelaskan bagaimana cara menginjeksi data sensitif, seperti kata sandi (password) dan kunci enkripsi, ke dalam Pod.
Sebelum kamu memulai
Kamu harus memiliki klaster Kubernetes, dan perangkat baris perintah kubectl juga harus dikonfigurasikan untuk berkomunikasi dengan klastermu. Jika kamu belum memiliki klaster, kamu dapat membuatnya dengan menggunakan minikube, atau kamu juga dapat menggunakan salah satu dari tempat mencoba Kubernetes berikut ini:
Mengubah data rahasia kamu ke dalam representasi Base64
Misalnya kamu mempunyai dua buah data rahasia: sebuah nama pengguna my-app
dan kata sandi
39528$vdg7Jb
. Pertama, gunakan alat penyandian Base64 untuk mengubah nama pengguna kamu dan kata sandi ke dalam representasi Base64. Berikut ini contoh menggunakan program Base64 yang umum digunakan:
echo -n 'my-app' | base64
echo -n '39528$vdg7Jb' | base64
Hasil keluaran menampilkan representasi Base64 dari nama pengguna kamu yaitu bXktYXBw
,
dan representasi Base64 dari kata sandi kamu yaitu Mzk1MjgkdmRnN0pi
.
Perhatian: Gunakan alat yang telah dipercayai oleh OS kamu untuk menghindari risiko dari penggunaan alat eksternal.
Membuat Secret
Berikut ini adalah berkas konfigurasi yang dapat kamu gunakan untuk membuat Secret yang akan menampung nama pengguna dan kata sandi kamu:
apiVersion: v1
kind: Secret
metadata:
name: test-secret
data:
username: bXktYXBw
password: Mzk1MjgkdmRnN0pi
-
Membuat Secret
kubectl apply -f https://k8s.io/examples/pods/inject/secret.yaml
-
Melihat informasi dari Secret:
kubectl get secret test-secret
Hasil keluaran:
NAME TYPE DATA AGE test-secret Opaque 2 1m
-
Melihat informasi detil dari Secret:
kubectl describe secret test-secret
Hasil keluaran:
Name: test-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 13 bytes username: 7 bytes
Membuat Secret langsung dengan kubectl
Jika kamu ingin melompati langkah penyandian dengan Base64, kamu dapat langsung membuat Secret yang sama dengan menggunakan perintah kubectl create secret
. Contohnya:
kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'
Tentu saja ini lebih mudah. Pendekatan yang mendetil setiap langkah di atas bertujuan untuk mendemonstrasikan apa yang sebenarnya terjadi pada setiap langkah.
Membuat Pod yang memiliki akses ke data Secret melalui Volume
Berikut ini adalah berkas konfigurasi yang dapat kamu gunakan untuk membuat Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
# nama harus sesuai dengan nama Volume di bawah ini
- name: secret-volume
mountPath: /etc/secret-volume
# Data Secret diekspos ke Container di dalam Pod melalui Volume
volumes:
- name: secret-volume
secret:
secretName: test-secret
-
Membuat Pod:
kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml
-
Verifikasikan apakah Pod kamu sudah berjalan:
kubectl get pod secret-test-pod
Hasil keluaran:
NAME READY STATUS RESTARTS AGE secret-test-pod 1/1 Running 0 42m
-
Gunakan shell untuk masuk ke dalam Container yang berjalan di dalam Pod kamu:
kubectl exec -i -t secret-test-pod -- /bin/bash
-
Data Secret terekspos ke Container melalui Volume yang dipasang (mount) pada
/etc/secret-volume
.Di dalam shell kamu, tampilkan berkas yang ada di dalam direktori
/etc/secret-volume
:# Jalankan ini di dalam shell dalam Container ls /etc/secret-volume
Hasil keluaran menampilkan dua buah berkas, masing-masing untuk setiap data Secret:
password username
-
Di dalam shell kamu, tampilkan konten dari berkas
username
danpassword
:# Jalankan ini di dalam shell dalam Container echo "$( cat /etc/secret-volume/username )" echo "$( cat /etc/secret-volume/password )"
Hasil keluarannya adalah nama pengguna dan kata sandi kamu:
my-app 39528$vdg7Jb
Mendefinisikan variabel lingkungan Container menggunakan data Secret
Mendefinisikan variabel lingkungan Container menggunakan data dari Secret tunggal
-
Definisikan variabel lingkungan sebagai pasangan key-value pada Secret:
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
-
Tentukan nilai
backend-username
yang didefinisikan di Secret ke variabel lingkunganSECRET_USERNAME
di dalam spesifikasi Pod.apiVersion: v1 kind: Pod metadata: name: env-single-secret spec: containers: - name: envars-test-container image: nginx env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username
-
Membuat Pod:
kubectl create -f https://k8s.io/examples/pods/inject/pod-single-secret-env-variable.yaml
-
Di dalam shell kamu, tampilkan konten dari variabel lingkungan
SECRET_USERNAME
dari Containerkubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME'
Hasil keluarannya
backend-admin
Mendefinisikan variabel lingkungan Container dengan data dari multipel Secret
-
Seperti contoh sebelumnya, buat Secret terlebih dahulu.
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' kubectl create secret generic db-user --from-literal=db-username='db-admin'
-
Definisikan variabel lingkungan di dalam spesifikasi Pod.
apiVersion: v1 kind: Pod metadata: name: envvars-multiple-secrets spec: containers: - name: envars-test-container image: nginx env: - name: BACKEND_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username - name: DB_USERNAME valueFrom: secretKeyRef: name: db-user key: db-username
-
Membuat Pod:
kubectl create -f https://k8s.io/examples/pods/inject/pod-multiple-secret-env-variable.yaml
-
Di dalam shell kamu, tampilkan konten dari variabel lingkungan Container
kubectl exec -i -t envvars-multiple-secrets -- /bin/sh -c 'env | grep _USERNAME'
Hasil keluarannya
DB_USERNAME=db-admin BACKEND_USERNAME=backend-admin
Mengonfigurasi semua pasangan key-value di dalam Secret sebagai variabel lingkungan Container
Catatan: Fitur ini tersedia mulai dari Kubernetes v1.6 dan yang lebih baru.
-
Membuat Secret yang berisi banyak pasangan key-value
kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb'
-
Gunakan envFrom untuk mendefinisikan semua data Secret sebagai variabel lingkungan Container. Key dari Secret akan mennjadi nama variabel lingkungan di dalam Pod.
apiVersion: v1 kind: Pod metadata: name: envfrom-secret spec: containers: - name: envars-test-container image: nginx envFrom: - secretRef: name: test-secret
-
Membuat Pod:
kubectl create -f https://k8s.io/examples/pods/inject/pod-secret-envFrom.yaml
-
Di dalam shell kamu, tampilkan variabel lingkungan Container
username
danpassword
kubectl exec -i -t envfrom-secret -- /bin/sh -c 'echo "username: $username\npassword: $password\n"'
Hasil keluarannya
username: my-app password: 39528$vdg7Jb