Mesh2# 第三方注册中心集成istio

引言

公司往往有自己的注册中心,有的使用Nacos、zookeeper等,还有自研的。这些在istio体系外的注册中心需要融入网格体系,让注册中心以及配置中心事件通知到istio,进而通过istio下发到数据面去。

第三方注册中心集成到istio通常有三种做法:

  • 方式一  修改源码实现serviceregistry.Instance接口适配到service controller

  • 方式二  通过自定义MCP Server,例如:Nacos提供了这部分实现

  • 方式三  将第三方注册中心事件封装成istio的ServiceEntry和WorkloadEntry资源写入Kubernetes的api server

    istiod收到监听后完成转换

方式一需要修改istio源码,重度耦合后续升级istio比较困难;方式二看着比较简单却调试比较困难给开发造成障碍;方式三从业界实践来看采用的最为广泛。

本文将分析第三种方式如何集成istio的,在此之前需要先走查下kubernetes的大体架构。

一、k8s架构简述

架构与概念

9bc77909090f1cd849f0f1af9ca6d42a.png

kube-apiserver: 与Kubernetes资源交互的入口,可以通过kubectl或者client-go其他语言类库进行访问

kube-scheduler:   负责资源调度与计算,将Pod按照特定策略分发到计算节点

etcd: 键值存储数据库,保存Kubernetes集群相关数据

kube-controller-manager:  运行一系列列控制器的组件,比如:节点控制器、任务控制器、端点控制器等

kubelete: 运行在计算节点中,通过监听控制面接受指令,在节点内执行操作

kube-proxy: 运行在计算节点的网络代理,负责Pod内外的网络通信代理

Pods创建流程

  • 通过kubectl或者client-go类库向kube-apiserver发起创建请求

  • kube-apiserver将请求信息持久化在etcd数据库

  • kube-scheduler检测到请求后,计算Pod应该分配到哪个Node,并将分配策略写入etcd数据库

  • Kubelet检测到etcd的分配策略后,执行该策略调用docker相关api创建container

二、第三方注册中心集成

架构图

a07c3b9d9bb311b5d37ad5130e3804b0.png

转换流程:

从注册中心(Zookeeper)获取变更事件,将其转换为ServiceEntry写入kube-apiserver;Istiod(Pilot)通过监听kube-apiserver收到ServiceEntry后经过转换通过xDS下发给数据面。

代码说明

直接去写比较耗时,快速掌握的方式是参考别人已经实现的,下面以社区项目dubbo2istio跟踪其如何将zookeeper转换的。

https://github.com/aeraki-framework/dubbo2istio

另外,还用到了dubbo 示例中的dubbo-demo-api-provider,地址如下。

https://github.com/apache/dubbo/tree/3.0/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider

分析过程为:

  • 通过dubbo-demo-api-provider注册节点到zookeeper注册中心

  • 通过跟踪dubbo2istio代码观察其转换逻辑并通过client-go类库写入kube-apiserver

  • 通过相关命令验证其的确已经写入到kube-apiserver

转换分析

**@1 ** 运行服务提供者dubbo-demo-api-provider,让其在注册中心完成注册。

9fdbea08b097801826d4e0bfb023eed2.png

@2 运行dubbo2istio跟踪其逻辑

@3 获取zookeeper注册的节点将其转换为ServiceEntry,转换使用的类库为「istio.io/client-go」

e7354cde80219279e1b4c132048d57eb.png

@4 将转换好的注册信息写入kube-apiserver,写入成功无错误返回

bb498bce23a106bf351920beab910a13.png

@5 再通过代码查询是否写入成功,能够查到说明写入成功

4883d195c66164b1c6b3d6fdd5446d97.png

@6 通过命令行查询验证是否写入到kube-apiserver

登陆istiod容器

kubectl -n istio-system exec -it istiod-56f8cc6cb5-xkg4m -- /bin/bash

通过registryz命令查看

curl http://127.0.0.1:15014/debug/registryz
[
 {
        "Attributes": {
            "ServiceRegistry": "External",
            "Name": "org.apache.dubbo.demo.demoservice",
            "Namespace": "dubbo",
            "Labels": {
                "manager": "aeraki",
                "registry": "dubbo2istio"
            },
            "UID": "",
            "ExportTo": null,
            "LabelSelectors": null,
            "ClusterExternalAddresses": null,
            "ClusterExternalPorts": null
        },
        "ports": [
            {
                "name": "tcp-dubbo",
                "port": 20880,
                "protocol": "TCP"
            }
        ],
        "creationTime": "2021-09-10T09:58:18Z",
        "hostname": "org.apache.dubbo.demo.demoservice",
        "address": "0.0.0.0",
        "autoAllocatedAddress": "240.240.0.5",
        "Mutex": {},
        "Resolution": 0,
        "MeshExternal": false
    },
    // ....
]

备注:可以在istio中查到服务提供者「org.apache.dubbo.demo.demoservice」即从zookeeper注册中心成功将事件通过kube-apiserver通知到istio。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值