簡體   English   中英

Linkerd 入站端口注釋導致“無法綁定入站偵聽器”

[英]Linkerd inbound port annotation leads to "Failed to bind inbound listener"

我們在 Azure AKS Kube.netes 上使用 Linkerd 2.11.1。 其中有一個使用 Alpine Linux 圖像的部署,其中包含服務於 API 的 Apache/mod_php/PHP8。HTTPS 由帶有證書管理器的 Traefik v2 解析,因此傳入 API 的流量位於端口 80 上。Linkerd 代理容器作為 Sidecar 注入。

最近看到API容器在做Rolling部署的時候短時間內返回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 錯誤。 但是,如果我將 linkerd 入站端口注釋添加到 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

有人能告訴我為什么它無法綁定入站偵聽器嗎?

任何幫助深表感謝,

謝謝,

帕斯卡

找到它:Kube.netes 發送異步請求以關閉 pod 並不再向它們發送流量。 如果 pod 關閉的速度快於它從 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

        annotations = {
          "config.linkerd.io/inbound-port" = "80"
        }

我不認為你想要這個設置。 Linkerd 將透明地代理連接而無需您進行任何設置。

此設置將 Linkerd 的代理配置為嘗試偵聽端口 80。這可能會與您的 web 服務器的端口配置發生沖突; 但是您遇到的具體錯誤是 Linkerd 代理沒有以 root 用戶身份運行,因此它沒有綁定端口 80 的權限。

如果您刪除該注釋,我希望這一切都能正常工作:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM