gpt4 book ai didi

udp - Kubernetes UDP 服务未与 Google Cloud 负载平衡器一起运行

转载 作者:行者123 更新时间:2023-12-02 11:49:05 24 4
gpt4 key购买 nike

我正在尝试在 Google Cloud 上的 kubernetes 中运行一个非常简单的 UDP 服务,但无法访问我向互联网公开的端口。
这是部署和服务文件:

部署.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: udp-server-deployment
spec:
replicas: 2
template:
metadata:
labels:
name: udp-server
spec:
containers:
- name: udp-server
image: jpoon/udp-server
imagePullPolicy: Always
ports:
- containerPort: 10001
protocol: UDP

服务.yaml:
apiVersion: v1
kind: Service
metadata:
name: udp-server-service
labels:
app: udp-server
spec:
type: LoadBalancer
ports:
- port: 10001
protocol: UDP
selector:
name: udp-server

这会在 Google Cloud 中创建负载均衡器,并公开正确的端口。像这样:

enter image description here

但是当我尝试访问该端口时,它无法访问。我在 GCE 中尝试了一些变体来公开 udp 端口​​,但似乎都没有工作。
➜  udp-example telnet 35.192.59.72 10001 
Trying 35.192.59.72...
telnet: connect to address 35.192.59.72: Connection refused
telnet: Unable to connect to remote host

最佳答案

我试图复制这个问题,我相信它是由失败的 kubernetes 配置引起的,但是 你是如何尝试测试它并且可能缺少防火墙规则。

首先考虑打开到目标host:port的连接。使用 telnet将始终失败,因为您使用的协议(protocol)是 UDP 而不是 TCP,因此即使服务器已启动并正在运行,也不会创建连接。并记住创建相应的防火墙规则以确保允许流量。

我去查看go server的源图和go client ,我拿了他们的go源代码,他们在本地主机上工作,但他们没有在不同的实例上运行客户端并以负载均衡器为目标。

因此,为了了解是否是 kubernetes 失败,我尝试使用与 nginx 镜像和 TCP 相同的 yaml 文件,一切正常。

在同一个 GitHub 页面中,服务器的 Dockerfile 示例包含此行:

# Expose your port 
EXPOSE 61243

因此,我将 ssh 放入容器(注意 ash 而不是 bash ),以了解实际发生的情况以及它正在监听的服务器在哪个端口上以及 Docker 公开了哪个端口。
kubectl exec -it udp-server-deployment-8306694-zq412 -- /bin/ash

但是请记住:

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.



进入容器后,我运行了客户端,并针对本地主机和负载均衡器 IP 输出以下输出:
/go/src/udp # go run client.go
SERVER_ADDRESS=
ServerAddr=:10001
Received udp-server-deployment-8306694-zq412 from 127.0.0.1:10001

Mening 服务器工作正常。

更新

由于防火墙规则不适用于那里(我的错误),因此无法从 Cloud Shell 与客户端连接。

要测试它是否正常工作,请启动一个实例,安装 go,运行客户端并检查它是否正常工作。
curl -O https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
tar xvf go1.7.4.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
vi client.go
/usr/local/go/bin/go run client.go

这是client.go的内容:
package main

import (
"fmt"
"net"
"strconv"
"time"
)

func checkError(err error) {
if err != nil {
fmt.Println("Error: ", err)
}
}

func main() {
Server := "[LOAD BALANCER IP]"
fmt.Println("SERVER_ADDRESS=" + Server)

serverAddr, err := net.ResolveUDPAddr("udp", Server+":10001")
fmt.Println("ServerAddr=" + serverAddr.String())
checkError(err)

conn, err := net.DialUDP("udp", nil, serverAddr)
checkError(err)
defer conn.Close()

buf := make([]byte, 1024)
i := 0

for {
msg := strconv.Itoa(i)
fmt.Fprintf(conn, msg)
i++

n, addr, err := conn.ReadFromUDP(buf)
fmt.Println("Received ", string(buf[0:n]), " from ", addr)

if err != nil {
fmt.Println("Error: ", err)
}

time.Sleep(time.Second * 1)
}
}

请注意,您必须替换 [LOAD BALANCER IP] placeolder 与您的值(value)。

关于udp - Kubernetes UDP 服务未与 Google Cloud 负载平衡器一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48171383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com