Sekarang saya mencoba menjalankan container sederhana dengan shell (/ bin / bash) di cluster Kubernetes.
Saya pikir ada cara untuk menjaga kontainer tetap berjalan di kontainer Docker dengan menggunakan pseudo-tty
dan melepaskan opsi ( -td
opsi pada docker run
perintah).
Sebagai contoh,
$ sudo docker run -td ubuntu:latest
Apakah ada opsi seperti ini di Kubernetes?
Saya sudah mencoba menjalankan container dengan menggunakan kubectl run-container
perintah seperti:
kubectl run-container test_container ubuntu:latest --replicas=1
Tetapi kontainer keluar selama beberapa detik (seperti meluncurkan dengan docker run
perintah tanpa opsi yang saya sebutkan di atas). Dan ReplicationController meluncurkannya lagi berulang kali.
Apakah ada cara agar container tetap berjalan di Kubernetes seperti -td
opsi di docker run
perintah?
docker
containers
kubernetes
google-kubernetes-engine
springwell
sumber
sumber
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Jawaban:
Sebuah kontainer keluar saat proses utamanya keluar. Melakukan sesuatu seperti:
terus terang saja, menahan wadah terbuka adalah retasan yang hanya boleh digunakan untuk uji dan contoh cepat. Jika Anda hanya ingin wadah untuk pengujian selama beberapa menit, saya akan melakukan:
Yang memiliki keuntungan bahwa container akan keluar secara otomatis jika Anda lupa. Alternatifnya, Anda bisa meletakkan sesuatu seperti ini dalam satu
while
lingkaran agar tetap berjalan selamanya, atau jalankan aplikasi sepertitop
. Semua ini semestinya mudah dilakukan di Kubernetes.Pertanyaan sebenarnya adalah mengapa Anda ingin melakukan ini? Penampung Anda harus menyediakan layanan, yang prosesnya akan membuat penampung tetap berjalan di latar belakang.
sumber
cat
tanpa argumen dantop
dansleep
dengan argumen dalam jumlah besar.sleep infinity
bekerja dalam banyak kasus (bukan busybox)Container dimaksudkan untuk dijalankan hingga selesai. Anda perlu memberi penampung Anda tugas yang tidak akan pernah selesai. Sesuatu seperti ini seharusnya bekerja:
sumber
ubuntu
dan mencobabash
gambar tetapi tidak bisa membuatnya berfungsi. Ada ide bagaimana melakukan hal yang sama denganbash
gambar?{"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}
(hanya json karena yaml tidak akan memformat dalam komentar di sini.) Yang penting/bin/sh
bukan/bin/bash
.Anda dapat menggunakan CMD ini di
Dockerfile
:Ini akan membuat wadah Anda tetap hidup sampai disuruh berhenti. Menggunakan trap dan wait akan membuat container Anda segera bereaksi terhadap permintaan stop . Tanpa jebakan / menunggu, berhenti akan memakan waktu beberapa detik.
Untuk gambar berbasis busybox (digunakan dalam gambar berbasis alpine), sleep tidak mengetahui tentang argumen tak terhingga. Solusi ini memberi Anda respons langsung yang sama
docker stop
seperti dalam contoh di atas:sumber
Di Dockerfile Anda, gunakan perintah ini:
Bangun citra buruh pelabuhan Anda.
sumber
Untuk menjaga agar POD tetap berjalan, POD harus menjalankan tugas tertentu, jika tidak Kubernetes akan menganggapnya tidak diperlukan, oleh karena itu ia akan keluar. Ada banyak cara untuk membuat POD tetap berjalan.
Saya pernah menghadapi masalah serupa ketika saya membutuhkan POD hanya untuk berjalan terus menerus tanpa melakukan apapun. Berikut adalah dua cara yang berhasil bagi saya:
Meskipun opsi pertama lebih mudah daripada yang kedua dan mungkin mencukupi persyaratannya, itu bukanlah opsi terbaik. Karena, ada batasan jumlah detik yang akan Anda tetapkan dalam perintah tidur. Tetapi wadah dengan loop tak terbatas yang berjalan di dalamnya tidak pernah keluar.
Namun, saya akan menjelaskan kedua cara tersebut (Mengingat Anda menjalankan container busybox):
1. Perintah Tidur
2. Loop Tak Terbatas
Jalankan perintah berikut untuk menjalankan pod:
Semoga membantu!
sumber
Saya bisa membuat ini bekerja dengan perintah
sleep infinity
di Kubernetes, yang akan membuat container tetap terbuka. Lihat jawaban ini untuk alternatif bila itu tidak berhasil.sumber
sleep infinity
membuat penampung tetap terbuka, menyediakan jenis fungsionalitas yang sama dengan yang ditanyakan pertanyaan (untuk sebagian besar jenis penampung). Ini juga menyediakan tautan ke alternatif untuk kasus ketika perintah khusus itu tidak berfungsiPerintah paling sederhana untuk manifes pod k8s menjalankan container selamanya:
sumber
Gunakan perintah ini di dalam Dockerfile Anda untuk menjaga container tetap berjalan di cluster K8s Anda:
sumber
Dalam kasus saya, pod dengan initContainer gagal diinisialisasi. Berjalan
docker ps -a
dan kemudiandocker logs exited-container-id-here
memberi saya pesan log yangkubectl logs podname
tidak ditampilkan. Misteri terpecahkan :-)sumber
Ada banyak cara berbeda untuk mencapai ini, tetapi salah satu yang paling elegan adalah:
sumber
Beberapa sen saya untuk masalah ini. Dengan asumsi itu
kubectl
berfungsi maka perintah terdekat yang akan setara dengan perintah buruh pelabuhan yang Anda sebutkan dalam pertanyaan Anda, akan menjadi seperti ini.Perintah di atas akan membuat satu
Pod
didefault
namespace dan, itu akan mengeksekusisleep
perintah denganinfinity
argumen -dengan cara ini Anda akan memiliki proses yang berjalan di latar depan menjaga kontainer tetap hidup.Kata penutup, Anda dapat berinteraksi dengan
Pod
menjalankankubectl exec
perintah.Teknik ini sangat berguna untuk membuat resource Pod dan debugging ad-hoc.
sumber
--restart=Never
, cukup hubungikubectl run ubuntu --image=ubuntu -- sleep infinity