Kubernetes kubectl登录准备就绪探测器的使用

Kubernetes kubectl登录准备就绪探测器的使用,kubernetes,Kubernetes,我有一个服务器,它运行在kubernetes吊舱内。 可以使用“kubectl日志”检索其日志输出 应用程序在准备好处理传入消息之前要经过一些启动。 它通过日志消息指示其准备就绪 pod内无法使用“kubectl日志”命令。我认为即使尝试安装它也不安全 有没有一种方法: 从容器中获取日志?或 运行在容器外部执行的准备就绪探测? (而不是作为码头管理人员) 以下是我考虑过的一些选择: 将输出重定向到日志文件会丢失“Kubectl日志” 将其设置为日志文件可以避免这种限制,但会创建不必要的重复

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

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

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

有没有一种方法:

  • 从容器中获取日志?
  • 运行在容器外部执行的准备就绪探测? (而不是作为码头管理人员)
以下是我考虑过的一些选择:

  • 将输出重定向到日志文件会丢失“Kubectl日志”
  • 将其设置为日志文件可以避免这种限制,但会创建不必要的重复日志

  • 应用程序的stdout和stderr是匿名管道(到kubernetes),因此/proc/1/fd/1或/proc/1/fd/2上的窃听将无法工作

更好的选择可能是使用。比如说

在容器内:

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

有没有人有更好的解决方案或想法?

你可以真正做你想做的事。创建一个kubernetes“serviceaccount”对象,其权限仅限于执行您想要的操作,将该帐户用于您的健康检查pod,并按照您所述运行kubectl日志。您可以安装kubectl,但限制其可用权限

然而,你没有找到这样的例子是有原因的——这不是一个很好的构建这个东西的方法。你真的没有办法在你的应用程序中做一个健康检查端点吗?这对你来说方便多了


最后,如果答案真的是“不”,你能让你的应用程序写一个现成的文件吗?而不是打印“就绪”do
touch/app/readyfile
。然后,您的健康检查可以只检查该文件是否存在。(要实现此功能,您必须创建一个卷,并将其装入应用程序容器和运行状况检查容器中的/app,以便它们都可以查看生成的文件)

您可以实际执行您想要的操作。创建一个kubernetes“serviceaccount”对象,其权限仅限于执行您想要的操作,将该帐户用于您的健康检查pod,并按照您所述运行kubectl日志。您可以安装kubectl,但限制其可用权限

然而,你没有找到这样的例子是有原因的——这不是一个很好的构建这个东西的方法。你真的没有办法在你的应用程序中做一个健康检查端点吗?这对你来说方便多了


最后,如果答案真的是“不”,你能让你的应用程序写一个现成的文件吗?而不是打印“就绪”do
touch/app/readyfile
。然后,您的健康检查可以只检查该文件是否存在。(要使这项工作正常,您必须创建一个卷,并在应用程序容器和运行状况检查容器中的/app处装载它,以便它们都能看到生成的文件)

打开的文件太多是因为我没有使用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的观点,即让应用程序创建一个就绪文件将是一个更好的设计。

打开的文件太多是因为我没有使用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的观点,即让应用程序创建一个现成的文件将是一个更好的设计