首页 > 其他分享 >apisix~集成服务发现注册中心

apisix~集成服务发现注册中心

时间:2024-05-20 13:41:45浏览次数:30  
标签:集成 kind name token 注册 test Endpoints apisix

摘要

当业务量发生变化时,需要对上游服务进行扩缩容,或者因服务器硬件故障需要更换服务器。如果网关是通过配置来维护上游服务信息,在微服务架构模式下,其带来的维护成本可想而知。再者因不能及时更新这些信息,也会对业务带来一定的影响,还有人为误操作带来的影响也不可忽视,所以网关非常必要通过服务注册中心动态获取最新的服务实例信息。架构图如下所示:

  1. 服务启动时将自身的一些信息,比如服务名、IP、端口等信息上报到注册中心;各个服务与注册中心使用一定机制(例如心跳)通信,如果注册中心与服务长时间无法通信,就会注销该实例;当服务下线时,会删除注册中心的实例信息;
  2. 网关会准实时地从注册中心获取服务实例信息;
  3. 当用户通过网关请求服务时,网关从注册中心获取的实例列表中选择一个进行代理;

常见的注册中心:Eureka, Etcd, Consul, Nacos, Zookeeper 等

如何扩展注册中心?

基本步骤

APISIX 要扩展注册中心其实是件非常容易的事情,其基本步骤如下:

  1. 在 apisix/discovery/ 目录中添加注册中心客户端的实现;
  2. 实现用于初始化的 _M.init_worker() 函数以及用于获取服务实例节点列表的 _M.nodes(service_name) 函数;
  3. 将注册中心数据转换为 APISIX 格式的数据;

集成nacos

https://www.bookstack.cn/read/apisix-2.13-zh/275fbdd662ec08a9.md

discovery:
  nacos:
    host:
      - "http://192.168.xx.xx:8848"
    prefix: "/nacos/v1"
    fetch_interval: 1
    weight: 1
    timeout:
      connect: 2000
      send: 2000
      read: 5000

集成kubernetes

https://www.bookstack.cn/read/apisix-2.13-zh/a586728927b44a68.md
https://apisix.apache.org/zh/docs/apisix/next/discovery/kubernetes/

discovery:
  kubernetes:
    service:
      schema: https
      host: 192.168.60.146
      port: "6443"  #这里有一个比较坑的地方,port 必须是字符串,否则会导致 APISIX 启动报错:
    client:
      token: |-
        ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltWTNNRVpCUTJSa2FHSnNkMVpsYjIwMWNFODVTMVpLUjE5TFFVTlhZVEo0ZWs5UlpFMXJiakZtV0RRaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoY0dsemFYZ2lMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObFkzSmxkQzV1WVcxbElqb2laR1ZtWVhWc2RDMTBiMnRsYmkxa2F6WTJlaUlzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG01aGJXVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpYSjJhV05sTFdGalkyOTFiblF1ZFdsa0lqb2lOemxpTnpnd00yWXRPR1poWXkwMFlXRTVMVGsxWWpjdFlXSmhORFEwWVdNNE4yRXhJaXdpYzNWaUlqb2ljM2x6ZEdWdE9uTmxjblpwWTJWaFkyTnZkVzUwT21Gd2FYTnBlRHBrWldaaGRXeDBJbjAuT3hWUTh2d2w0ZnZaLThZbTk1anlNcTNxTFBPTDhjaGZxdlZKQy10WXhLb3J5X2Fma3dzcU5WZ1RONWZuYlhmLW53MlNHWmpJdV9MbnhhbGxiQmhGT0l6UkI3QTY5QkpsYkpfTTNTNHNXcjdhN1EzaF9xTUZsc0pQQ2VhSG1NV3doZUR2dnZfOHFoV2dfN3MtRGk4OHp6QWpva1dOMlZIM3FBRXU5dWpmeVRlUTJXRzZYTVJyWWM1Y0pwN2F2WjBrNUo0V05yMHdTRHpYRkFsQUtUOHV4NUJWSlg0VEl6eXdjZDdTdWtkR3FrbmVtUnc3Q0lDWmR0bnZxZ1lXWnJpRFdwaVBSYklDLUFISFgtY3RrREtBV19TdFhvNFRLSTcxTlRYTzdVd0wtMWV4eXM0VnBETEZ6TkdhVDBUOWVRM1llTktfRUxRQy0zZWJGOEItRjFDRU5n
    match:
     - default
     - ^my-[a-z]+$

