使用kubectl登录就绪探针

时间:2020-01-21 17:12:17

标签: kubernetes

我有一个在kubernetes容器内运行的服务器。 可以使用“ kubectl日志”检索其日志输出。

应用程序在准备好处理传入消息之前会经历一些启动。 它通过日志消息指示其准备就绪。

在窗格中无法使用“ kubectl日志”命令。我认为即使尝试安装它也不安全。

有两种方法可以实现:

  • 从容器中获取日志?
  • 运行在容器外部执行的就绪探针? (而不是作为 docker exec

以下是我考虑过的一些选择:

  • 将输出重定向到日志文件会将其从“ Kubectl日志”中丢失
  • 将其发到日志文件中可避免该限制,但会创建不必要的重复日志。

  • 该应用程序的
  • stdout和stderr是匿名管道(连接到kubernetes),因此无法监听/ proc / 1 / fd / 1或/proc/1/fd/2。

一个更好的选择可能是使用http API。例如this question

kubectl proxy --port=8080

在容器内:

curl -XGET http://127.0.0.1:8080/api

但是我得到一个错误:

Starting to serve on 127.0.0.1:8080
I0121 17:05:38.928590   49105 log.go:172] http: Accept error: accept tcp 127.0.0.1:8080: accept4: too many open files; retrying in 5ms
2020/01/21 17:05:38 http: proxy error: dial tcp 127.0.0.1:8080: socket: too many open files

有人有解决方案或更好的主意吗?

2 个答案:

答案 0 :(得分:1)

您实际上可以做您想做的事。创建一个具有权限的kubernetes“ serviceaccount”对象,该对象仅用于执行您想要的操作,将该帐户用于您的健康检查窗格,并按照您的描述运行kubectl日志。您安装了kubectl,但限制了它的可用权限。

但是,有一个原因您没有找到这样的例子-这不是构建此东西的好方法。真的没有办法在应用程序中执行运行状况检查终结点吗?这对于您的目的而言更加方便。

最后,如果答案是“否”,那么您可以让您的应用编写就绪文件吗?代替print "READY"而是执行touch /app/readyfile。那么您的健康检查可以只检查该文件是否存在。 (为此,您必须创建一个卷并将其安装在应用容器和运行状况检查容器中的/ app上,以便他们都能看到生成的文件)

答案 1 :(得分:1)

打开的文件太多是因为我没有使用sudo运行kubectl。 因此,可以使用以下命令通过http API检索日志:

sudo kubectl proxy --port 8080

然后从应用程序内部:

curl -XGET http://127.0.0.1:8080/api/v1/namespaces/default/pods/mypodnamehere/log

也就是说,我同意@Paul Becotte的观点,即让应用程序创建一个就绪文件将是一个更好的设计。