在大规模微服务场景下,为了建立稳定可靠的业务服务,服务治理能力至关重要。MSE微服务治理中心提供了在大规模场景下的服务治理能力,包含服务查询、标签路由等功能。本文介绍如何通过MSE完成微服务的服务治理。

前提条件

背景信息

以下以Bookinfo应用为示例,展示MSE微服务的服务治理功能。Bookinfo应用包括ProductPage客户端、Ratings、Reviews V1和Reviews V2微服务。当ProductPage客户端接受到请求时,将调用Reviews V1和Reviews V2微服务,并在页面的不同区域显示调用Reviews V1和Reviews V2微服务的结果:
  • 调用Reviews V1微服务时,将在Bookinfo页面Review1区域不显示星星。
  • 调用Reviews V2微服务时,将在Bookinfo页面Review2区域显示黑白星星。

步骤一:在ASM安装MSE微服务治理组件

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网关管理详情页面右上方单击功能设置
  5. 功能设置更新面板单击展开高级选项,选中启用MSE微服务治理组件,然后单击确定

步骤二:部署演示应用Bookinfo

  1. 在ACK集群中部署Reviews V1。
    1. 使用以下内容,创建名为reviews1.yaml的文件。
      apiVersion: v1
      kind: Service
      metadata:
        name: reviews
        labels:
          app: reviews
          service: reviews
      spec:
        ports:
        - port: 9080
          name: http
        selector:
          app: reviews
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: bookinfo-reviews
        labels:
          account: reviews
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: reviews-v1
        labels:
          app: reviews
          version: v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: reviews
            version: v1
        template:
          metadata:
            labels:
              app: reviews
              version: v1
          spec:
            serviceAccountName: bookinfo-reviews
            containers:
            - name: reviews
              image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
              imagePullPolicy: IfNotPresent
              env:
              - name: LOG_DIR
                value: "/tmp/logs"
              ports:
              - containerPort: 9080
              volumeMounts:
              - name: tmp
                mountPath: /tmp
              - name: wlp-output
                mountPath: /opt/ibm/wlp/output
            volumes:
            - name: wlp-output
              emptyDir: {}
            - name: tmp
              emptyDir: {}
    2. 执行以下命令,部署Reviews V1。
      kubectl apply -f reviews1.yaml
  2. 在ACK集群中部署Reviews V2。
    1. 使用以下内容,创建名为reviews2.yaml的文件。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: reviews-v2
        labels:
          app: reviews
          version: v2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: reviews
            version: v2
        template:
          metadata:
            labels:
              app: reviews
              version: v2
          spec:
            serviceAccountName: bookinfo-reviews
            containers:
            - name: reviews
              image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
              imagePullPolicy: IfNotPresent
              env:
              - name: LOG_DIR
                value: "/tmp/logs"
              ports:
              - containerPort: 9080
              volumeMounts:
              - name: tmp
                mountPath: /tmp
              - name: wlp-output
                mountPath: /opt/ibm/wlp/output
            volumes:
            - name: wlp-output
              emptyDir: {}
            - name: tmp
              emptyDir: {}
    2. 执行以下命令,部署Reviews V2。
      kubectl apply -f reviews2.yaml
  3. 在ACK集群中部署ProductPage。
    1. 使用以下内容,创建名为ProductPage.yaml的文件。
      apiVersion: v1
      kind: Service
      metadata:
        name: productpage
        labels:
          app: productpage
          service: productpage
      spec:
        ports:
        - port: 9080
          name: http
        selector:
          app: productpage
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: bookinfo-productpage
        labels:
          account: productpage
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: productpage-v1
        labels:
          app: productpage
          version: v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: productpage
            version: v1
        template:
          metadata:
            labels:
              app: productpage
              version: v1
          spec:
            serviceAccountName: bookinfo-productpage
            containers:
            - name: productpage
              image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 9080
              volumeMounts:
              - name: tmp
                mountPath: /tmp
            volumes:
            - name: tmp
              emptyDir: {}
    2. 执行以下命令,部署ProductPage。
      kubectl apply -f ProductPage.yaml
  4. 在ACK集群中部署Ratings。
    1. 使用以下内容,创建名为ratings.yaml的文件。
      apiVersion: v1
      kind: Service
      metadata:
        name: ratings
        labels:
          app: ratings
          service: ratings
      spec:
        ports:
        - port: 9080
          name: http
        selector:
          app: ratings
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: bookinfo-ratings
        labels:
          account: ratings
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: ratings-v1
        labels:
          app: ratings
          version: v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: ratings
            version: v1
        template:
          metadata:
            labels:
              app: ratings
              version: v1
          spec:
            serviceAccountName: bookinfo-ratings
            containers:
            - name: ratings
              image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 9080
    2. 执行以下命令,部署Ratings。
      kubectl apply -f ratings.yaml
  5. 创建Booklinfo外部访问地址。
    1. 登录容器服务管理控制台容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页面选择网络 > 服务
    5. 服务页面单击创建
    6. 创建服务对话框中配置参数,然后单击创建
      以下为重点参数描述,其他参数请参见管理服务
      • 类型:选择服务访问的方式,本例选择负载均衡公网访问
      • 关联:选择服务要绑定的后端应用,本例为productpage。
      • 端口映射:添加服务端口和容器端口,容器端口需要与后端Pod暴露的容器端口一致,本例为9080。
      服务页面单击目标服务右侧外部端点列下的地址,即可跳转到Bookinfo页面。

