没有etcd的apache apisix
#mysql #etcd #kine #etcdadapter

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 (Kine is not etcd)

本质上,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设计的,因此它本质上不是通用解决方案。

- ETCD adapter

需要注意的两件事:

  • 在撰写本文的那一刻,适配器支持本地内存存储或mysql
  • 它可作为可嵌入库,但也可以作为独立组件

因此,我们可以将架构设计为以下内容:

Overall architecture

演示

让我们在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
  1. 最新版本的Apache Apisix,是的!
  2. 为了避免容器之间的依赖性失败,请重新启动直到工作。 Kubernetes的清单将涉及健康检查
  3. API7.AI仍然需要提供一个容器。我们需要从源代码
  4. 构建
  5. 用特定于上下文的一个
  6. 覆盖默认配置文件
  7. 常规MySQL图像对我不起作用。让我们从Bitnami
  8. 拿走一个
  9. 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
  1. 绑定任何IP,因为Docker将分配一个随机的IP
  2. 实现类型。默认值为btree;我们需要更改它。
  3. docker-compose.yml文件中配置

最后,此处的Apache Apisix配置:

deployment:
  admin:
    allow_admin:
      - 0.0.0.0/0
  etcd:
    host:
      - "http://etcd-adapter:12379"   #1
  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持续存在:

Adminer screenshot displaying the new route

不幸的是,我们需要在这一点上停下来。获取所有路线行不通:

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