Bir kapsayıcının Kubernetes üzerinde çalışmasını nasıl sağlayabilirim?


124

Şimdi bir Kubernetes kümesinde kabuk (/ bin / bash) ile basit bir kapsayıcı çalıştırmaya çalışıyorum.

Bir konteyneri bir Docker konteynerinde çalıştırıp pseudo-ttyayırma seçeneğini ( komut -tdüzerine seçenek) kullanarak tutmanın bir yolu olduğunu düşündüm docker run.

Örneğin,

$ sudo docker run -td ubuntu:latest

Kubernetes'te böyle bir seçenek var mı?

kubectl run-containerŞunun gibi bir komut kullanarak bir konteyner çalıştırmayı denedim :

kubectl run-container test_container ubuntu:latest --replicas=1

Ancak konteyner birkaç saniyeliğine çıkar (tıpkı docker runyukarıda bahsettiğim seçenekler olmadan komutla başlatmak gibi). Ve ReplicationController onu tekrar tekrar başlatır.

Komuttaki -tdseçenekler gibi bir konteynerin Kubernetes üzerinde çalışmasını sağlamanın bir yolu var mı docker run?


Bu resmi kullanmak ( Kubernetes belgelerinin önerdiği gibi) oldukça kullanışlıdır:kubectl run curl --image=radial/busyboxplus:curl -i --tty
Matheus Santana

Bu soru bu videoyu söz edilmiştir: Kubernetes Datadog çok zor yoldan bir slayt başlığı ile Kargo culting" wikipedia Gönderen:. Süreli kargo kült programcı geçerli olabilir zaman sorunu olan deneyimsiz bir vasıfsız veya acemi bilgisayar programcısı (ya da bir elde) bazı program kodunu bir yerden diğerine nasıl çalıştığını veya yeni konumunda gerekli olup olmadığını çok az anlayarak veya hiç anlamadan kopyalar.
tgogos

Yanıtlar:


49

Bir kapsayıcı, ana işlemi çıktığında çıkar. Şunun gibi bir şey yapmak:

docker run -itd debian

kabı açık tutmak, açıkçası yalnızca hızlı testler ve örnekler için kullanılması gereken bir hack'tir. Birkaç dakika test etmek için bir kap istiyorsanız, şunu yapardım:

docker run -d debian sleep 300

Bu, unutursanız konteynerin otomatik olarak çıkması avantajına sahiptir. Alternatif olarak, whilesonsuza kadar çalışmasını sağlamak için bunun gibi bir şeyi bir döngüye koyabilir veya gibi bir uygulamayı çalıştırabilirsiniz top. Bunların hepsini Kubernetes'te yapmak kolay olmalıdır.

Asıl soru, bunu neden yapmak isteyesin? Kapsayıcınız, süreci kapsayıcıyı arka planda çalışır durumda tutacak bir hizmet sağlamalıdır.


Cevabınız için teşekkür ederim. Şimdi, aynı anda çalışan düzinelerce konteyner ile konteynerlerin davranışını anlamaya çalışıyorum. Sonsuz döngü ve diğer ağır komutları kullanmak, kapların davranışının ne olduğunu bilmemi engelle. Bu yüzden sadece / bin / bash çalıştırmak gibi basit bir konteynere ihtiyacım var.
springwell

Şimdilik, ben çalışan çalışacağım catargümanları olmadan topve sleepçok sayıda argümanla.
springwell

