通过入口网关访问网格内WebSocket服务

WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket允许服务端主动向客户端推送数据。遵守WebSocket协议的服务即为WebSocket服务。本文通过示例介绍如何通过ASM入口网关访问网格内的WebSocket服务。

前提条件

步骤一:部署示例应用

  1. 通过kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  2. 使用以下内容,创建名为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
    ---
  3. 执行以下命令,创建tornado应用。

    kubectl apply -f tornado.yaml

步骤二:设置路由规则

  1. 登录ASM控制台

  2. 在左侧导航栏,选择服务网格 > 网格管理

  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

  4. 创建网关规则

    1. 在网格详情页面左侧导航栏,选择ASM网关 > 网关规则,然后在右侧页面,单击使用YAML创建

    2. 设置命名空间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:
          - "*"

      设置number80,使WebSocket服务通过80端口接收传入或传出的HTTP或TCP连接。

  5. 创建虚拟服务

    1. 在网格详情页面左侧导航栏,选择流量管理中心 > 虚拟服务,然后在右侧页面,单击使用YAML创建

    2. 设置命名空间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服务。

步骤三:获取入口网关的地址

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏,单击集群

  3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

  4. 在集群管理页左侧导航栏,选择网络 > 服务

  5. 服务页面顶部设置命名空间istio-system,查看istio-ingressgateway External IP列下端口为80的IP地址。

步骤四:验证通过入口网关访问WebSocket服务

  1. 在四个不同类型的浏览器中输入http://<入口网关地址>

    服务

  2. 分别执行以下命令,请求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协议访问

  1. 为上述网关设置服务器证书和私钥。具体操作,请参见步骤一:为多个主机准备服务器证书和私钥

    请确保在ACK集群下的istio-system命名空间中,已经创建了包含证书和私钥的Secret,且Secret名称为myexample-credential。

  2. 修改步骤二:设置路由规则中创建的路由规则。

    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服务

  1. 修改本机的hosts文件,将a.aliyun.com解析到ASM网关的IP地址,确保可以通过步骤五.1中设置的证书中的域名访问到ASM网关。

  2. 在四个不同类型的浏览器中输入https://a.aliyun.com

    服务

  3. 分别执行以下命令,请求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服务页面数据同时被更新,且页面显示结果一致。