Gadgets

Menguasai `kubectl cp`: Panduan Lengkap Menyalin File ke dan Dari Pod Kubernetes untuk Efisiensi dan Keamanan

IIstiyanto
41 views
Menguasai `kubectl cp`: Panduan Lengkap Menyalin File ke dan Dari Pod Kubernetes untuk Efisiensi dan Keamanan

Menguasai kubectl cp: Panduan Lengkap Menyalin File ke dan Dari Pod Kubernetes untuk Efisiensi dan Keamanan

Menyebarkan aplikasi di Kubernetes (K8s) sering terasa seperti berjalan di atas tali. Satu langkah yang salah dapat menyebabkan aplikasi tidak berfungsi, pod macet, atau tim terjebak dalam debugging selama berjam-jam. Jika ini terdengar akrab, Anda tidak sendirian. Laporan CNCF 2023 menunjukkan bahwa 66% pengguna menggunakan Kubernetes untuk produksi, dan mayoritas menghadapi kompleksitas K8s. Namun, banyak kesalahan dapat dicegah jika Anda tahu apa yang harus dicari.

Dalam panduan ini, kita akan menjelajahi kubectl cp, sebuah perintah penting yang memungkinkan Anda menyalin file dan folder antara mesin lokal Anda dan pod Kubernetes. Memahami cara menggunakannya dengan benar dapat menghemat waktu dan mengurangi sakit kepala dalam manajemen aplikasi K8s Anda.

Prasyarat dan Konteks

Sebelum kita masuk lebih dalam, mari pastikan Anda siap. Anda tidak perlu menjadi ahli Kubernetes, tetapi beberapa dasar akan membantu Anda mengikuti:

  • Cluster Kubernetes: Baik lokal (misalnya, Minikube) atau berbasis cloud.
  • kubectl terinstal: Di mesin lokal Anda.
  • Pemahaman dasar tentang file YAML: Konsep dasar tentang bagaimana YAML digunakan untuk mendeskripsikan konfigurasi di Kubernetes.
  • Aplikasi untuk di-deploy: Bahkan aplikasi “Hello World” sederhana pun cukup.
  • Kenyamanan dengan baris perintah: Familiaritas dasar dengan terminal.

Dengan ini, Anda siap untuk memulai!

Sintaks Dasar kubectl cp

Perintah kubectl cp memungkinkan Anda menyalin file dan folder antara mesin lokal Anda dan pod Kubernetes. Ini seperti menggunakan USB stick, tetapi untuk kontainer Anda. Di balik layar, perintah ini menggunakan utilitas tar untuk mengemas dan mentransfer file. Oleh karena itu, baik mesin Anda maupun kontainer harus mendukung operasi tar dasar agar berfungsi dengan lancar.

Pola Sumber dan Tujuan

Pola dasar terlihat seperti ini:

kubectl cp <sumber> <tujuan>

Namun, ketika Anda menyalin ke atau dari pod, Anda perlu menyertakan <namespace>/<nama-pod>:<jalur>.

Contoh:

  • Menyalin file dari mesin lokal Anda ke pod:

    kubectl cp ./fileku.txt default/mypod:/app/fileku.txt
    
  • Menyalin file dari pod ke mesin Anda:

    kubectl cp default/mypod:/app/log.txt ./log.txt
    

Flag Penting (-c, -n, --retries, --no-preserve)

Ada beberapa flag yang sangat berguna untuk kubectl cp yang akan kita bahas di bagian-bagian selanjutnya, termasuk untuk menentukan kontainer (-c), namespace (-n), atau opsi terkait metadata.

Kasus Penggunaan Umum kubectl cp

Mari kita lihat beberapa cara umum yang digunakan pengembang untuk kubectl cp. Baik Anda memindahkan file konfigurasi ke pod, mengambil log dari pod, atau menyalin data antar-pod, perintah ini dapat menghemat waktu dan mengatasi masalah.

Menyalin File Lokal ke Pod

Untuk mengirim file dari laptop Anda ke dalam pod:

kubectl cp ./fileku.txt default/mypod:/app/fileku.txt

Ini berguna ketika:

  • Anda memperbarui file konfigurasi.
  • Anda perlu memasukkan skrip atau binary.
  • Anda ingin menguji sesuatu dengan cepat.

Menyalin File dari Pod ke Lokal

Jika Anda perlu mengunduh sesuatu dari pod, cukup balikkan urutannya:

kubectl cp default/mypod:/app/log.txt ./log.txt

Ini sangat baik untuk:

  • Menyimpan log untuk debugging.
  • Mengambil file output.
  • Mencadangkan file konfigurasi.