获取serviceaccount账号的token的方法

apisix的k8s服务发现配置

1 为了让 APISIX 能查询和监听 Kubernetes 的 Endpoints 资源变动,我们需要创建一个 ServiceAccount:

kind: ServiceAccount
apiVersion: v1
metadata:
  name: apisix-test
  namespace: default

2 以及一个具有集群级查询和监听 Endpoints 资源权限的 ClusterRole:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: apisix-test
rules:
- apiGroups: [ "" ]
  resources: [ endpoints ]
  verbs: [ get,list,watch ]

3 再将这个 ServiceAccount 和 ClusterRole 关联起来:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: apisix-test
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: apisix-test
subjects:
  - kind: ServiceAccount
    name: apisix-test
    namespace: default

4 然后我们需要获取这个 ServiceAccount 的 token 值,如果 Kubernetes 是 v1.24 之前的版本,可以通过下面的方法获取 token 值:

$ kubectl get secrets | grep apisix-test
$ kubectl get secret apisix-test-token-89hcm -o jsonpath={.data.token} | base64 -d

5 Kubernetes 从 v1.24 版本开始,不能再通过 kubectl get secret 获取 token 了,需要手动建立secret来生成token:

# 集群执行这个yaml  
apiVersion: v1
kind: Secret
metadata:
  name: apisix-test-kubeapi
  namespace: default
  annotations:
    kubernetes.io/service-account.name: "apisix-test"
type: kubernetes.io/service-account-token
data:

# 然后执行
kubectl get secret apisix-test-kubeapi -n default -o jsonpath={".data.token"} | base64 -d 

6 我们在 APISIX 的配置文件 config.yaml 中添加如下内容( 将上面生成的 token 填写到 token 字段 ):

discovery:
  kubernetes:
    service:
      schema: https
      host: 127.0.0.1
      port: "6443"
    client:
      token: ...

上面服务发现,我选择kubernetes时,并没有成功,而我直接在节点节,使用<服务名>.<命令空间>,这种方式反而是支持的,配置如下

clusterrole相关操作

kubectl describe  serviceaccount  <sa-name>
kubectl describe clusterrole <clusterrole-name>
kubectl describe clusterrolebinding <clusterrolebinding-name>
kubectl get rolebindings,clusterrolebindings --all-namespaces | grep apisix-test  

添加上游服务

说明: service_name 必须满足格式:[namespace]/[name]:[portName]

  • namespace: Endpoints 所在的命名空间
  • name: Endpoints 的资源名
  • portName: Endpoints 定义包含的 ports.name 值,如果 Endpoints 没有定义 ports.name,请依次使用 targetPort, port 代替。设置了 ports.name 的情况下,不能使用后两者。
    返回值: 以如下 Endpoints 为例:
apiVersion: v1
kind: Endpoints
metadata:
  name: plat-dev
  namespace: default
subsets:
  - addresses:
      - ip: "10.5.10.109"
      - ip: "10.5.10.110"
    ports:
      - port: 3306
        name: port

这里有一个比较坑的地方,port 必须是字符串,否则会导致 APISIX 启动报错 invalid discovery kubernetes configuration: object matches none of the required

问题与解决

  • k8s token错误
2024/05/17 03:01:07 [error] 54#54: *114 [lua] informer_factory.lua:295: list failed, kind: Endpoints, reason: Unauthorized, message : {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Unauthorized","code":401}

检查token值

  • k8s serviceaccount账号无权限
2024/05/17 03:01:07 [error] 54#54: *114 [lua] informer_factory.lua:295: list failed, kind: Endpoints, reason: Forbidden, message : {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Forbidden","code":403}

检查serviceaccount绑定的clusterrole是否有endpoint权限

  • 上游服务未找到
2024/05/17 03:05:22 [error] 52#52: *623 [lua] init.lua:400: nodes(): get unexpected upstream service_name: cms.default.svc.cluster.local, client: 192.168.60.136, server: _, request: "GET /k8s/products HTTP/1.1", host: "test-apisix.pkulaw.com"

2024/05/17 03:05:22 [error] 52#52: *623 [lua] init.lua:545: handle_upstream(): failed to set upstream: no valid upstream node: nil, client: 192.168.60.136, server: _, request: "GET /k8s/products HTTP/1.1", host: "test-apisix.pkulaw.com"