30
sleep infinitybir çok durumda çalışır (
meşgul kutusu

1
Bunu yapmak için pek çok neden var. Örneğin, bölmelerinizi, benzer ortamların yeniden yaratılmasını can sıkıcı ve hantal hale getirecek olan dümen salımları ve enjekte edilmiş konfigürasyonla konuşlandırabilirsiniz. Ancak, diğer bölmelerin çöktüğü / silindiği durumlarda bu yapılandırmaya sahip bir konteynere sahip olmak sonsuz derecede yararlı olabilir.
Richard Løvehjerte

Çünkü hizmetim birden fazla süreçten oluşuyor.
Константин Ван

135

Konteynerlerin sonuna kadar çalışması amaçlanmıştır. Kapınıza asla bitmeyecek bir görev sağlamalısınız. Bunun gibi bir şey çalışmalı:

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;" ]

Ama bu bir en iyi uygulama mı?
aneesh joshi

3
@aneeshjoshi Bunun en iyi uygulama olduğunu söyleyemem . Bu, hemen çıkmadan çalışacak bir kapsül sağlayan bir örnektir. En iyi uygulama, kapsayıcılarınızı tasarlandıkları işi yapmak için oluşturmaktır (tamamlanana kadar çalışan bir iş, sürekli olarak çalışan bir web sunucusu vb.). Bunu bir örnek olarak yayınladım çünkü Kubernetes, yalnızca varsayılan komut hemen çıktığından beri kaybolması için bölmeler oluşturmaya devam ettiğinizde başlangıçta sinir bozucu hissedebilir.
Joel B

@JoelB Teşekkürler. Bunu yapmanın "doğru" yolunun ne olduğunu merak ediyordum.
aneesh joshi

1
Bunun için teşekkürler, çünkü bir süre yaşayabilecek ve içine girmeme izin verecek bir konteynere ihtiyacım var. Aynı şeyi daha açık bir görüntü ile yapmaya çalışıyordum ubuntuve denedim bashama işe yaramadı. Bunun aynısını bashgörüntü ile nasıl yapacağınıza dair bir fikriniz var mı?
cryanbhu

1
@cryanbhu Daha açık bir görüntü için, alpin kullanabilirsiniz, kapsayıcı özelliği şöyle görünebilir: {"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}(sadece json çünkü yaml burada yorumlarda biçimlendirmez.) Önemli olan /bin/shbunun yerine olmaktır /bin/bash.
bschlueter

111

Bu CMD'yi şunlarınızda kullanabilirsiniz Dockerfile:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

Bu, durması söylenene kadar konteynerinizi canlı tutacaktır. Tuzak ve beklemenin kullanılması, konteynerinizin bir durdurma isteğine anında tepki vermesini sağlayacaktır . Tuzak / bekleme olmadan durdurma birkaç saniye sürecektir.

Meşgul kutusu tabanlı görüntüler için (Alp tabanlı görüntülerde kullanılan) uyku sonsuzluk argümanı hakkında bilgi sahibi değildir. Bu geçici çözüm , yukarıdaki örnekteki benzerlere aynı anında yanıt verir docker stop:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"

Aynısını kubernetes dağıtım yaml'de hata ayıklama amacıyla kullanıyorum
sdkks

bu bana "uyku: geçersiz sayı 'sonsuzluk'
veriyor

@arunkjn Bunun için teşekkürler. Muhtemelen meşgul kutusu kullanan bir resimle (dağ resimleri gibi) sıkışmışsınızdır. Güncellenen yanıta bakın.
itsafire

24
  1. Dockerfile'ınızda şu komutu kullanın:

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. Docker görüntünüzü oluşturun.

  3. Görüntünün mevcut olduğundan emin olmak için onu kümenize veya benzerine itin.
  4. kubectl run debug-container -it --image=<your-image>
    

Kapsayıcıda hata ayıklamak için harika ipuçları.
kta

16

Bir POD'un POD'u çalıştırmasını sağlamak için belirli bir görevi yerine getirmesi gerekir, aksi takdirde Kubernetes bunu gereksiz bulur ve bu nedenle çıkar. Bir POD'u çalışır durumda tutmanın birçok yolu vardır.

Hiçbir şey yapmadan sürekli çalışmak için bir POD'a ihtiyacım olduğunda benzer sorunlarla karşılaştım. Aşağıdakiler benim için işe yarayan iki yol:

  1. Kapsayıcıyı çalıştırırken bir uyku komutu çalıştırma.
  2. Konteynerin içinde sonsuz bir döngü çalıştırma.

İlk seçenek ikinciden daha kolay ve gereksinimi karşılasa da, en iyi seçenek değildir. Ayrıca, uyku komutunda atayacağınız saniye sayısı kadar bir sınır vardır. Ancak içinde çalışan sonsuz döngüye sahip bir konteyner asla çıkmaz.

Ancak, her iki yolu da açıklayacağım (busybox konteyneri çalıştırdığınızı düşünürsek):

1. Uyku Komutu

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. Sonsuz Döngü

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

Bölmeyi çalıştırmak için aşağıdaki komutu çalıştırın:

kubectl apply -f <pod-yaml-file-name>.yaml

Umarım yardımcı olur!


Sorabilir miyim, uyku nedir? Ubuntu'ya dahili bir komut mu? Veya docker komutu?
Faraz

@Faraz Bu bir linux shell komutu, docker'a özgü değil.
Arbaaz

11

Bunu sleep infinityKubernetes'te konteynerin açık kalmasını sağlayacak komutla çalıştırmayı başardım. İşe yaramadığında alternatifler için bu yanıta bakın .


Bu soruya cevap vermiyor. Bir yazarı eleştirmek veya açıklama istemek için yazının altına bir yorum bırakın. - Yorumdan
Will

1
@ Elbette öyle. sleep infinitykabı açık tutar ve sorunun sorduğu aynı işlevselliği sağlar (çoğu kap türü için). Ayrıca, belirli bir komutun çalışmadığı durumlar için alternatiflere bir bağlantı sağlar
rwilson04

Bu incelemeden geldi. Buraya yorum metnini cevaba eklerseniz, o zaman kaliteli bir cevaptır :) İlk bayrağım / övgüm, yorumunuzun başarılı olmadığını söyleyerek, bunun bir yorum olması gerektiğini düşünmeme neden oldu. Hızlı bir düzenleme eklendi ve oy verildi.
Will

"... Kubernetes'te uyku sonsuzluğu" bilgisiz bir ifadedir. Resimde unix ve docker olmadığını ima eder.
mmla

10

K8s pod manifestinin kapsayıcıyı sonsuza kadar çalıştırması gibi en basit komut:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]

