本文介紹如何在應用監聽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資源。操作步驟如下:
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊使用YAML建立。
在建立頁面,選擇命名空間和任意情境模版,配置以下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}