如何为golang tcp服务器配置GKE负载均衡器?

时间:2019-05-03 00:28:41

标签: go tcp kubernetes google-kubernetes-engine

在部署golang服务器容器和gke负载平衡器之后,我可以成功连接到负载平衡器的外部ip,但是没有数据到达服务器容器。

当我在本地运行服务器容器并将客户端指向localhost时,它可以按预期工作。我将其更改为服务于HTTP请求,并且在相同的kubernetes清单中也可以正常工作。但是,如果我尝试同时在不同的端口上同时提供tcp和http服务,则在gke上都不起作用,但在本地也可以正常工作。因此,我怀疑这可能与我配置负载均衡器的方式或在gke上运行但不在本地运行的服务器中侦听tcp连接的方式有关。

K8s服务清单

apiVersion: v1
kind: Service
metadata:
  name: steel-server-service
spec:
  type: LoadBalancer
  selector:
    app: steel-server
  ports:
  - protocol: TCP
    name: tcp
    port: 12345
    targetPort: 12345

K8s部署清单

apiVersion: apps/v1
kind: Deployment
metadata:
  name: steel-server-deployment
  labels:
    app: steel-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: steel-server
  template:
    metadata:
      labels:
        app: steel-server
    spec:
      containers:
      - name: steel-server
        image: gcr.io/<my-project-id>/steel-server:latest
        ports:
        - containerPort: 12345
          name: tcp

Relevent Go TCP服务器代码

server, err := net.Listen("tcp", ":12345")
if err != nil {
    log.Fatalln("Couldn't start up tcp server: ", err)
}

1 个答案:

答案 0 :(得分:0)

您能否先尝试使用kubectl get svc,以便从GCP获得type:loadbalancer的外部IP时知道负载均衡器打开了哪些端口。

apiVersion: v1
kind: Service
metadata:
  name: steel-server-service
spec:
  type: LoadBalancer
  selector:
    app: steel-server
  ports:
  - protocol: TCP
    name: tcp
    port: 80
    targetPort: 12345

尝试使用此服务配置,我将端口更改为80,而目标端口与容器端口相同。