如何在Kubernetes中为WordPress创建一个Liveness探测器

279 阅读2分钟

你试图创建一个HTTP Liveness探针来检查你的WordPress容器的状态,但是你得到了一个非常奇怪的连接拒绝错误。

你得到的东西是这样的。

Warning  Unhealthy  3m46s (x4 over 4m56s)  kubelet            Liveness probe failed: Get "http://10.28.1.25:80/": dial tcp 10.28.1.25:80: connect: connection refused
Warning  Unhealthy  3m46s (x8 over 4m56s)  kubelet            Readiness probe failed: Get "http://10.28.1.25:80/": dial tcp 10.28.1.25:80: connect: connection refused
Warning  BackOff    13s (x10 over 2m57s)   kubelet            Back-off restarting failed container

它说连接被拒绝,而你真的很困惑,因为你确信WordPress的Apache服务器是在80端口上监听的。

你确实是最正确的。

但实际上,正在发生的事情,是与WordPress正在将有效性探针重定向到规范域(你真正的网站域名)这一事实有关的,因为你在做请求时没有使用规范域。WordPress不喜欢这样,并试图将你重定向到真正的域名。在容器中,很可能重定向会以拒绝连接的方式失败。

修复方法是添加一个X-Forwarded-Host and Host头,以确保Apache服务器不会试图将失效探针重定向到规范域。

下面是有效性HTTP探针的httpGet部分应该是这样的。

livenessProbe:

请注意,这个httpGet的配置也适用于Readiness和Startup探测器。

在你的有效性探针中得到一个超时异常

还有一件事会让你措手不及。如果你的WordPress容器太慢,Kubernetes的有效性探测可能会失败。

你可能会看到这样的错误。

Warning  Unhealthy  2m29s                   kubelet            Readiness probe failed: Get "http://10.28.2.11:80/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

默认情况下,有效性探针的timeoutInSeconds设置为1s。这可能没有足够的时间让你的WordPress容器做出反应,kubelet可能最终会多次重启你的WordPress容器。这当然只会使问题恶化,因为越多的容器试图重启,对资源的竞争就越大。而更多的容器也可能因此而失败。

一个明显的解决方案是将timeoutInSeconds的值增加到一个足够高的值,这样你的liveness探针就会随机出现。或者/而且你可以增加failationThreshold,以确保一两个异常值不会因为反应慢而立即重新启动容器。

如果你只关心确保你的WordPress容器在重新部署后可以接收请求,那么你可能想使用一个启动探测。

下面是我为我的wordpress容器创建的一个启动探测器的例子。

startupProbe:

资源。

Kubernetes的准备性、有效性和启动探针文档
kubernetes.io/docs/tasks/…

我在Stackoverflow的帖子中找到了这个解决方案:
stackoverflow.com/questions/5…