全部產品
Search
文件中心

Alibaba Cloud Service Mesh:如何使叢集中監聽localhost的應用被其它Pod訪問

更新時間:Jan 13, 2025

本文介紹如何在應用監聽localhost的情況下,通過配置Sidecar資源,使監聽localhost的應用可以被叢集中其它Pod通過Service訪問。

問題現象

當部署在叢集中的應用監聽localhost時,即使通過Service暴露應用的服務連接埠,該服務也無法被叢集中的其他Pod訪問。

不同語言的應用監聽localhost樣本如下:

  • Golang:net.Listen("tcp", "localhost:8080")

  • Node.js:http.createServer().listen(8080, "localhost")

  • Python:socket.socket().bind(("localhost", 8083))

問題原因

當叢集中應用監聽localhost網路地址時,由於localhost是本地地址,叢集中的其它Pod對其訪問不通是正常現象。

解決方案

您可以任選以下方式,對外暴露應用服務。

  • 方式一:修改應用監聽的網路地址

    如果您希望應用提供的服務對外暴露,建議修改應用代碼,將應用監聽的網路地址從localhost改為0.0.0.0。

  • 方式二:使用Service Mesh暴露監聽localhost的服務

    如果您不希望修改應用代碼,同時需要將監聽localhost的應用暴露給叢集中的其它Pod,可以通過ASM控制台建立Sidecar資源。操作步驟如下:

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > Sidecar流量配置,然後單擊使用YAML建立

    3. 建立頁面,選擇命名空間和任意情境模版,配置以下YAML,然後單擊建立

      請您按照實際情況對以下欄位進行替換。

      欄位

      說明

      {namespace}

      替換為應用部署所在的命名空間。

      {container_port}

      替換為應用監聽localhost的容器連接埠。

      {port}

      替換為應用的Service連接埠。

      {key} : {value}

      替換為選中應用Pod的標籤。

      apiVersion: networking.istio.io/v1beta1
      kind: Sidecar
      metadata:
        name: localhost-access
        namespace: {namespace}
      spec:
        ingress:
          - defaultEndpoint: '127.0.0.1:{container_port}'
            port:
              name: tcp
              number: {port}
              protocol: TCP
        workloadSelector:
          labels:
            {key}: {value}