【发布时间】:2020-08-03 19:29:10
【问题描述】:
我正在尝试使 websocket 服务在我们组织环境中的 Azure Kubernetes 集群上运行。 我现有的环境也有 REST api 和 Angular 应用程序使用 ssl 处理入口。 但是当我在入口添加 websocket 服务时,它不起作用。
所以,我尝试使用 Azure 免费订阅首先实现相同的无 SSL。对于我的应用程序,我启用了 Http Routing 并使用注释 addon-http-application-routing。
我遇到了错误。 'ws://40.119.7.246/ws' 失败:WebSocket 握手期间出错:意外响应代码:404
请帮忙确认我哪里做错了?
下面是配置的详细信息。
Dockerfile
FROM node:alpine
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
CMD ["node","./dist/server.js"]
EXPOSE 8010
socketserver.yaml - 包含部署和服务。
apiVersion: apps/v1
kind: Deployment
metadata:
name: socketserver
spec:
replicas: 1
selector:
matchLabels:
app: socketserver
template:
metadata:
labels:
app: socketserver
spec:
containers:
- name: socketserver
image: regkompella.azurecr.io/socketserver:1.0.0
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8010
imagePullSecrets:
- name: regkompella-azurecr-io
---
apiVersion: v1
kind: Service
metadata:
name: socketserver-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8010
selector:
app: socketserver
type: ClusterIP
---
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo-ingress
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/proxy-body-size: 10m
nginx.ingress.kubernetes.io/websocket-services: socketserver-svc
nginx.org/websocket-services: socketserver-svc
spec:
rules:
- host: demosocket.com
- http:
paths:
- path: /
backend:
serviceName: angular-application-svc
servicePort: 80
- path: /ws
backend:
serviceName: socketserver-svc
servicePort: 80
【问题讨论】:
-
你是如何测试的?我可以在你的入口配置中看到主机`host:demosocket.com`,但在你的测试中
'ws://40.119.7.246/ws。错误 404 是正确的,因为你什么都没有使用主机demosocket.comnginx 入口不识别这个 IP 只是主机。您可以使用在您的主机文件中配置的demosocket.com进行测试,您使用curl -H 'Host: demosocket.com' http://40.119.7.246/ws -
这是一个虚拟主机,我将其命名为 demosocket.com。但同样,我想用我的 ingress 的公共 IP,我可以测试它。这不是真的吗?我是否需要在入口处注明主机名?
-
我尝试将入口公共 IP 的 DNS 名称赋予这个名称 demosocket.southcentralus.cloudapp.azure.com。并指出它也是 ingress.yaml 上的主机名。当我尝试连接时,出现以下错误。 ** index.js:15 WebSocket 连接到“ws://demosocket.southcentralus.cloudapp.azure.com/ws”失败:WebSocket 握手期间出错:意外响应代码:404**
-
@KoopaKiller - 我有些想念你在聊天中的最后一条评论。我也尝试使用 demosocket.com 和 dns 名称进行卷曲。使用 demosocket.com 我得到了 404 并且 DNS 名称返回给我 curl -H 'demosocket.southcentralus.cloudapp.azure.com' 20.45.1.216/ws
308 永久重定向 308 永久重定向
nginx/1.15.3 跨度>
标签: websocket kubernetes-ingress nginx-ingress azure-aks