instruction: Create a Kubernetes configuration with Pod, Secret resources
output: ```yaml
  apiVersion: v1
  kind: Secret
  metadata:
   creationTimestamp: 2016-01-22T18:41:56Z
   name: mysecret
   namespace: default
   resourceVersion: "164619"
   selfLink: /api/v1/namespaces/default/secrets/mysecret
   uid: cfee02d6-c137-11e5-8d73-42010af00002
  type: Opaque
  data:
   username: YWRtaW4=
   password: MWYyZDFlMmU2N2Rm
  Kemudian lakukan mekanisme decode field password:echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
  1f2d1e2e67df
  Menggunakan SecretSecret dapat di-mount sebagai volume data atau dapat diekspos sebagai variabel-variabel environment
  dapat digunakan di dalam Pod. Secret ini juga dapat digunakan secara langsug
  oleh bagian lain dari sistem, tanpa secara langsung berkaitan dengan Pod.
  Sebagai contoh, Secret dapat berisikan kredensial bagian suatu sistem lain yang digunakan
  untuk berinteraksi dengan sistem eksternal yang kamu butuhkan.Menggunakan Secret sebagai File melalui PodBerikut adalah langkah yang harus kamu penuhi agar kamu dapat menggunakan Secret di dalam volume dalam sebuah Pod:Buatlah sebuah Secret, atau gunakan sebuah Secret yang sudah kamu buat sebelumnya. Beberapa Pod dapat merujuk pada sebuah Secret yang sama.Modifikasi definisi Pod kamu dengan cara menambahkan sebuah volume di bawah .spec.volumes[]. Berilah volume tersebut nama, dan pastikan field .spec.volumes[].secret.secretName merujuk pada nama yang sama dengan objek secret.Tambahkan field .spec.containers[].volumeMounts[] pada setiap container yang membutuhkan Secret. Berikan spesifikasi .spec.containers[].volumeMounts[].readOnly = true dan .spec.containers[].volumeMounts[].mountPath pada direktori dimana Secret tersebut diletakkan.Modifikasi image dan/atau command line kamu agar program yang kamu miliki merujuk pada file di dalam direktori tersebut. Setiap key pada map data Secret akan menjadi nama dari sebuah file pada mountPath.Berikut merupakan salah satu contoh dimana sebuah Pod melakukan proses mount Secret pada sebuah volume:apiVersion: v1
  kind: Pod
  metadata:
   name: mypod
  spec:
   containers:
   - name: mypod
   image: redis
   volumeMounts:
   - name: foo
   mountPath: "/etc/foo"
   readOnly: true
   volumes:
   - name: foo
   secret:
   secretName: mysecret
  Setiap Secret yang ingin kamu gunakan harus dirujuk pada field .spec.volumes.Jika terdapat lebih dari satu container di dalam Pod,
  maka setiap container akan membutuhkan blok volumeMounts-nya masing-masing,
  meskipun demikian hanya sebuah field .spec.volumes yang dibutuhkan untuk setiap Secret.Kamu dapat menyimpan banyak file ke dalam satu Secret,
  atau menggunakan banyak Secret, hal ini tentunya bergantung pada preferensi pengguna.Proyeksi key Secret pada Suatu Path SpesifikKita juga dapat mengontrol path di dalam volume di mana sebuah Secret diproyeksikan.
  Kamu dapat menggunakan field .spec.volumes[].secret.items untuk mengubah
  path target dari setiap key:apiVersion: v1
  kind: Pod
  metadata:
   name: mypod
  spec:
   containers:
   - name: mypod
   image: redis
   volumeMounts:
   - name: foo
   mountPath: "/etc/foo"
   readOnly: true
   volumes:
   - name: foo
   secret:
   secretName: mysecret
   items:
   - key: username
   path: my-group/my-username
  Apa yang akan terjadi jika kita menggunakan definisi di atas:Secret username akan disimpan pada file /etc/foo/my-group/my-username dan bukan /etc/foo/username.Secret password tidak akan diproyeksikan.Jika field .spec.volumes[].secret.items digunakan, hanya key-key yang dispesifikan di dalam
  items yang diproyeksikan. Untuk mengonsumsi semua key-key yang ada dari Secret,
  semua key yang ada harus didaftarkan pada field items.
  Semua key yang didaftarkan juga harus ada di dalam Secret tadi.
  Jika tidak, volume yang didefinisikan tidak akan dibuat.Permission File-File SecretKamu juga dapat menspesifikasikan mode permission dari file Secret yang kamu inginkan.
  Jika kamu tidak menspesifikasikan hal tersebut, maka nilai default yang akan diberikan adalah 0644 is used by default.
  Kamu dapat memberikan mode default untuk semua Secret yang ada serta melakukan mekanisme override permission
  pada setiap key jika memang diperlukan.Sebagai contoh, kamu dapat memberikan spesifikasi mode default sebagai berikut:apiVersion: v1
  kind: Pod
  metadata:
   name: mypod
  spec:
   containers:
   - name: mypod
   image: redis
   volumeMounts:
   - name: foo
   mountPath: "/etc/foo"
   volumes:
   - name: foo
   secret:
   secretName: mysecret
   defaultMode: 256
  Kemudian, sebuah Secret akan di-mount pada /etc/foo, selanjutnya semua file
  yang dibuat pada volume secret tersebut akan memiliki permission 0400.Perhatikan bahwa spesifikasi JSON tidak mendukung notasi octal, dengan demikian gunakanlah
  value 256 untuk permission 0400. Jika kamu menggunakan format YAML untuk spesifikasi Pod,
  kamu dapat menggunakan notasi octal untuk memberikan spesifikasi permission dengan cara yang lebih
  natural.Kamu juga dapat melakukan mekanisme pemetaan, seperti yang sudah dilakukan pada contoh sebelumnya,
  dan kemudian memberikan spesifikasi permission yang berbeda untuk file yang berbeda.apiVersion: v1
  kind: Pod
  metadata:
   name: mypod
  spec:
   containers:
   - name: mypod
   image: redis
   volumeMounts:
   - name: foo
   mountPath: "/etc/foo"
   volumes:
   - name: foo
   secret:
   secretName: mysecret
   items:
   - key: username
   path: my-group/my-username
   mode: 511
  Pada kasus tersebut, file yang dihasilkan pada /etc/foo/my-group/my-username akan memiliki
  permission 0777. Karena terdapat batasan pada representasi JSON, maka kamu
  harus memberikan spesifikasi mode permission dalam bentuk notasi desimal.Perhatikan bahwa permission ini bida saja ditampilkan dalam bentuk notasi desimal,
  hal ini akan ditampilkan pada bagian selanjutnya.Mengonsumsi Value dari Secret melalui VolumeDi dalam sebuah container dimana volume secret di-mount,
  key dari Secret akan ditampilkan sebagai file dan value dari Secret yang berada dalam bentuk
  base64 ini akan di-decode dam disimpan pada file-file tadi.
  Berikut merupakan hasil dari eksekusi perintah di dalam container berdasarkan contoh
  yang telah dipaparkan di atas:ls /etc/foo/
  username
  password
  cat /etc/foo/username
  admin
  cat /etc/foo/password
  1f2d1e2e67df
  Program di dalam container bertanggung jawab untuk membaca Secret
  dari file-file yang ada.Secret yang di-mount Akan Diubah Secara OtomatisKetika sebuah Secret yang sedang digunakan di dalam volume diubah,
  maka key yang ada juga akan diubah. Kubelet akan melakukan mekanisme pengecekan secara periodik
  apakah terdapat perubahan pada Secret yang telah di-mount. Meskipun demikian,
  proses pengecekan ini dilakukan dengan menggunakan cache lokal untuk mendapatkan value saat ini
  dari sebuah Secret. Tipe cache yang ada dapat diatur dengan menggunakan
  (field ConfigMapAndSecretChangeDetectionStrategy pada
  KubeletConfiguration).
  Mekanisme ini kemudian dapat diteruskan dengan mekanisme watch(default), ttl, atau melakukan pengalihan semua
  request secara langsung pada kube-apiserver.
  Sebagai hasilnya, delay total dari pertama kali Secret diubah hingga dilakukannya mekanisme
  proyeksi key yang baru pada Pod berlangsung dalam jangka waktu sinkronisasi periodik kubelet +
  delay propagasi cache, dimana delay propagasi cache bergantung pada jenis cache yang digunakan
  (ini sama dengan delay propagasi watch, ttl dari cache, atau nol).Catatan:Sebuah container menggunakan Secret sebagai
  subPath dari volume
  yang di-mount tidak akan menerima perubahan Secret.Menggunakan Secret sebagai Variabel EnvironmentBerikut merupakan langkah-langkah yang harus kamu terapkan,
  untuk menggunakan secret sebagai variabel _environment_
  pada sebuah Pod:Buatlah sebuah Secret, atau gunakan sebuah Secret yang sudah kamu buat sebelumnya. Beberapa Pod dapat merujuk pada sebuah Secret yang sama.Modifikasi definisi Pod pada setiap container dimana kamu menginginkan container tersebut dapat mengonsumsi your Pod definition in each container that you wish to consume the value of a secret key to add an environment variabele for each secret key you wish to consume. The environment variabele that consumes the secret key should populate the secret's name and key in env[].valueFrom.secretKeyRef.Modifikasi image dan/atau command line kamu agar program yang kamu miliki merujuk pada value yang sudah didefinisikan pada variabel environment.Berikut merupakan contoh dimana sebuah Pod menggunakan Secret sebagai variabel environment: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
  Menggunakan Secret dari Variabel EnvironmentDi dalam sebuah container yang mengkonsumsi Secret pada sebuah variabel environment, key dari sebuah secret
  akan ditampilkan sebagai variabel environment pada umumnya dengan value berupa informasi yang telah di-decode
  ke dalam base64. Berikut merupakan hasil yang didapatkan apabila perintah-perintah di bawah ini
  dijalankan dari dalam container yang didefinisikan di atas:echo $SECRET_USERNAME
  admin
  echo $SECRET_PASSWORD
  1f2d1e2e67df
  Menggunakan imagePullSecretsSebuah imagePullSecret merupakan salah satu cara yang dapat digunakan untuk menempatkan secret
  yang mengandung password dari registri Docker (atau registri image lainnya)
  pada Kubelet, sehingga Kubelet dapat mengunduh image dan menempatkannya pada Pod.Memberikan spesifikasi manual dari sebuah imagePullSecretPenggunaan imagePullSecrets dideskripsikan di dalam dokumentasi imageMekanisme yang Dapat Diterapkan agar imagePullSecrets dapat Secara Otomatis DigunakanKamu dapat secara manual membuat sebuah imagePullSecret, serta merujuk imagePullSecret
  yang sudah kamu buat dari sebuah serviceAccount. Semua Pod yang dibuat dengan menggunakan
  serviceAccount tadi atau serviceAccount default akan menerima field imagePullSecret dari
  serviceAccount yang digunakan.
  Bacalah Cara menambahkan ImagePullSecrets pada sebuah service account
  untuk informasi lebih detail soal proses yang dijalankan.Mekanisme Mounting Otomatis dari Secret yang Sudah DibuatSecret yang dibuat secara manual (misalnya, secret yang mengandung token yang dapat digunakan
  untuk mengakses akun GitHub) dapat di-mount secara otomatis pada sebuah Pod berdasarkan service account
  yang digunakan oleh Pod tadi.
  Baca Bagaimana Penggunaan PodPreset untuk Memasukkan Informasi ke Dalam Pod untuk informasi lebih lanjut.DetailBatasan-BatasanSumber dari secret volume akan divalidasi untuk menjamin rujukan pada
  objek yang dispesifikasikan mengarah pada objek dengan type Secret.
  Oleh karenanya, sebuah secret harus dibuat sebelum Pod yang merujuk pada secret
  tersebut dibuat.Sebuah objek API Secret berada di dalam sebuah namespace.
  Objek-objek ini hanya dapat dirujuk oleh Pod-Pod yang ada pada namespace yang sama.Secret memiliki batasi dalam hal ukuran maksimalnya yaitu hanya sampai 1MiB per objek.
  Oleh karena itulah, pembuatan secret dalam ukuran yang sangat besar tidak dianjurkan
  karena dapat menghabiskan sumber daya apiserver dan memori kubelet. Meskipun demikian,
  pembuatan banyak secret dengan ukuran kecil juga dapat menhabiskan memori. Pembatasan
  sumber daya yang diizinkan untuk pembuatan secret merupakan salah satu fitur tambahan
  yang direncanakan kedepannya.Kubelet hanya mendukung penggunaan secret oleh Pod apabila Pod tersebut
  didapatkan melalui apiserver. Hal ini termasuk Pod yang dibuat dengan menggunakan
  kubectl, atau secara tak langsung melalui replication controller. Hal ini tidak
  termasuk Pod yang dibuat melalui flag --manifest-url yang ada pada kubelet,
  maupun REST API yang disediakan (hal ini bukanlah merupakan mekanisme umum yang dilakukan
  untuk membuat sebuah Pod).Secret harus dibuat sebelum digunakan oleh Pod sebagai variabel environment,
  kecuali apabila variabel environment ini dianggap opsional. Rujukan pada Secret
  yang tidak dapat dipenuhi akan menyebabkan Pod gagal start.Rujukan melalui secretKeyRef pada key yang tidak ada pada named Secret
  akan akan menyebabkan Pod gagal start.Secret yang digunakan untuk memenuhi variabel environment melalui envFrom yang
  memiliki key yang dianggap memiliki penamaan yang tidak valid akan diabaikan.
  Hal ini akan akan menyebabkan Pod gagal start. Selanjutnya akan terdapat event
  dengan alasan InvalidvariabeleNames dan pesan yang berisikan list dari
  key yang diabaikan akibat penamaan yang tidak valid. Contoh yang ada akan menunjukkan
  sebuah pod yang merujuk pada secret default/mysecret yang mengandung dua buah key
  yang tidak valid, yaitu 1badkey dan 2alsobad.kubectl get events
  LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON
  0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentvariabeleNames kubelet, 127.0.0.1 Keys [1badkey, 2alsobad] from the EnvFrom secret default/mysecret were skipped since they are considered invalid environment variabele names.
  Interaksi Secret dan Pod LifetimeKetika sebuah pod dibuat melalui API, tidak terdapat mekanisme pengecekan
  yang digunakan untuk mengetahui apakah sebuah Secret yang dirujuk sudah dibuat
  atau belum. Ketika sebuah Pod di-schedule, kubelet akan mencoba mengambil
  informasi mengenai value dari secret tadi. Jika secret tidak dapat diambil
  value-nya dengan alasan temporer karena hilangnya koneksi ke API server atau
  secret yang dirujuk tidak ada, kubelet akan melakukan mekanisme retry secara periodik.
  Kubelet juga akan memberikan laporan mengenai event yang terjadi pada Pod serta alasan
  kenapa Pod tersebut belum di-start. Apabila Secret berhasil didapatkan, kubelet
  akan membuat dan me-mount volume yang mengandung secret tersebut. Tidak akan ada
  container dalam pod yang akan di-start hingga semua volume pod berhasil di-mount.Contoh-Contoh PenggunaanContoh Penggunaan: Pod dengan ssh keyBuatlah sebuah kustomization.yaml dengan SecretGenerator yang mengandung beberapa ssh key:kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=/path/to/.ssh/id_rsa --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub
  secret "ssh-key-secret" created
  Perhatian:Pikirkanlah terlebih dahulu sebelum kamu menggunakan ssh key milikmu sendiri: pengguna lain pada klaster tersebut bisa saja memiliki akses pada secret yang kamu definisikan.
  Gunakanlah service account untuk membagi informasi yang kamu inginkan di dalam klaster tersebut, dengan demikian kamu dapat membatalkan service account tersebut apabila secret tersebut disalahgunakan.Sekarang, kita dapat membuat sebuah pod yang merujuk pada secret dengan ssh key yang sudah
  dibuat tadi serta menggunakannya melalui sebuah volume yang di-mount:apiVersion: v1
  kind: Pod
  metadata:
   name: secret-test-pod
   labels:
   name: secret-test
  spec:
   volumes:
   - name: secret-volume
   secret:
   secretName: ssh-key-secret
   containers:
   - name: ssh-test-container
   image: mySshImage
   volumeMounts:
   - name: secret-volume
   readOnly: true
   mountPath: "/etc/secret-volume"
  Ketika sebuah perintah dijalankan di dalam container, bagian dari key tadi akan
  terdapat pada:/etc/secret-volume/ssh-publickey
  /etc/secret-volume/ssh-privatekey
  container kemudian dapat menggunakan secret secara bebas untuk
  membuat koneksi ssh.Contoh Penggunaan: Pod dengan kredensial prod / testContoh ini memberikan ilustrasi pod yang mengonsumsi secret yang mengandung
  kredensial dari environment production atau environment test.Buatlah suatu kustomization.yaml dengan SecretGeneratorkubectl create secret generic prod-db-secret --from-literal=username=produser --from-literal=password=Y4nys7f11
  secret "prod-db-secret" created
  kubectl create secret generic test-db-secret --from-literal=username=testuser --from-literal=password=iluvtests
  secret "test-db-secret" created
  Catatan:Karakter spesial seperti $, \*, dan ! membutuhkan mekanisme escaping.
  Jika password yang kamu gunakan memiliki karakter spesial, kamu dapat melakukan mekanisme escape
  dengan karakter \\ character. Sebagai contohnya, jika password kamu yang sebenarnya adalah
  S!B\*d$zDsb, maka kamu harus memanggil perintah eksekusi dengan cara sebagai berikut:kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\\!B\\\*d\\$zDsb
  Kamu tidak perlu melakukan mekanisme escape karakter apabila menggunakan opsi melalui file (--from-file).Kemudian buatlah Pod-Pod yang dibutuhkan:$ cat <<EOF > pod.yaml
  ```