我有一个在kubernetes容器内运行的服务器。 可以使用“ kubectl日志”检索其日志输出。
应用程序在准备好处理传入消息之前会经历一些启动。 它通过日志消息指示其准备就绪。
在窗格中无法使用“ 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
有人有解决方案或更好的主意吗?
答案 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的观点,即让应用程序创建一个就绪文件将是一个更好的设计。