Penyalinan Antar-Pod via Mesin Lokal (Hop Lokal)

Kubernetes tidak mendukung penyalinan langsung antar-pod. Tetapi ada triknya:

  1. Salin file dari Pod A ke mesin lokal Anda:

    kubectl cp default/pod-a:/data/file.txt ./file.txt
    
  2. Kemudian salin dari mesin lokal Anda ke Pod B:

    kubectl cp ./file.txt default/pod-b:/data/file.txt
    

Ini adalah proses dua langkah yang efektif ketika:

  • Anda memigrasikan data antar layanan.
  • Anda perlu menyinkronkan file pengaturan atau log.

Menyalin Direktori dan Transfer Rekursif

Kadang-kadang, Anda perlu memindahkan banyak file, bukan hanya satu. kubectl cp juga dapat menangani direktori.

  • Menyalin folder dari lokal ke pod:

    kubectl cp ./folderku default/mypod:/app/folderku
    
  • Menyalin folder dari pod ke mesin lokal Anda:

    kubectl cp default/mypod:/app/folderku ./folderku
    

Menangani Direktori Besar dengan Efisien

Direktori besar dapat memperlambat transfer atau menyebabkan timeout. Untuk kelancaran, metode ini sangat cocok ketika:

  • Anda memindahkan banyak file kecil.
  • Anda perlu mengunggah folder proyek lengkap.
  • Anda ingin menghindari timeout transfer.

Bekerja dengan Pod Multikontainer

Beberapa pod memiliki lebih dari satu kontainer di dalamnya. Secara default, kubectl cp tidak tahu kontainer mana yang Anda maksud. Jadi, Anda perlu memberitahunya.

Memilih Kontainer yang Tepat

Gunakan flag -c untuk menentukan nama kontainer yang ingin Anda gunakan:

kubectl cp -c kontainer-saya ./file.txt default/mypod:/app/

Ini memberi tahu Kubernetes: “Hei, salin file ini ke kontainer-saya di dalam mypod.” Anda biasanya memerlukan ini ketika:

  • Anda bekerja dengan sidecar containers (misalnya, satu untuk log dan satu untuk aplikasi).
  • Anda hanya ingin menargetkan satu kontainer spesifik dalam pod.
  • Perintah kubectl cp Anda gagal tanpa flag ini.

Menyalin Antar Namespace dan Konteks

Cluster Kubernetes sering kali memiliki banyak namespace (seperti folder) dan konteks (seperti lingkungan yang berbeda). Jika Anda tidak menentukan yang benar, perintah Anda tidak akan menemukan pod.

Cara Menanganinya:

  • Gunakan -n untuk memilih namespace yang benar:

    kubectl cp -n namespace-kustom ./file.txt mypod:/app/
    
  • Gunakan --context jika Anda bekerja di cluster yang berbeda:

    kubectl --context=cluster-saya cp ./file.txt default/mypod:/app/
    
  • Periksa konteks dan namespace Anda saat ini:

    kubectl config get-contexts
    kubectl config view --minify | grep namespace
    

Flag kecil ini membuat perbedaan besar ketika Anda menangani pengaturan pengembangan, staging, dan produksi.

Menangani Symlink, Izin, dan Metadata Terjaga

Perintah kubectl cp mencoba menyalin apa adanya, tetapi ada beberapa hal yang dapat menyebabkan masalah jika Anda tidak berhati-hati:

  • Symlink mungkin rusak: Symlink (file pintasan) mungkin tidak berfungsi seperti yang diharapkan setelah disalin. Periksa kembali jalurnya di dalam pod.

  • Izin mungkin tidak cocok: Izin file (siapa yang dapat membaca/menulis) dapat berubah setelah menyalin. Gunakan kubectl exec dan chmod di dalam pod jika diperlukan.

  • Timestamp dipertahankan secara default: File mempertahankan waktu “dibuat” dan “dimodifikasi” aslinya. Untuk menonaktifkan ini, gunakan flag --no-preserve:

    kubectl cp --no-preserve ./file.txt default/mypod:/app/
    
  • File yang dapat dieksekusi mungkin kehilangan izin: Jika skrip atau binary Anda tidak berfungsi di dalam pod, periksa apakah masih ditandai sebagai dapat dieksekusi:

    kubectl exec -it mypod -- chmod +x /app/skripku.sh
    

Menyalin file terdengar sederhana, tetapi detailnya penting, terutama saat Anda memecahkan masalah perilaku aneh.

Memecahkan Masalah kubectl cp

Kadang-kadang, kubectl cp tidak berfungsi seperti yang Anda harapkan. Mari kita bahas beberapa kesalahan paling umum dan cara memperbaikinya.

