I'm sekarang mencoba untuk menjalankan wadah sederhana dengan shell (/bin/bash) pada Kubernetes cluster.
Saya berpikir bahwa ada cara untuk membuat sebuah wadah yang berjalan pada Docker container dengan menggunakan pseudo-tty
dan melepaskan opsi (td
pilihan docker menjalankan perintah
).
Misalnya,
$ sudo docker run -td ubuntu:latest
Ada pilihan seperti ini di Kubernetes?
I've mencoba menjalankan sebuah wadah dengan menggunakan kubectl run-container
perintah seperti:
kubectl run-container test_container ubuntu:latest --replicas=1
Tapi wadah yang keluar selama beberapa detik (seperti launching dengan docker menjalankan perintah
tanpa pilihan yang saya sebutkan di atas). Dan ReplicationController meluncurkan lagi berulang kali.
Apakah ada cara untuk membuat sebuah wadah yang berjalan pada Kubernetes suka td
pilihan docker menjalankan perintah
?
Wadah yang dimaksudkan untuk dijalankan sampai selesai. Anda perlu menyediakan wadah dengan tugas yang tidak akan pernah selesai. Hal seperti ini harus bekerja:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
Anda bisa menggunakan CMD ini di Dockerfile
:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Ini akan menjaga anda container hidup sampai diperintahkan untuk berhenti. Menggunakan perangkap dan menunggu akan membuat anda container langsung bereaksi untuk menghentikan permintaan. Tanpa perangkap/menunggu berhenti akan mengambil beberapa detik.
Untuk busybox berdasarkan gambar (digunakan di alpine berdasarkan gambar) tidur tidak tahu tentang infinity argumen. Solusi ini memberikan anda sama segera menanggapi docker berhenti
seperti pada contoh di atas:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Wadah yang keluar ketika proses utama keluar. Melakukan sesuatu seperti:
docker run -itd debian
untuk menahan wadah terbuka terus terang hack yang seharusnya hanya digunakan untuk tes cepat dan contoh-contoh. Jika anda hanya ingin sebuah wadah untuk pengujian selama beberapa menit, yang akan saya lakukan:
docker run -d debian sleep 300
Yang memiliki keuntungan bahwa wadah akan secara otomatis keluar jika anda lupa tentang hal itu. Atau, anda bisa menempatkan sesuatu seperti ini dalam sementara
loop untuk tetap berjalan selamanya, atau hanya menjalankan aplikasi seperti top
. Semua ini harus mudah untuk dilakukan di Kubernetes.
Pertanyaan sebenarnya adalah mengapa anda ingin melakukan ini? Wadah anda harus menyediakan layanan, dan proses akan terus kontainer yang berjalan di latar belakang.
CMD ["sh", " c", "tail -f /dev/null"]
kubectl menjalankan debug-wadah -itu-gambar=<anda-gambar>
Dalam rangka untuk menjaga POD menjalankan POD harus melakukan tugas tertentu, jika tidak, Kubernetes akan menemukan hal yang tidak perlu, oleh karena itu keluar. Ada banyak cara untuk menjaga POD berjalan.
Saya telah menghadapi masalah yang sama ketika saya membutuhkan POD hanya untuk terus berjalan tanpa melakukan apa-apa. Berikut adalah dua cara orang-orang bekerja untuk saya:
Meskipun pilihan pertama adalah lebih mudah dari yang kedua dan dapat mencukupi kebutuhan, hal ini bukan pilihan terbaik. Seperti, ada batas sejauh jumlah detik anda akan menetapkan dalam tidur perintah. Tapi sebuah wadah dengan loop tak terbatas yang berjalan di dalamnya tidak keluar.
Namun, saya akan menjelaskan kedua cara(Mengingat anda menjalankan busybox wadah):
1. Tidur Perintah
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "sleep 1000"]
nodeSelector:
beta.kubernetes.io/os: linux
2. Infinite Loop
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
nodeSelector:
beta.kubernetes.io/os: linux
Jalankan perintah berikut untuk menjalankan pod:
kubectl apply -f <pod-yaml-file-name>.yaml
Harap ini membantu!
Saya bisa mendapatkan ini untuk bekerja dengan perintah tidur infinity
di Kubernetes, yang akan menjaga wadah terbuka. Lihat jawaban ini untuk alternatif ketika itu doesn't bekerja.
Yang paling sederhana perintah seperti itu bisa untuk k8s pod nyata untuk menjalankan wadah selamanya: `` apiVersion: v1 jenis: Pod metadata: nama: ubuntu spec: wadah:
perintah: [ "tidur" ] args: [ "infinity" ] ``
Dalam kasus saya, pod dengan initContainer gagal untuk menginisialisasi. Menjalankan docker ps -a
dan kemudian docker log keluar-wadah-id-di sini
memberi saya pesan log yang kubectl log podname
didn't display. Misteri terpecahkan :-)
Saya beberapa sen pada subjek. Terdekat perintah yang akan setara dengan docker perintah yang anda sebutkan dalam pertanyaan anda, akan menjadi sesuatu seperti ini.
$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
Perintah di atas akan membuat sebuah single Pod
dan mengeksekusi tidur
dengan perintah infinity
argumen -cara ini anda akan memiliki proses yang berjalan di foreground menjaga wadah hidup.
Penutup, anda dapat berinteraksi dengan Pod
dengan menjalankan kubectl exec
perintah.
$ kubectl exec ubuntu -it -- sh
Teknik ini sangat berguna untuk menciptakan Pod sumber daya dan ad-hoc debugging.