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

news/2024/11/16 7:19:58/文章来源:https://www.cnblogs.com/lori/p/18201706

摘要

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

  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: 1weight: 1timeout:connect: 2000send: 2000read: 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: httpshost: 192.168.60.146port: "6443"  #这里有一个比较坑的地方,port 必须是字符串,否则会导致 APISIX 启动报错:client:token: |-ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltWTNNRVpCUTJSa2FHSnNkMVpsYjIwMWNFODVTMVpLUjE5TFFVTlhZVEo0ZWs5UlpFMXJiakZtV0RRaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoY0dsemFYZ2lMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObFkzSmxkQzV1WVcxbElqb2laR1ZtWVhWc2RDMTBiMnRsYmkxa2F6WTJlaUlzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG01aGJXVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpYSjJhV05sTFdGalkyOTFiblF1ZFdsa0lqb2lOemxpTnpnd00yWXRPR1poWXkwMFlXRTVMVGsxWWpjdFlXSmhORFEwWVdNNE4yRXhJaXdpYzNWaUlqb2ljM2x6ZEdWdE9uTmxjblpwWTJWaFkyTnZkVzUwT21Gd2FYTnBlRHBrWldaaGRXeDBJbjAuT3hWUTh2d2w0ZnZaLThZbTk1anlNcTNxTFBPTDhjaGZxdlZKQy10WXhLb3J5X2Fma3dzcU5WZ1RONWZuYlhmLW53MlNHWmpJdV9MbnhhbGxiQmhGT0l6UkI3QTY5QkpsYkpfTTNTNHNXcjdhN1EzaF9xTUZsc0pQQ2VhSG1NV3doZUR2dnZfOHFoV2dfN3MtRGk4OHp6QWpva1dOMlZIM3FBRXU5dWpmeVRlUTJXRzZYTVJyWWM1Y0pwN2F2WjBrNUo0V05yMHdTRHpYRkFsQUtUOHV4NUJWSlg0VEl6eXdjZDdTdWtkR3FrbmVtUnc3Q0lDWmR0bnZxZ1lXWnJpRFdwaVBSYklDLUFISFgtY3RrREtBV19TdFhvNFRLSTcxTlRYTzdVd0wtMWV4eXM0VnBETEZ6TkdhVDBUOWVRM1llTktfRUxRQy0zZWJGOEItRjFDRU5nmatch:- default- ^my-[a-z]+$

获取serviceaccount账号的token的方法

apisix的k8s服务发现配置

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

kind: ServiceAccount
apiVersion: v1
metadata:name: apisix-testnamespace: 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.iokind: ClusterRolename: apisix-test
subjects:- kind: ServiceAccountname: apisix-testnamespace: 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-kubeapinamespace: defaultannotations: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: httpshost: 127.0.0.1port: "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-devnamespace: default
subsets:- addresses:- ip: "10.5.10.109"- ip: "10.5.10.110"ports:- port: 3306name: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(1)semantic-kernel入门课程

(1)semantic-kernel入门课程 获取OpenAI在线API由于在国内的限制,我们并没有办法直接访问OpenAI,所以下面的教程我们会推荐使用https://api.token-ai.cn,然后您需要在这个网站中注册一个账号,并且创建一个令牌(最好是设置无限额度和无过期时间),创建好的令牌我们保存好…

偶然遇到的cubeide一些问题

昨天感觉cubeide有一些bug,具体表现为在外设的.c文件明明识别到了某个函数但是又打不开定义,于是在软件内更新了一下cubeide,结果更新完软件打不开了,没办法只能重装。重装完后新建工程的时候提示无法生成代码,因为缺少固件包,但打开固件界面又有固件包,如果无视提示强行…

OpenAI“杀疯了”,GPT–4o模型保姆级使用教程!一遍就会!

5月14日凌晨1点,OpenAI发布了名为GPT-4o 最新的大语言模型,再次引领了人工智能领域的又一创新浪潮,让整个行业都为之震动。 据OpenAI首席技术官穆里-穆拉提(Muri Murati)表示,GPT-4o是在继承GPT-4智能的基础上,对文本、视觉和音频功能进行了进一步改进,而且目前所有用户…

计量管理使用文档

计量管理使用文档添加计量要求​​添加计量台账选择计量要求 填写相关信息 会提前一个月发送消息给计量状态为正常的责任人。​​其他功能:暂停计量可以修改计量状态; 再计量可以添加一次计量记录; 台账历史记录,可以查看所有计量记录‍​​

T2T-ViT:更多的局部结构信息,更高效的主干网络 | ICCV 2021

论文提出了T2T-ViT模型,引入tokens-to-token(T2T)模块有效地融合图像的结构信息,同时借鉴CNN结果设计了deep-narrow的ViT主干网络,增强特征的丰富性。在ImageNet上从零训练时,T2T-ViT取得了优于ResNets的性能MobileNets性能相当 来源:晓飞的算法工程笔记 公众号论文: To…

使用Visual Studio将JSON格式数据自动转化为对应的类

一图流 直接将JSON复制下来,然后编辑-选择性贴上-贴上JSON作为类别。

Sqlite 介绍及应用

1.1.1.1 数据库介绍 软件采用SQLITE数据库作为核心管理软件,SQLite数据库以其高效、轻便的特性,在全球范围内得到了广泛的应用。SQLite数据库最大支持128TB,这种数据库支持标准的SQL语言,但与其他数据库管理系统相比,它不需要运行在客户端-服务器架构上,所有的数据都存储…

58同城的登录(RSA算法)

当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解 58同城的登录(RSA算法) 日期:2016-11-23 阿珏 教程 浏览:3631次 评论:8条58同城的登录(RSA算法)这一次。又是一个精彩的登录算法解析…

人工智能帮你一键生成完美架构图

简介 架构图通过图形化的表达方式,用于呈现系统、软件的结构、组件、关系和交互方式。一个明确的架构图可以更好地辅助业务分析、技术架构分析的工作。架构图的设计是一个有难度的任务,设计者必须要对业务、相关技术栈都非常清晰才能设计出来符合需求的架构图。实践演练有明确…

SVM

支持向量机相关知识点idea of SVM 分类问题的简化 首先我们考虑这样一个分类问题二分类 线性分类边界 100% 可分我们就能够考虑想出一个好的 idea,如下图所示在上述条件满足的情况下,哪一个分类边界最好? idea:最大化所有点到分类边界的最小距离,这个最小距离称为 margin。…

新浪微博动态 RSA 分析图文+登录

当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解 新浪微博动态 RSA 分析图文+登录 日期:2016-10-12 阿珏 教程 浏览:3583次 评论:5条新浪微博动态 RSA 分析一、用到的工具1.ie 浏览器(9 …

那些曾经逝去的记忆

当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解 那些曾经逝去的记忆 日期:2016-10-23 阿珏 谈天说地 浏览:1458次 评论:2条有的时候真的想,永远的都不要长大,永远都停留在童年时期。但…