Permission Denied dan Read-Only File System

Kesalahan:

tar: ./file.txt: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors

Artinya:

Anda mencoba menyalin file ke folder tempat kontainer tidak memiliki akses tulis. Sistem file kontainer mungkin read-only, atau pengguna Anda di dalam pod tidak memiliki izin.

Cara memperbaikinya:

  • Coba salin ke folder yang berbeda, seperti /tmp, yang biasanya dapat ditulis:

    kubectl cp ./file.txt default/mypod:/tmp/
    
  • Atau, masuk ke pod dan ubah izin (jika diizinkan):

    kubectl exec -it mypod -- chmod 777 /folder/tujuan
    

Catatan: Dalam pod produksi, mengubah izin mungkin tidak diizinkan, dan itu disengaja demi keamanan.

No Such File or Directory

Kesalahan:

error: one of src or dest must be a local file specification

Atau:

tar: /app/file.txt: No such file or directory

Artinya:

Jalur file atau folder tidak ada — baik di mesin Anda maupun di dalam pod. Atau, Anda salah mengeja nama pod, nama kontainer, atau namespace.

Cara memperbaikinya:

  • Periksa kembali jalur sumber dan tujuan Anda. Gunakan kubectl exec untuk memeriksa pod:

    kubectl exec -it mypod -- ls /app/
    
  • Pastikan Anda menargetkan namespace yang benar:

    kubectl cp -n namespace-saya ./file.txt mypod:/app/
    
  • Gunakan kubectl get pods untuk mengonfirmasi nama pod.

Unexpected Tar Format Errors

Kesalahan:

unexpected tar header error

Artinya:

Perintah kubectl cp mengandalkan tar di balik layar. Jika tar tidak terinstal di kontainer — atau jika versinya terlalu berbeda — semuanya akan rusak.

Cara memperbaikinya:

  • Periksa apakah tar ada di dalam pod:

    kubectl exec -it mypod -- which tar
    
  • Jika tar tidak ada, Anda tidak akan dapat menggunakan kubectl cp. Anda memiliki dua pilihan:

    • Instal tar, jika memungkinkan dan aman untuk melakukannya.
    • Gunakan alternatif seperti kombinasi tar + exec (dijelaskan di bawah!).

Tips Performa dan Alternatif

Jika Anda memindahkan file besar atau banyak file, kubectl cp bisa lambat atau tidak stabil. Berikut adalah beberapa tips yang menawarkan alternatif yang lebih cepat dan andal.

Menggunakan tar Melalui kubectl exec untuk File Besar

Alih-alih kubectl cp, coba buat arsip tar sendiri dan dorong menggunakan kubectl exec. Ini menghindari banyak bug yang terkait dengan kubectl cp.

Contoh: Menyalin ke pod

  1. Kompres file Anda:

    tar -czf files.tar.gz folderku/
    
  2. Salin arsip:

    kubectl cp ./files.tar.gz default/mypod:/tmp/
    
  3. Buka kemasan di dalam pod:

    kubectl exec -it mypod -- tar -xzf /tmp/files.tar.gz -C /app/
    

Metode ini bekerja lebih baik karena:

  • Memiliki lebih sedikit file untuk ditransfer, yang berarti transfer lebih cepat.
  • Menawarkan lebih banyak kontrol tentang bagaimana isinya dibuka kemasan.
  • Berfungsi bahkan jika kubectl cp tidak stabil.

Memanfaatkan rsync via kubectl port-forward

Jika Anda menginginkan sinkronisasi file super cepat, coba rsync — alat transfer file yang kuat. Ini tidak terpasang di Kubernetes, tetapi Anda dapat melakukan port-forward ke kontainer yang menjalankan rsync, lalu mendorong file secara langsung.

Berikut cara Anda melakukannya:

  1. Jalankan rsync di dalam kontainer, baik menginstalnya atau menggunakan image kustom yang memilikinya.

  2. Port-forward untuk mengekspos rsync:

    kubectl port-forward pod/mypod 8730:873
    
  3. Gunakan rsync dari mesin Anda untuk mendorong file:

    rsync -av ./folderku rsync://localhost:8730/app/
    

Metode ini bekerja dengan baik karena:

  • Cepat dan efisien untuk banyak file.
  • Hanya mentransfer apa yang berubah, yang menghemat waktu.
  • Sangat bagus untuk menyinkronkan folder selama pengembangan.

Meskipun demikian, Anda akan memerlukan kontainer dengan rsync terinstal dan aturan keamanan yang memungkinkan port-forwarding.

Pertimbangan Keamanan

