【发布时间】:2021-10-07 19:45:55
【问题描述】:
我有一个使用 socket.io 的简单 Node.js 聊天示例。我已经在本地使用 docker 容器测试了此部署,并且 Web 客户端成功连接到 websocket (socket.io)。当我尝试在带有入口控制器的 Kubernetes 集群上部署它时,就会出现问题。
我的问题是,在使用入口控制器时 特殊 socket.io 有什么特别需要的吗?
我得到的错误信息是 <<browser name>> Can't estabilish a connection to the server at ws://<<address>>/socket.io/EIO=3&transport=websocket
下面是服务器端
的简单实现var io = socket(server);
io.on('connection', (socket)=>{
console.log('made socket connection')
socket.on('chat', (message)=>{
message:message.value
})
下面是客户端:
var socket = io.connect("http://localhost:3002", {
upgrade: false,
transports: ['websocket'],
secure: True
});
我的 ingress yaml 文件如下所示
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ws-ingress
namespace: websocket-ns
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/websocket-services: "ws-service"
nginx.ingress.kubernetes.io/proxy-read-timeout: '3600'
nginx.ingress.kubernetes.io/proxy-send-timeout: '3600'
nginx.ingress.kubernetes.io/server-snippet: |
http {
server {
listen 3002;
location = / {
proxy_set_header Upgrade "websocket";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
upstream nodes {
hash $remote_addr consistent;
server app01:3002;
}
}
spec:
rules:
- host: "$host_address"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ws-service
port:
number: 80
服务 yaml:
apiVersion: v1
kind: Service
metadata:
name: ws-service
namespace: websocket-ns
labels:
app: ws-service
spec:
type: LoadBalancer
selector:
app: ws-app
ports:
- port: 80
protocol: TCP
targetPort: 3002
服务器部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ws-app
namespace: websocket-ns
labels:
app: ws-app
spec:
replicas: 1
selector:
matchLabels:
app: ws-app
template:
metadata:
labels:
app: ws-app
spec:
containers:
- name: ws-app
image: themuchy/socketexample
ports:
- containerPort: 3002
name: ws-app
【问题讨论】:
-
不确定你为什么在配置中添加了
nginx.ingress.kubernetes.io/server-snippet并将 HTTP 升级到 websocket。那个 nginx 控制器会自己做 -
在入口中,您的流量进入
ws-service,但在注释中您提到了另一个服务名称。 -
@HarshManvar 我在入口和注释中使用了相同的服务名称(ws-service),对不起,我只是忘记在我在这里发布问题之前更改注释中的名称(一直在尝试不同的解决方案)。
标签: kubernetes websocket socket.io kubernetes-ingress nginx-ingress