步骤三:启用自动注入

在部署应用的命名空间中启动自动注入。

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏单击命名空间
  5. 命名空间页面单击目标命名空间自动注入列的启用Sidecar自动注入
    启用Sidecar自动注入的命名空间需要与部署应用的命名空间保持一致。
  6. 在弹出的对话框中单击确定

步骤四:使用微服务治理功能

查看应用详情

  1. 登录MSE治理中心控制台
  2. 在控制台左侧导航栏选择微服务治理中心 > 应用列表
  3. 在应用列表页面单击应用名称列下的ProductPage。
  4. 在应用详情页面您可以查看目标应用的应用信息和服务治理信息。
    应用详情

查询服务列表

  1. 登录MSE治理中心控制台
  2. 在控制台左侧导航栏选择微服务治理中心 > 服务查询
  3. 请选择文本框中选择框架:Istio,然后在服务列表中单击reviews。
  4. 服务详情页面查看服务的详细信息。
    服务详情

配置标签路由

  1. 登录MSE治理中心控制台
  2. 在控制台左侧导航栏选择微服务治理中心 > 流量配置 > 标签路由
  3. 标签路由页面单击创建标签路由
  4. 创建标签路由页面设置参数,然后单击确定
    参数 描述
    路由名称 标签路由规则名称,例如test-Istio
    描述 规则描述。
    应用 选择您的应用名称。
    流量类型 支持按内容路由按比例路由
    框架类型 默认为服务网格
    流量比例 支持手动配置流量比例。本例设置v1流量比例为100%,设置v2流量比例为0。
    注意 各流量比例配置总和为100%。
  5. 查看Bookinfo页面。
    多次刷新Bookinfo页面,可以看到Bookinfo应用的Review1区域显示无星星,Review2区域显示无星星。说明访问Bookinfo应用时,只调用了Review1服务,没有调用Review2服务。结果

配置服务鉴权