Menyalin file ke dalam dan keluar pod mungkin tampak tidak berbahaya, tetapi dapat membuka pintu risiko jika Anda tidak hati-hati. Mari kita lihat dua area kunci: Izin dan keamanan data.

Aturan RBAC untuk Operasi Penyalinan

Kubernetes menggunakan Role-Based Access Control (RBAC) untuk memutuskan siapa yang dapat melakukan apa. Menyalin file dengan kubectl cp melibatkan tindakan seperti:

  • Membaca dari pod (get)
  • Menulis ke pod (update)
  • Mengeksekusi perintah di dalam kontainer (melalui tar, memerlukan exec)

Jadi, untuk menggunakan kubectl cp, Anda harus memiliki izin untuk get, list, dan exec pod di namespace yang benar. Jika Anda melihat kesalahan akses ditolak, kemungkinan pengguna atau service account Anda tidak memiliki hak ini. Seorang admin dapat memperbaikinya dengan memperbarui Role atau ClusterRole bindings.

Pro tip: Selalu ikuti prinsip least privilege, yaitu, berikan hanya akses yang diperlukan dan tidak lebih.

Menghindari Kebocoran Data Sensitif

Menyalin file dapat secara tidak sengaja mengekspos rahasia jika Anda tidak memperhatikan. Berikut cara agar tetap aman:

  • Jangan pernah menyalin file ke /etc, /secrets, atau direktori sistem pod kecuali Anda tahu persis apa yang Anda lakukan.
  • Jangan menyalin rahasia keluar dari pod, seperti sertifikat TLS, file konfigurasi sensitif, atau file .env.
  • Tinjau konten file sebelum menyalin, terutama saat menggunakan perintah wildcard atau seluruh direktori.
  • Audit siapa yang memiliki akses ke kubectl cp, dan pastikan pengembang tidak menyalin file sensitif ke pod bersama atau produksi.

Pro tip: Jika Anda bekerja dengan file sensitif (seperti kunci, sertifikat, atau kata sandi), gunakan Kubernetes Secrets sebagai gantinya. Itu dirancang untuk tujuan tersebut.

Mengotomatiskan Penyalinan File dalam Pipeline CI/CD

Dalam pipeline CI/CD, langkah manual adalah musuh. Anda ingin semuanya, termasuk transfer file, berjalan secara otomatis dan andal.

Menggunakan kubectl cp dalam pipeline Anda berfungsi untuk tugas dasar, tetapi ada beberapa hal yang perlu diingat agar tetap aman dan stabil. Anda mungkin ingin menyalin file selama:

  • Langkah pra-deploy, seperti menyuntikkan file konfigurasi ke dalam pod.
  • Tes pasca-deploy, seperti menarik log atau hasil dari kontainer tes.
  • Migrasi data antara versi aplikasi.

Contoh perintah dalam skrip pipeline:

kubectl cp -n staging ./config.yaml mypod:/app/config.yaml

Dan berikut adalah beberapa hal yang perlu diingat saat mengotomatiskan penyalinan file:

  • Selalu atur namespace dengan -n agar perintah tidak bergantung pada konfigurasi lokal: kubectl cp -n staging ./file.txt mypod:/app/
  • Atur KUBECONFIG di lingkungan CI Anda untuk menunjuk ke cluster yang benar.
  • Tambahkan upaya ulang atau pemeriksaan jika pod belum siap: kubectl wait --for=condition=Ready pod/mypod
  • Gunakan tar + exec alih-alih kubectl cp jika kontainer Anda tidak memiliki tar, atau jika kubectl cp tidak stabil dalam pengaturan Anda.
  • Pastikan runner CI Anda hanya memiliki akses ke apa yang dibutuhkan. Jangan berikan hak admin penuh hanya untuk menyalin file. Gunakan service account dengan izin minimum.

Jaga Kesederhanaan, Kirim dengan Lancar

Menyalin file di Kubernetes bisa jadi rumit, tetapi dengan pendekatan yang tepat — menggunakan flag yang benar, memahami pengaturan pod/kontainer, menghindari kesalahan umum, dan mengoptimalkan kinerja — itu menjadi bagian yang lancar dari alur kerja Anda. Baik Anda bekerja dalam pengembangan, CI/CD, atau produksi, mengetahui cara menangani transfer file memberi Anda lebih banyak kontrol dan lebih sedikit masalah. Jika Anda siap untuk mengotomatisasi lebih banyak tugas Kubernetes Anda, jelajahi panduan kami tentang cara menjalankan perintah Kubernetes secara terprogram di Go, yang mencakup operasi file, deployment, dan banyak lagi.

Comments (0)

Leave a Comment

Be the first to comment!