文档首页 > > 最佳实践> 面向Dubbo协议的服务治理>

步骤4 将服务加入网格

步骤4 将服务加入网格

分享
更新时间:2021/02/03 GMT+08:00

操作步骤

  1. 为namespace添加label。

    1. 登录步骤3 服务部署中的节点。
    2. 编辑dubbo-app的namespace,添加istio-injection: enabled标签。

      kubectl label ns dubbo-app istio-injection=enabled

    1. 查看已添加的标签。

      kubectl get ns dubbo-app -oyaml

      命令行终端显示如下信息,黑体内容即为已添加的标签。

      apiVersion: v1
      kind: Namespace
      metadata:
        labels:
          istio-injection: enabled 
      name: dubbo-app

  2. 为deployment添加annotation。

    1. 分别编辑dubboconsumer的deployment和dubboprovider-v1的deployment,在spec.template.metadata中添加sidecar.istio.io/inject: "true"的annotation。

      kubectl edit deploy deploy-consumer -n dubbo-app

      kubectl edit deploy deploy-provider-v1 -n dubbo-app

      在文件中添加如下黑体内容:
      ...
      spec:
        template:
          metadata:
            annotations:
              sidecar.istio.io/inject: "true"
      ...
    2. 保存文件,系统会自动重启Pod,注入sidecar容器。

      kubectl get po -ndubbo-app -owide

      命令行终端显示如下信息:

      NAME                                 READY      STATUS
      dubboconsumer-ffbffbcdb-x6rx2         2/2       Running
      dubboprovider-v1-6fbcfbfd95-njxhw     2/2       Running

  3. 创建相关CRD资源,即为dubboprovider创建使用istio需要的crd资源。

    1. 在服务所在的命名空间创建Destinationrule。

      假设,待创建Destinationrule的描述文件为destinationrule.yaml,请执行如下命令:

      kubectl create -f destinationrule.yaml

      其中,destinationrule.yaml内容如下,请根据实际环境设置示例中黑体内容。
      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: dubboprovider-destination
        namespace: dubbo-app
      spec:
        host: dubboprovider
        subsets:
        - name: v1    //dubboprovider的version版本
          labels:
            version: v1
        trafficPolicy:
          outlierDetection:
            interval: 10m
    2. 在服务所在的命名空间创建VirtualService。

      假设,待创建VirtualService的描述文件为virtualservice.yaml,请执行如下命令:

      kubectl create -f virtualservice.yaml

      其中,virtualservice.yaml内容如下,请根据实际环境设置示例中黑体内容。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: dubboprovider-route
        namespace: dubbo-app
      spec:
        hosts:
        - dubboprovider
        tcp:       //使用tcp段
        - route:
          - destination:       
             host: dubboprovider  //service名称
             port:          
               number: 20880    //service访问端口
             subset: v1         //负载版本号
    3. 在istio-system的命名空间下创建用于内部访问的EnvoyFilter。

      用于内部访问的envoyfilter需要配置spec.configPatches.match.listener.name的值,这个值由serviceIP和servicePort决定。

      假设,待创建EnvoyFilter的描述文件为envoyfilter.yaml,请执行如下命令:

      kubectl create -f envoyfilter.yaml

      其中,envoyfilter.yaml内容如下,请根据实际环境设置示例中黑体内容。

      apiVersion: networking.istio.io/v1alpha3
      kind: EnvoyFilter
      metadata:
        name: dubboprovider-dubbo-app
        namespace: istio-system
      spec:
        configPatches:
        - applyTo: NETWORK_FILTER
          match:
            context: SIDECAR_OUTBOUND     //用于配置dubbo协议的内部访问  
            listener:
              filter_chain:
                filter:
                  name: envoy.tcp_proxy
              name: {$serviceIP}_{$servicePort}    //name的值为serviceIP_servicePort,指定作用的服务及其端口
              port_number: $servicePort     //dubboprovider的service的访问端口
          patch:
            operation: REMOVE
        - applyTo: NETWORK_FILTER
          match:
            context: SIDECAR_OUTBOUND
            listener:
              filter_chain:
                filter:
                  name: mixer
              name: {$serviceIP}_{$servicePort}   
              port_number: $servicePort        
          patch:
            operation: INSERT_AFTER
            value:
              config:
                dubbo_filters:
                - name: envoy.filters.dubbo.router
                protocol_type: Dubbo
                route_config:
                - interface: .*       //使用.*代表所有接口   
                  name: local_route
                  routes:
                  - match:
                      method:
                        name:
                          regex: .*
                    route:
                      cluster: $cluster                   //用于指定路由的负载
                serialization_type: Hessian2
                stat_prefix: dubbo_incomming_stats
              name: envoy.filters.network.dubbo_proxy
      表1 EnvoyFilter参数说明

      参数

      参数说明

      serviceIP

      服务的ClusterIP,可用“kubectl get svc”命令查询。

      servicePort

      服务的访问端口,可用“kubectl get svc”命令查询。

      version

      流量路由的负载版本,与负载的version标签值一致。

      serviceName

      服务的名称。

      serviceNamespace

      服务所在的命名空间。

      cluster

      用于指定路由的负载,其命名方式为:outbound|{$servicePort}|{$version}|{$serviceName}.{$serviceNamespace}.svc.cluster.local。

      示例:outbound|20880|v1|dubboprovider.dubbo-app.svc.cluster.local。

  4. 验证服务访问。

    1. 获取dubboconsumer的service对应的clusterIP。

      kubectl get svc -n dubbo-app

    1. 验证服务访问。

      curl http://10.247.204.174:8081/consumer/hello?name=istio

      显示如下信息表明访问有效,其中172.16.0.33为dubboprovider对应的一个实例的podIP。

      sayHello istio, response fromprovider(@V1):172.16.0.33:20880, svc:sayHello

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区论坛频道来与我们联系探讨

智能客服提问云社区提问