因为apisix中获取到的是k8s服务的endpoints地址【由service指向的pod的真实地址】,这个地址对k8s集群外是不公开的,如图

大功告成!

参考:https://www.aneasystone.com/archives/2023/03/apisix-service-discovery.html

标签:集成,kind,name,token,注册,test,Endpoints,apisix
From: https://www.cnblogs.com/lori/p/18201706

相关文章

  • 医院信息集成平台说明书
    平台特点和优势ESB界面拖拽式服务编排模型,有效减少系统接口,提高可维护性;平台提供统一格式的接口文档,医院追加系统只需对接平台即可;平台基于中立、标准、开放的IT架构和数据标准,提供插拔式医院应用生态;平台提供创建自定义数据集,支持自定义数据集抽取,报表生成与下载;平台提供......
  • Windows注册表编辑器是用于管理和修改Windows操作系统注册表的工具。以下是一些常见的
    Windows注册表编辑器是用于管理和修改Windows操作系统注册表的工具。以下是一些常见的Windows注册表编辑器:regedit.exe:这是Windows内置的注册表编辑器,可以通过运行regedit命令或在开始菜单中搜索"注册表编辑器"来打开它。它提供了对注册表键值的查看、编辑和删除等功能。......
  • Django测试与持续集成:从入门到精通
    title:Django测试与持续集成:从入门到精通date:2024/5/1816:38:41updated:2024/5/1816:38:41categories:后端开发tags:Django测试CI/CD优化部署监控迭代第1章:Django测试基础1.1Django测试框架概述Django测试框架是Djangoweb框架的一部分,提供了一个强......
  • (FPGA) XCKU15P-1FFVE1517E XCKU15P-3FFVE1517E XCKU15P-2FFVE1517E IC适用于智能IP集
    Kintex™UltraScale+™器件在FinFET节点中提供高性价比,为需要高端功能(包括33Gb/s收发器和100G连接内核)的应用提供了经济高效的解决方案。该中端产品系列同时支持数据包处理和DSP密集型功能,是无线MIMO技术、Nx100G有线网络、以及数据中心网络和存储加速等应用的理想选......
  • FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
    ​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制订工作,参考软件的测试表明,AVS3基准档次的性能比上一代标准AVS2和HEVC提升了约30%。libuavs3d是AV......
  • SkyWalking 单机安装 + 集成springboot
    一、下载地址https://skywalking.apache.org/downloads/需下载安装包:SkyWalkingAPM(v9.6.0)(新版本BoosterUI已集成在SkyWalkingAPM中)apache-skywalking-apm-9.6.0.tarJavaAgent(v9.1.0)apache-skywalking-java-agent-9.1.0.tar二、安装2.1、安装SkyWalk......
  • GO实名认证接口开发示例、接口集成、身份认证
    翔云身份证实名认证接口,通过核验身份证二要素、三要素、三要素+现场人像的方式,实时联网核验身份信息的真伪。想象一下,无需耗费大量的人力物力,只需简单几步,即可将翔云身份证实名认证接口集成到您的应用中。无论是用户注册还是支付验证,都无需再让用户手动输入身份信息,线上......
  • vue3 ts 集成 tinymce
    首先引入@tinymce/tinymce-vueyarnadd@tinymce/tinymce-vue-S我的版本是然后写一个组件<template><mainid="sample"><Editorv-model="editorData"api-key="j7tvgx4xnptg3cjd63cfnl62z9s78uylw4o7vkkwdljjy91e":init=&qu......
  • “7”势如虹|突破集成边界,谷云科技成为iPaaS领头羊!
     七载春秋,步履不停 5月18日,谷云科技RestCloud迎来了七周年生日。可能在大家看来,这似乎是一个常规的企业周年庆,然而,简约却不简单,在公司快速发展的背后,却蕴藏着涌动的力量,如果用一句话来概括,那一定是:坚持的力量。 砥砺七载,谷云科技从iPaaS无人区启程,到对手环绕,再到如今成为......
  • 在Linux中,什么是持续集成/持续部署(CI/CD)?
    持续集成/持续部署(ContinuousIntegration/ContinuousDeployment,简称CI/CD)是一组软件开发实践,旨在通过自动化的流程来频繁地集成和部署代码变更,以提高软件交付的速度和质量。1.持续集成(CI)持续集成是指开发者频繁地将代码变更合并到主分支的实践。每次代码合并都伴随着自动化的......