如何从Kubernetes复制控制器的所有pod获取日志?

时间:2015-10-11 20:20:59

标签: logging kubernetes google-kubernetes-engine

“kubectl logs”向我展示了一个Kubernetes容器的stderr / stdout。如何获取一组pod的聚合stderr / stdout,最好是由某个复制控制器创建的那些?

15 个答案:

答案 0 :(得分:81)

您可以使用标签

df.Hashtags.str.extract("'(.*)'").fillna('')
Out[1052]: 
0                     
1    AAPHealthCare4All
2                  CBI
3                Delhi
4            Emergency
Name: Hashtags, dtype: object

答案 1 :(得分:47)

我创建了一个名为kubetail的小型bash脚本,使其成为可能。例如,为名为" app1"的pod添加所有日志。你可以这样做:

kubetail app1

您可以找到脚本here

答案 2 :(得分:6)

您可以按照Adrian Ng的建议使用标签从多个容器中获取日志:

kubectl logs --selector app=yourappname

如果您的Pod中包含多个容器,则上述命令将会失败,并且需要指定容器名称:

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

注意:如果要查看可用的标签,以下命令将列出所有标签:

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

...输出看起来像

  

map [app:您的应用名称控制器版本-哈希:598302898 pod-template-generation:1]

请注意,某些标签可能不会与其他Pod共享-选择“应用”似乎是最简单的

答案 3 :(得分:5)

一种选择是通过F https://kubernetes.io/docs/user-guide/logging/elasticsearch/中所述的Fluentd / ElasticSearch设置群集日志记录。一旦日志在ES中,就可以很容易地在Kibana中应用过滤器来查看来自某些容器的日志。

答案 4 :(得分:3)

我使用这个简单的脚本从部署的pod中获取日志:

#!/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

Gist of the script

用法:log_deployment.sh&#34; deployment-name&#34;。

然后,

脚本将显示以&#34; deployment-name&#34;开头的所有pod的日志。

答案 5 :(得分:3)

您也可以按服务名称进行操作。

首先,尝试查找对应于同一服务的多个容器的各个容器的服务名称。 kubectl get svc

下一步,运行以下命令以显示每个容器的日志。

kubectl logs -f service/<service-name>

答案 6 :(得分:2)

要在上一个答案的基础上添加-f,可以尾随日志。

kubectl logs -f deployment/app

答案 7 :(得分:1)

如果pod的名称有意义,可以使用简单的Plain Old Bash:

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

说明:循环运行名称包含&#34; nodejs&#34;的pod。并行地记录每个日志(单个&符号在后台运行),确保如果任何pod失败,则整个命令退出(双&符号)。将来自每个尾部命令的流转换为唯一的流。运行此动态构建的命令需要Eval。

答案 8 :(得分:1)

为我工作:

<块引用>

kubectl logs -n 命名空间 -l app=label -c 容器

答案 9 :(得分:0)

不确定这是否是新事物,但是通过部署,可以这样做:

kubectl logs deployment/app1

答案 10 :(得分:0)

以前提供的解决方案并不是最佳选择。 kubernetes团队本身已经提供了一个名为stern的解决方案。

app.post('/contact/send', contact.verifyReCAPTCHA, contact.send);

它也匹配正则表达式,并且默认情况下执行tail和-f(跟随)。一个不错的好处是,它还向您显示了生成日志的Pod。

Sub Format_Another_Worksheet()

    Dim wb As Workbook

    Set wb = GetObject("C:\Users\john\Desktop\anotherworkbook.xls")

    With wb.Worksheets("Sheet1")
    .Cells.Font.Size = 14

    Call myfunction("A")

    End With

End Sub

Sub myfunction(col As String)
    Range(col & "1").Font.Size = 30
End Sub

获取用于Linux的go-binary二进制文件,或通过brew进行OSX的安装。

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

https://github.com/wercker/stern

答案 11 :(得分:0)

当一个容器有多个容器时,您可以替换名称空间和应用程序名称以获取日志

foreach (Transportation key in companys)
    {
       Console.WriteLine("List "+ key.X);
    }

答案 12 :(得分:0)

我考虑使用的另一种解决方案是使用K9S,它是一种出色的kube管理工具。

安装后,用法非常简单:

 k9s -n my-namespace --context the_context_name_in_kubeconfig

(如果kubeconfig不在默认位置,请添加KUBECONFIG=path/to/kubeconfig前缀)。

默认视图将所有吊舱列为列表:

enter image description here

我们可以通过输入冒号:并开始键入所需的控制器,将视图更改为其他Kube控制器,例如副本集(询问复制控制器的问题,因此请注意它们已被弃用),部署,cron作业等。 -如我们所见,K9S为我们提供了自动补全功能:

enter image description here

我们可以看到当前名称空间中的所有副本集:

enter image description here

我们可以通过单击Enter选择所需的副本集,然后查看与该副本集相关的所有Pod的列表-然后我们可以按“ l”以查看日志每个吊舱。

因此,与stern的情况不同,我们仍然需要在每个Pod上查看其日志,但是我认为使用K9S非常方便-我们首先查看相关控制器的所有Pod,然后进行调查只需导航enterlescape,即可查看每个Pod的日志。

答案 13 :(得分:0)

@johan 的回答让我对单线有了一个想法:

for i in $(kubectl get pods -n default |cut -d" " -f1); do kubectl logs $i -n default; done

答案 14 :(得分:-1)

我使用此命令。

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