当您的某个微服务应用有安全要求,不希望其他所有应用都能调用时,可以通过配置服务鉴权对调用该应用的其他应用进行鉴权。

  1. 登录MSE治理中心控制台
  2. 在左侧导航栏选择微服务治理中心 > 服务鉴权
  3. 服务鉴权页面单击创建规则
  4. 创建规则面板中设置服务鉴权参数,然后单击确定

    服务鉴权规则参数说明:

    参数 说明
    规则名称 鉴权规则名称,支持大小写字母、数字、下划线(_)和短划线(-),长度不超过64个字符。
    被调用方类型 根据实际情况选择应用K8s Namespace。本文设置被调用方类型应用
    被调用方(应用) 选择被调用的应用。
    被调用方框架 被调用的应用所使用的框架,选择服务网格
    添加所有接口规则 单击添加所有接口规则,设置所有接口规则。本文选择添加所有接口规则。以下为添加所有接口规则参数:
    注意 所有接口的通用规则仅支持添加一次。
    • 被调用方接口:默认为所有Path,不可设置。
    • 鉴权方式:可选白名单(允许调用)黑名单(拒绝调用)
    • 调用方:需要鉴权的调用方应用,可以单击添加调用方设置多个需要鉴权的调用方应用。
    添加指定接口规则 单击添加指定接口规则,设置指定接口规则。以下为添加指定接口规则参数:
    说明 指定接口添加的规则不是追加,而是覆盖针对所有接口的通用规则,请谨慎配置。
    • 被调用方Path:指定被调用应用的Path。
    • 鉴权方式:选白名单(允许调用)黑名单(拒绝调用)
    • 调用方:需要鉴权的调用方应用,可以单击添加调用方设置多个需要鉴权的调用方应用。
    默认状态 规则的启用开关。
    • 打开:创建后即启用,默认打开。
    • 关闭:创建后不启用,如果需要启用,需要在服务鉴权页面规则的操作列单击开启

测试多语言服务

在日常开发中,开发人员或测试人员需要临时调用线上服务来调试已经部署的服务或查询线上数据。服务测试功能可以让您在控制台填写调用参数、发起服务调用,并得到服务调用的结果。

  1. 登录MSE治理中心控制台
  2. 在左侧导航栏选择微服务治理中心 > 微服务测试 > 服务测试
  3. 在顶部菜单栏选择地域,在框架类型列表中选择框架:Istio,然后单击目标服务名称或操作列的测试按钮。
  4. 选择测试方法面板中设置测试相关参数,然后单击执行

    测试服务参数说明如下。

    参数 描述
    调用IP 要测试服务的实例IP。如果部署了多个实例,在列表中选择其中一个IP,进行测试,只能单选。
    Path 请求的接口URL,以/开头,例如/reviews/2
    请求方法 该所属类的请求方法,如果包含多个请求方法,在列表中选择其中一种方法,只能单选。
    测试参数 在测试方法的参数区域,根据服务的代码设置方法的具体参数。
    结果区域查看测试是否成功,测试结果一般会有以下几种情况:
    • 结果成功,并显示调用服务的响应结果。
    • 结果失败,并显示调用服务的失败响应信息。请根据响应信息,排查服务的端口、网络及代码本身的问题。

金丝雀发布

金丝雀发布是将应用的旧版本A与新版本B同时部署在环境中,业务请求可能会被路由到版本A的后端上,也可能会被路由到版本B的后端上。您可以自定义发布策略,快速调整版本A和B的流量占比。
说明 金丝雀发布功能只适合在两个标签的场景下使用,若有多个标签的场景,请使用标签路由功能。
  1. 登录MSE治理中心控制台
  2. 在左侧导航栏选择微服务治理中心 > 应用列表
  3. 在应用列表页面单击目标应用操作列下的金丝雀
  4. 金丝雀页签下单击应用实例右侧的编辑
  5. 修改金丝雀路由面板应用实例区域设置各个版本的流量百分比。
  6. 修改金丝雀路由面板流量规则区域单击添加新的入口流量规则,配置流量规则相关参数,然后单击确定
    参数 描述
    框架类型 默认显示服务网格
    Path 输入HTTP相对服务路径。
    条件模式 包含同时满足下列条件满足下列任一条件,根据实际需求选择。
    条件列表

    设置条件参数,当有多个条件规则时,可通过单击添加新的规则条件添加。

    仅支持设置Header类型的参数。

    路由规则设置完成后,只有符合设置条件的请求才能访问应用,且会根据流量比例将请求转发给不同版本的应用。