我们在Azure AKS Kubernetes上使用Linkerd 2.11.1。其中之一是使用包含Apache/mod_php/php 8的Alpine映像进行部署,该映像提供了一个API。HTTPS由Traefik v2与cert管理器一起解析,因此在接下来的访问中,API的流量在端口80上。Linkerd代理容器作为Sidecar注入。
最近,我看到API容器在执行滚动部署时会在短时间内返回504个错误。在Sidecars日志中,我发现了以下内容:
[ 0.000590s] INFO ThreadId(01) linkerd2_proxy::rt: Using single-threaded proxy runtime
[ 0.001062s] INFO ThreadId(01) linkerd2_proxy: Admin interface on 0.0.0.0:4191
[ 0.001078s] INFO ThreadId(01) linkerd2_proxy: Inbound interface on 0.0.0.0:4143
[ 0.001081s] INFO ThreadId(01) linkerd2_proxy: Outbound interface on 127.0.0.1:4140
[ 0.001083s] INFO ThreadId(01) linkerd2_proxy: Tap interface on 0.0.0.0:4190
[ 0.001085s] INFO ThreadId(01) linkerd2_proxy: Local identity is default.my-api.serviceaccount.identity.linkerd.cluster.local
[ 0.001088s] INFO ThreadId(01) linkerd2_proxy: Identity verified via linkerd-identity-headless.linkerd.svc.cluster.local:8080 (linkerd-identity.linkerd.serviceaccount.identity.linkerd.cluster.local)
[ 0.001090s] INFO ThreadId(01) linkerd2_proxy: Destinations resolved via linkerd-dst-headless.linkerd.svc.cluster.local:8086 (linkerd-destination.linkerd.serviceaccount.identity.linkerd.cluster.local)
[ 0.014676s] INFO ThreadId(02) daemon:identity: linkerd_app: Certified identity: default.my-api.serviceaccount.identity.linkerd.cluster.local
[ 3674.769855s] INFO ThreadId(01) inbound:server{port=80}: linkerd_app_inbound::detect: Handling connection as opaque timeout=linkerd_proxy_http::version::Version protocol detection timed out after 10s我猜这个检测会导致504个错误。但是,如果我将链接器入站端口注释添加到pod模板(terraform语法):
resource "kubernetes_deployment" "my_api" {
metadata {
name = "my-api"
namespace = "my-api"
labels = {
app = "my-api"
}
}
spec {
replicas = 20
selector {
match_labels = {
app = "my-api"
}
}
template {
metadata {
labels = {
app = "my-api"
}
annotations = {
"config.linkerd.io/inbound-port" = "80"
}
}我得到以下信息:
time="2022-03-01T14:56:44Z" level=info msg="Found pre-existing key: /var/run/linkerd/identity/end-entity/key.p8"
time="2022-03-01T14:56:44Z" level=info msg="Found pre-existing CSR: /var/run/linkerd/identity/end-entity/csr.der"
[ 0.000547s] INFO ThreadId(01) linkerd2_proxy::rt: Using single-threaded proxy runtime
thread 'main' panicked at 'Failed to bind inbound listener: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', /github/workspace/linkerd/app/src/lib.rs:195:14
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace有人能告诉我为什么它不能绑定入站侦听器吗?
任何帮助都是非常感谢的
谢谢,
Pascal
发布于 2022-03-07 10:47:46
找到它: Kubernetes以异步方式发送请求来关闭吊舱,并且不再向它们发送通信量。如果吊舱关闭的速度比它从IP列表中删除的速度要快,它可以在已经死掉的时候接收请求。
为了解决这个问题,我在应用程序容器中添加了一个preStop生命周期挂钩:
lifecycle {
pre_stop {
exec {
command = ["/bin/sh", "-c" , "sleep 5"]
}
}
}以及对pod模板的以下注释:
annotations = {
"config.alpha.linkerd.io/proxy-wait-before-exit-seconds" = "10"
}在此记录如下:
https://linkerd.io/2.11/tasks/graceful-shutdown/
在这里:
https://blog.gruntwork.io/delaying-shutdown-to-wait-for-pod-deletion-propagation-445f779a8304
发布于 2022-03-04 01:07:40
annotations = {
"config.linkerd.io/inbound-port" = "80"
}我不认为你想要这样的环境。没有设置任何内容,Linkerd将透明地代理连接。
此设置将Linkerd的代理配置为尝试侦听端口80。这可能与web服务器的端口配置相冲突;但您遇到的具体错误是,Linkerd代理没有以root身份运行,因此它没有绑定端口80的权限。
如果您删除了该注释,我希望所有这些都能正常工作:)
https://stackoverflow.com/questions/71310780
复制相似问题