etcd是Kubernetes内部使用并由CNCF管理的出色键值分布数据库。这是一个不错的选择,这就是Apache Apisix也使用它的原因。但是,这并不是没有问题。
首先,有些人提到可伸缩性,但是人们可以从重视一致性的分布式数据存储中期望这一点。另一个问题可能是需要更熟悉ETCD。它是相对较新的,因此您的OPS团队可能需要正确操作MySQL或Postgres时正确操作它。最后,只有少数ETCD用户知道它缺乏维护者:
在过去的几个月中,主要维护者G.L.(亚马逊,公告)和S.B. (红帽)已停止积极参与该项目。这使该项目只有一个活跃的和两个偶尔进行评审的维护者M.S. (Google),P.T。 (Google),这两个项目都相对较新(1个月和1年的任期)和S.P.Z。 (IBM)。在过去的六个月中,其他维护者要么处于休眠状态,要么具有很小的活性。 该项目有效地未被确定 (重点是我的)。
- Google Groups of Kubernetes Steering Committee, March 2022
出于所有这些原因,您可能更喜欢使用Apache Apisix的标准SQL数据库。在这篇文章中,我将展示如何使用mysql。
Kine项目
,如果每个产品都必须为ETCD和其他数据库引入抽象层和不同的适配器,那将是很多努力。 Kine是一个旨在在ETCD调用和其他实现之间提供翻译步骤的项目:
kine是一个将ETCD API转换为:
的ETCDSHIM
- sqlite
- Postgres
- mysql
- natts jetstream
特征
- 可以独立运行,因此任何K8(不仅是K3)都可以使用Kine
- 实现了etcdapi的子集(完全不可用于通用目的等)
- 将ETCDTX调用转换为所需的API(创建,更新,删除)
本质上,Kine是一个GO库,将ETCD调用转换为所需数据存储(在已实施的数据存储中)。
但是,直接使用Kine是一种非平凡的努力。幸运的是,将Apache Apisix授予Apache Software Foundation的api7提供了已经专注于Apisix用法的组件。
ETCD适配器
etcd适配器将kine包裹为特定于apisix:
etcd适配器模拟了ETCD V3 API的最佳努力。它将Kine作为服务器端实现,并开发出完全内存的可观察后端。
并非支持ETCD V3 API中的所有功能,它是为Apache Apisix设计的,因此它本质上不是通用解决方案。
需要注意的两件事:
- 在撰写本文的那一刻,适配器支持本地内存存储或mysql
- 它可作为可嵌入库,但也可以作为独立组件
因此,我们可以将架构设计为以下内容:
演示
让我们在MySQL上使用其他管理UI实现上述体系结构。我将使用Docker组成:
version: "3"
services:
apisix:
image: apache/apisix:3.4.0-debian #1
volumes:
- ./config.yaml:/usr/local/apisix/conf/config.yaml:ro
ports:
- "9080:9080"
- "9180:9180"
depends_on:
- etcd-adapter
restart: always #2
etcd-adapter:
build: ./etcd-adapter #3
volumes:
- ./adapter.yml:/etcd-adapter/conf/config.yaml:ro #4
depends_on:
- mysql
restart: always #2
mysql:
image: bitnami/mysql:8.0 #5
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: etcd
MYSQL_PASSWORD: etcd
MYSQL_DATABASE: apisix
adminer:
image: adminer:standalone #6
ports:
- "8080:8080"
environment:
ADMINER_DEFAULT_SERVER: mysql
depends_on:
- mysql
- 最新版本的Apache Apisix,是的!
- 为了避免容器之间的依赖性失败,请重新启动直到工作。 Kubernetes的清单将涉及健康检查
- API7.AI仍然需要提供一个容器。我们需要从源代码 构建
- 用特定于上下文的一个 覆盖默认配置文件
- 常规MySQL图像对我不起作用。让我们从Bitnami 拿走一个
- Adminer,以前称为PHP Myadmin,将有助于可视化数据库状态
etcd-audapter的配置看起来像:
server:
host: 0.0.0.0 #1
port: 12379
log:
level: info
datasource:
type: mysql #2
mysql:
host: mysql #3
port: 3306 #3
username: etcd #3
password: etcd #3
database: apisix
- 绑定任何IP,因为Docker将分配一个随机的IP
- 实现类型。默认值为
btree
;我们需要更改它。 - 在
docker-compose.yml
文件中配置
最后,此处的Apache Apisix配置:
deployment:
admin:
allow_admin:
- 0.0.0.0/0
etcd:
host:
- "http://etcd-adapter:12379" #1
- 使用此ETCD实例,这是适配器
测试
现在已经设置了让我们通过创建路由来测试系统:
curl -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{
"methods": ["GET"],
"uris": ["/get"],
"upstream": {
"nodes": {
"httpbin.org:80": 1
}
}
}' http://localhost:9180/apisix/admin/routes/1
我们现在可以得到它:
curl -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' http://localhost:9180/apisix/admin/routes/1
我们还可以通过管理员接口检查它已通过mySQL持续存在:
不幸的是,我们需要在这一点上停下来。获取所有路线行不通:
curl -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' http://localhost:9180/apisix/admin/routes
{"header":{"revision":"1689689596"},"message":"Key not found"}
更糟糕的是,使用路线失败:
curl localhost:9080/get
{"error_msg":"404 Route Not Found"}
结论
etcdd是Kubernetes使用的基础架构的绝佳部分,但是在某些情况下可能会有更好的选择。更糟糕的是,由于缺乏维护,它可能会成为未来的安全威胁 - 或者已经是一个安全威胁。能够离开ETCD是一个可观的好处。
Kine提供了与ETCD兼容的外墙和多个实现。将Kine与Apache Apisix一起使用需要一些适应性的工作,已经在ETCD-ADAPTER中完成。
当前,etcd-apapter并不是完整的(至少可以说),并且需要更多的爱。这就是为什么还没有捐赠给Apache基金会的原因。如果您是Go开发人员并且对该项目感兴趣,请随时订阅Apache APISIX mailing list and/or join our Slack提供帮助。
可以在github上找到此帖子的完整源代码:
走得更远:
最初于7月23日在A Java Geek出版 rd ,2023