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

前提条件

步骤一:部署示例应用

  1. 通过kubectl连接集群。具体操作,请参见通过kubectl管理Kubernetes集群
  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: hiroakis/tornado-websocket-example
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8888
    ---
  3. 执行以下命令,创建tornado应用。
    kubectl apply -f tornado.yaml

步骤二:设置路由规则

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 创建Gateway。
    1. 控制平面(自定义资源管理)区域单击Gateway页签,然后单击新建
    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连接。

      Gateway页签下可以看到名为tornado-gateway的服务网关。
  5. 创建VirtualService。
    1. 控制平面(自定义资源管理)区域单击VirtualService页签,然后单击新建
    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服务。

      VirtualService页签下可以看到名为tornado的VirtualService。

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

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择服务与路由 > 服务
  5. 服务页面顶部设置命名空间为istio-system,查看istio-ingressgateway外部端点列下端口为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"
  3. 可以看到,四个浏览器的WebSocket服务页面数据同时被更新,且页面显示结果一致。
    websocket服务