Kubernetes çoğaltma denetleyicisinin tüm bölmelerinden nasıl günlükler alabilirim?


123

Çalıştırmak kubectl logsbana bir Kubernetes konteynerinin stderr / stdout'unu gösteriyor.

Tercihen belirli bir çoğaltma denetleyicisi tarafından oluşturulanlar olmak üzere, bir dizi bölmenin toplu stderr / stdout'unu nasıl elde edebilirim?


bir seçici kullanırken kuyruk bağımsız değişkenini ayarlamamanın her pod günlüğünü varsayılan olarak 10 satır uzunluğuna
getireceğini unutmayın

Yanıtlar:


176

Etiketleri kullanabilirsiniz

kubectl logs -l app=elasticsearch

21
İyi bir çözüm ve büyük olasılıkla orijinal soruyu yanıtlamak için yeterli, ancak sonuç vermeyecek: "hata: yalnızca bir takip (-f) veya seçici (-l) 'ye izin verilir".
Nestor Urquiza

3
Ayrıca hayır --all-namespaces.
Eric Walker

Bu günlüklerin sırası ne olacak? Demek istediğim, birden fazla bölme varsa ve her bölmenin kendi günlükleri olacak. Öyleyse, tüm günlükler görüntüleniyorsa, o zaman hangi sırayla görüntülenecekler ve belirli bir günlük satırının kaynak bölmesini nasıl belirleyebilirim?
Shubham

6
Görünüşe göre bu -fartık çalışıyor (Kubernetes 1.12+ / kubectl1.12+ itibariyle). Ayrıca @Shubham - mesajları alınan sırayla görüntüler, günlük satırlarında etiket veya herhangi bir şey yoktur. Bu sadece hızlı hata ayıklama içindir. Daha fazla günlük ayrıntısına ihtiyacınız varsa, günlüklerinizi EFK, SumoLogic, Datadog vb. Gibi merkezi bir günlük kaydı sistemine göndermeniz gerekir
geerlingguy

1
Aynı şeyi kubernetes panosunu kullanarak yapmak var mı?
mchawre

70

Bunu kubetailmümkün kılan küçük bir bash betiği oluşturdum . Örneğin, "uygulama1" adlı kapsüller için tüm günlükleri kuyruğa almak için şunları yapabilirsiniz:

kubetail app1

Senaryoyu burada bulabilirsiniz .


Şununla yükledi: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesayrıntılı belgeler: kt -hHarika!
Khalil Gharbaoui

Muhteşem. Birkaç sorum var. `` 1. Farklı dağıtımlara ait birden fazla kapsülün günlüklerini kuyruklayabilir miyiz? "Kt -l app = service1, app = service2" gibi bir şey 2. Hepsini bir dosyaya nasıl yazabilirim? Bu "kt -l app = service1` >> dosyaadı.log" yapıldığında ona yalnızca pod adları yazılır. 3. Otomatik ölçeklendirme dağıtımları durumunda da kuyruk oluşturuyor mu? `` `
Vasudev

19

Adrian Ng'nin önerdiği gibi etiketleri kullanarak birden çok kaptan günlükleri alabilirsiniz:

kubectl logs --selector app=yourappname

Birden çok kapsayıcıya sahip bir bölmeniz varsa, yukarıdaki komut başarısız olacak ve kapsayıcı adını belirtmeniz gerekecektir:

kubectl logs --selector app=yourappname --container yourcontainername

Not: Hangi etiketlerin size uygun olduğunu görmek istiyorsanız, aşağıdaki komut hepsini listeleyecektir:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... çıktının bir şeye benzeyeceği yer

harita [uygulama: uygulamanızınadı denetleyici-revizyon-karması: 598302898 kapsül-şablon-oluşturma: 1]

Bazı etiketlerin diğer bölmeler tarafından paylaşılmayabileceğini unutmayın - "uygulama" yı seçmek en kolayı gibi görünüyor


13

Önceki cevaba dayanmak için, eklerseniz -fgünlükleri takip edebilirsiniz.

kubectl logs -f deployment/app

10

Önceden sağlanan çözümler o kadar uygun değildir. Kubernetes ekibinin kendisi bir süre önce kıç adı verilen bir çözüm sağladı.

stern app1

Ayrıca normal ifadelerle de eşleşir ve varsayılan olarak tail ve -f (follow) işlevlerini kullanır. Güzel bir faydası, size günlüğü oluşturan kapsülü de göstermesidir.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Linux için go-ikili dosyasını alın veya OSX için brew aracılığıyla yükleyin.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern


6

Bir dağıtımın kapsüllerinden bir günlük almak için bu basit komut dosyasını kullanıyorum:

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

Senaryonun özü

Kullanım: log_deployment.sh "dağıtım adı".

Komut dosyası daha sonra bu "dağıtım adı" ile başlayan tüm bölmelerin günlüğünü gösterecektir.



4

Bilgiye kubectl logs -hgöre yardım alabilirsiniz ,

kubectl logs -f deployment/myapp -c myapp --tail 100

-ckapsayıcı adıdır ve --tailen son numara satırlarını gösterecektir , ancak bu, tüm bölmeleri değil, dağıtımın bir bölmesini seçecektir. Bu, aklınızda bulundurmanız gereken bir şey.

kubectl logs -l app=myapp -c myapp --tail 100

Tüm bölmelerin günlüklerini göstermek istiyorsanız, -lbir etiket kullanabilir ve belirtebilirsiniz, ancak aynı zamanda -fkullanılmayacaktır.


3

Bunu servis adına göre de yapabilirsiniz.

İlk olarak, aynı hizmetin birden çok bölmesine karşılık gelen ilgili bölmenin hizmet adını bulmaya çalışın. kubectl get svc.

Ardından, her konteynerden günlükleri görüntülemek için aşağıdaki komutu çalıştırın.

kubectl logs -f service/<service-name>

2

Bu örnekte, bir Bölmede tanımlanmış birden çok Kapsayıcı olduğunda günlükleri almak için <namespace>ve yerine geçebilirsiniz <app-name>.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m

1

Bölmeler anlamlı bir şekilde adlandırılırsa, basit Düz Eski Bash kullanılabilir:

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

Açıklama: "nodejs" içeren adla çalışan kapsüller arasında döngü yapın. Her biri için günlüğü paralel olarak kuyruklayın (arka planda tek ve işareti çalışır), bölmelerden herhangi biri başarısız olursa tüm komut çıkışlarından (çift ve işareti) emin olun. Kuyruk komutlarının her birinden gelen akışları benzersiz bir akışa sıralayın. Dinamik olarak oluşturulmuş bu komutu çalıştırmak için Eval gereklidir.


-1

Bu komutu kullanıyorum.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
Merhaba! Bu komut soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , gönderinizin kalitesini artırmaya gerçekten yardımcı olur ve muhtemelen daha fazla oy almanıza neden olur. Sadece şu anda soran kişi için değil, gelecekte okuyucular için soruyu yanıtladığınızı unutmayın. Açıklamalar eklemek ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge vermek için lütfen yanıtınızı düzenleyin .
Brian

-4

Bunun yeni bir şey olup olmadığından emin değilim, ancak dağıtımlarla bunu şu şekilde yapmak mümkündür:

kubectl logs deployment/app1

8
Dağıtıma göre günlükleri aldığınızda, çoğaltılmış bölmelerden herhangi birini seçer (rastgele seçer), ancak hepsini değil.
Akhil Bojedla

Olumsuz oylama çünkü bu yalnızca bir kapsül seçiyor
Maximilian
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.