Çalıştırmak kubectl logs
bana 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?
Çalıştırmak kubectl logs
bana 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?
Yanıtlar:
Etiketleri kullanabilirsiniz
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
artık çalışıyor (Kubernetes 1.12+ / kubectl
1.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
Bunu kubetail
mü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 .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
ayrıntılı belgeler: kt -h
Harika!
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
Ö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/
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
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.
Bir seçenek, https://kubernetes.io/docs/user-guide/logging/elasticsearch/ adresinde açıklandığı gibi Fluentd / ElasticSearch aracılığıyla küme günlüğü oluşturmaktır . Günlükler ES'ye girdikten sonra, belirli kapsayıcılardan günlükleri görüntülemek için Kibana'da filtre uygulamak kolaydır.
Bilgiye kubectl logs -h
göre yardım alabilirsiniz ,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
kapsayıcı adıdır ve --tail
en 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, -l
bir etiket kullanabilir ve belirtebilirsiniz, ancak aynı zamanda -f
kullanılmayacaktır.
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>
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
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.
Bu komutu kullanıyorum.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
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