Container yang berjalan di Kubernetes Pod dimaksudkan sebagai unit komputasi mandiri yang tidak perlu Anda gunakan untuk berinteraksi secara manual. Terkadang Anda mungkin harus menyalin file ke atau dari sistem file Pod, mungkin karena Anda sedang men-debug masalah dan ingin mengarsipkan log, file konfigurasi, atau cache yang disimpan dalam sebuah wadah.
Berikut cara memindahkan file antara mesin Anda dan container dalam sebuah Pod, menggunakan fitur transfer bawaan Kubectl atau alternatif manual.
Menyalin Ke atau Dari Mesin Anda
kubectl cp
perintah adalah cara paling sederhana untuk menyalin ke atau dari sistem file kontainer. Ini bekerja mirip dengan docker cp
Anda mungkin sudah familiar dengan pengembangan container lokal.
kubectl cp
membutuhkan argumen sumber dan tujuan. Salah satu sumber atau tujuan harus menjadi referensi Pod. Ini diformat sebagai nama Pod, diikuti oleh titik dua dan jalur sistem file dalam wadah.
kubectl cp example-pod:/tmp/example-dir ./example-dir
Contoh ini menyalin konten /tmp/example-dir
dari example-pod
ke example-dir
pada sistem file lokal Anda. Membalikkan argumen akan menyalin example-dir
mesin Anda kembali ke Pod.
Argumen Perintah
Karena satu Pod dapat menampung banyak container, penting untuk mengingat hal ini saat menggunakan cp
. Kubernetes akan secara default menyalin ke atau dari instance container pertama di dalam Pod. Anda dapat menargetkan wadah tertentu sebagai gantinya dengan menambahkan -c
bendera:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Seperti semua kubectl
lainnya perintah, cp
berjalan melawan koneksi cluster yang ditentukan oleh KUBECONFIG
. Anda variabel lingkungan. Ini default ke ~/.kube/conf
.
Ada dua opsi saat Anda mereferensikan Pod dengan namespace. Anda dapat menambahkan --namespace example-namespace
standar tandai atau gunakan path Pod lengkap di referensi sistem file Anda:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Atribut file dipertahankan secara default. Tambahkan --no-preserve
tandai ke cp
. Anda perintah untuk menghapus data kepemilikan dan izin dari file yang disalin yang ditinggalkan di tempat tujuan. Tidak seperti cp
Unix biasa , implementasi Kubectl selalu rekursif sehingga referensi direktori akan menyertakan isinya juga.
Kapan Kubectl Cp Tidak Berfungsi
kubectl cp
hadir dengan satu peringatan besar:secara internal, ini adalah pembungkus sederhana di sekitar tar
. Perintah akan memampatkan jalur sumber, menyalin arsip ke tujuan, lalu mengekstrak kontennya. Gambar container Anda harus menyertakan tar
biner di jalurnya agar ini berfungsi.
Ini berarti kubectl cp
mungkin tidak selalu menjadi pilihan saat Anda mengikuti praktik terbaik Docker untuk menjaga agar gambar tetap kecil. Meskipun basis minimal populer seperti alpine
sertakan tar
, itu mungkin tidak ditampilkan di setiap gambar dan tidak akan ada jika Anda merakitnya dari awal.
Penggunaan tar
juga membatasi apa kubectl cp
dapat menyalin. Anda tidak dapat menyelesaikan symlink atau menggunakan wildcard seperti /tmp/*.log
. Anda harus menggunakan pendekatan yang berbeda saat fungsi ini diperlukan.
Salah satu opsi adalah menggabungkan kubectl exec
, cat
perintah, dan pengalihan shell untuk mengalirkan konten file keluar dari cluster dan ke file lokal:
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
kubectl exec
perintah memulai sesi shell di Pod. Semuanya setelah --
dijalankan di dalam wadah. Output dari memanggil cat
pada file tersebut akan dipancarkan ke terminal Anda di mana file tersebut dapat dialihkan ke file lokal.
Teknik ini cocok saat Anda menyalin beberapa file yang relatif kecil. Ini akan cepat menjadi membosankan jika Anda perlu untuk mengambil direktori besar. Sayangnya, tidak ada alternatif yang lebih baik tanpa menambahkan perangkat lunak tambahan ke wadah Anda.
Jika Anda merasa berani, Anda dapat menginstal SSH di wadah Anda dan menggunakan scp
untuk mengakses sistem filenya dari host Anda. Ini akan memberi Anda pengalaman penyalinan yang lengkap dengan mengorbankan menjalankan daemon tambahan dan menciptakan potensi masalah keamanan. Ini hanya boleh dipertimbangkan pada cluster yang dilindungi dengan benar.
Menambahkan tar
ke gambar kontainer Anda adalah pilihan yang jauh lebih aman. Ini memungkinkan Anda menggunakan kubectl cp
dan membuka penyalinan manual yang lebih canggih melalui kubectl exec
ketika Anda membutuhkan fungsionalitas tambahan. Jika Anda mengalami keterbatasan dengan cp
sintaks, aktifkan tar
langsung melalui kubectl exec
untuk menambahkan tanda tambahan ke perintah:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Ini menjalankan tar -cF
di dalam wadah Anda dan menyalurkan hasilnya ke tar xf
perintah ekstraksi pada mesin lokal Anda. -
menginstruksikan tar
untuk mengekstrak data yang diumpankan melalui aliran input standar. -C
digunakan untuk menentukan direktori tujuan.
Ringkasan
kubectl cp
perintah memungkinkan Anda menyalin file antara Kubernetes Pods dan mesin Anda. Ini bekerja di kedua arah tetapi tidak dapat digunakan untuk memindahkan file dari Pod ke Pod. Jika Anda perlu melakukannya, sebaiknya gunakan prosedur dua tahap, menyalin pertama dari Pod A ke mesin Anda, kemudian ke Pod B.
Sebagai cp
bergantung pada tar
di bawah tenda, Anda perlu memastikan gambar wadah Anda menyertakannya. Anda akan melihat No such file or directory tar
kesalahan jika Anda mencoba menjalankan cp
terhadap Pod tanpa tar
. Dalam situasi ini, tambahkan tar
ke wadah atau gunakan kombinasi kubectl exec
dan cat
jika Anda hanya perlu mengambil beberapa file.