5

Konteynerin K8s kümenizde çalışmasını sağlamak için Dockerfile içinde bu komutu kullanın:

  • CMD kuyruğu -f / dev / null

3

Benim durumumda, initContainer içeren bir bölme başlatılamadı. Koşuyor docker ps -ave sonra docker logs exited-container-id-herebana görüntülenmeyen bir günlük mesajı verdi kubectl logs podname. Gizem çözüldü :-)


1

Bunu başarmanın birçok farklı yolu vardır, ancak en zarif olanlardan biri:

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh

Neden bunu en zarif çözüm olarak görüyorsunuz?
mordowiciel

1

Konuyla ilgili birkaç sentim. Bunun kubectlçalıştığını varsayarsak, sorunuzda bahsettiğiniz docker komutuna eşdeğer en yakın komut şuna benzer bir şey olacaktır.

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

Yukarıdaki komut tek yaratacak Podiçinde defaulto çalıştırır, ad ve sleepbirlikte komutuinfinity bir süreç olacak Tartışmanın -bu arada ön plan tutma kapta çalışır hayatta olduğunu.

Afterwords, ile etkileşim kurabilirsiniz Podkubectl exec komut çalıştırarak .

$ kubectl exec ubuntu -it -- bash

Bu teknik, bir Kapsül kaynağı oluşturmak ve anlık hata ayıklama için çok kullanışlıdır.


1
Harika çalışıyor. Gerek yok --restart=Never, arayınkubectl run ubuntu --image=ubuntu -- sleep infinity
Noam Manos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.