WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket允许服务端主动向客户端推送数据。遵守WebSocket协议的服务即为WebSocket服务。本文通过示例介绍如何通过ASM入口网关访问网格内的WebSocket服务。
前提条件
步骤一:部署示例应用
通过kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
使用以下内容,创建名为tornado的YAML文件。
apiVersion: v1 kind: Service metadata: name: tornado labels: app: tornado service: tornado spec: ports: - port: 8888 name: http selector: app: tornado --- apiVersion: apps/v1 kind: Deployment metadata: name: tornado spec: replicas: 1 selector: matchLabels: app: tornado version: v1 template: metadata: labels: app: tornado version: v1 spec: containers: - name: tornado image: registry.cn-beijing.aliyuncs.com/aliacs-app-catalog/tornado:lastest imagePullPolicy: Always ports: - containerPort: 8888 ---
执行以下命令,创建tornado应用。
kubectl apply -f tornado.yaml
步骤二:设置路由规则
登录ASM控制台。
在左侧导航栏,选择 。
在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
创建网关规则。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
设置命名空间为default,将以下内容复制到文本框中,单击创建。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
设置
number
为80
,使WebSocket服务通过80端口接收传入或传出的HTTP或TCP连接。
创建虚拟服务。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
设置命名空间为default,将以下内容复制到文本框中,单击创建。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tornado spec: hosts: - "*" gateways: - tornado-gateway http: - match: - uri: prefix: / route: - destination: host: tornado weight: 100
设置
hosts
为*
,表示任意请求都可以访问WebSocket服务。
步骤三:获取入口网关的地址
登录容器服务管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏,选择 。
在服务页面顶部设置命名空间为istio-system,查看istio-ingressgateway External IP列下端口为80的IP地址。
步骤四:验证通过入口网关访问WebSocket服务
在四个不同类型的浏览器中输入http://<入口网关地址>。
分别执行以下命令,请求WebSocket服务。
curl "http://<入口网关地址>/api?id=8&value=300"
curl "http://<入口网关地址>/api?id=5&value=600"
curl "http://<入口网关地址>/api?id=1&value=200"
curl "http://<入口网关地址>/api?id=3&value=290"
可以看到,四个浏览器的WebSocket服务页面数据同时被更新,且页面显示结果一致。
步骤五:切换使用wss协议访问
为上述网关设置服务器证书和私钥。具体操作,请参见步骤一:为多个主机准备服务器证书和私钥。
请确保在ACK集群下的istio-system命名空间中,已经创建了包含证书和私钥的Secret,且Secret名称为myexample-credential。
修改步骤二:设置路由规则中创建的路由规则。
YAML示例如下:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" - hosts: - "*" port: name: https number: 443 protocol: HTTPS tls: credentialName: myexample-credential mode: SIMPLE
步骤六:验证使用wss协议访问WebSocket服务
修改本机的hosts文件,将a.aliyun.com解析到ASM网关的IP地址,确保可以通过步骤五.1中设置的证书中的域名访问到ASM网关。
在四个不同类型的浏览器中输入https://a.aliyun.com。
分别执行以下命令,请求WebSocket服务。
curl -k "https://<入口网关地址>/api?id=8&value=300"
curl -k "https://<入口网关地址>/api?id=5&value=600"
curl -k "https://<入口网关地址>/api?id=1&value=200"
curl -k "https://<入口网关地址>/api?id=3&value=290"
可以看到,四个浏览器的WebSocket服务页面数据同时被更新,且页面显示结果一致。