apisix 数据备份

今天我来讲讲如何备份 apisix 的数据,主要是路由、服务、上游等数据。本文中的 apisix 版本为 apisix 3.1.0 版本。 接下来由我来介绍几种备份方法。 dashboard 导出备份 介绍的第一种方法是使用 apisix dashboard 进行数据导出,但这种方法有许多缺陷,只能导出 route 数据,其他服务、ssl 数据都不能导出,而且新版本 (3.0+)dashboard 导出的路由不包含上游服务的数据,不方便进行快速的路由迁移复制 (我猜测可能是害怕上游服务信息不一致导致路由错误)。 接下来就来介绍如何进行导入导出。 1 我们打开 dashboard 2 选择要导出的路由,点击 export openapi 3 在新的 apisix dashboard 导入刚刚导出的 openapi 文件并填写相应的信息,导入成功后就可以看到导入的路由信息,相应路由的服务需要补充填写。 根据 admin api 编写相应的脚本 apisix 提供了各种 route、service 的 admin api 数据接口,我们可以根据官方提供的接口编写相应的脚本。 使用 etcd 备份方案 由于 apisix 默认采用 etcd 进行数据存储,我们可以备份 etcd 数据,到新的 apisix 集群导入备份的数据。 由于我对 etcd 的运维不太熟悉,想要了解 etcd 备份快照,可以查看这条链接。 ...

三月 18, 2023 · 1 分钟 · overstarry

apisix 如何添加自定义插件

最近在研究 apisix 插件,想要研究插件的执行流程,为了了解插件的具体运行流程,查看了几种方法来调试:1. inspect plugin 2. 自定义插件调试 等等。 本文介绍了添加启用自定义插件。 简单修改插件 最近在研究 apisix 的 proxy-cache 插件,本文就以 proxy-cache 插件为例子来讲解 docker 环境下如何自定义插件。 我们先从 apisix 官方 git 库拷贝 proxy-cache 插件代码到本地文件夹。我们对插件的内容进行修改删除,并将插件名称修改为 proxy-cache2, 修改后的插件文件列表如下: 删除了内存缓存的相关内容,只保留了磁盘缓存的内容,并添加了一些日志记录好了解整个插件的整体流程。 apisix 添加自定义插件 接下来需要给 apisix 添加我们修改的 proxy-cache2 插件,通过查看容器的目录,我们需要将插件挂载到 /usr/local/apisix/apisix/plugins 目录下,我们修改 docker-compose 文件: version: "3" services: apisix: image: apache/apisix:${APISIX_IMAGE_TAG:-3.2.0-debian} restart: always volumes: - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro - ./apisix/plugins/proxy-cache2:/usr/local/apisix/apisix/plugins/proxy-cache2 - ./apisix_log://usr/local/apisix/logs depends_on: - etcd ##network_mode: host ports: - "9180:9180/tcp" - "9080:9080/tcp" - "9091:9091/tcp" - "9443:9443/tcp" - "9092:9092/tcp" networks: apisix: 我们添加 ./apisix/plugins/proxy-cache2:/usr/local/apisix/apisix/plugins/proxy-cache2 将本地的插件目录挂载进行容器中,重启 apisix。 ...

三月 12, 2023 · 2 分钟 · overstarry

apisix 根据请求 host 访问不同路径

前言 最近有一个需求,需要配置一个路由,这个路由是子域名形式的,域名类似 xx.apps.overstarry.vip,我们需要根据子域名中的 xx 内容来请求同一个对象存储中不同的文件。 这个需求之前处理过,那时采用了 nginx 来处理主要路径的逻辑,apisix 直接请求 nginx 服务,也就是大概这样的一种结构:apisix -> nginx -> oss。这次同样的需求,我决定采用 2 层结构,去除中间的 nginx 层,由 apisix 直接访问 oss 服务。 接下来我就来讲述处理的过程。 过程 使用 proxy-rewrite 处理这个需求,我第一反应是使用 proxy-rewrite 插件来处理,我使用 regex_uri 字段来进行正则替换匹配,添加的插件内容如下: "proxy-rewrite": { "regex_uri": [ "^(.*).apps0.overstarry.vip(.*)$", "/$1/production$2" ] } 配置完后,请求了几次,发现没有请求成功,通过查看日志发现请求到了奇怪的地址。又仔细的研究了一会,发现是我理解错误了,proxy_rewrite 是根据 uri 进行正则匹配的,没有根据 host 匹配的选项,前面填写的那些是根本不会匹配成功的。 serverless proxy-rewrite 插件不能实现我们的需求,我又查看了 issue 列表,发现了一个 issue(#7739),里面提到了可以使用插件 serverless 来实现我们的需求。 serverless 介绍 APISIX 有两个 serverless 插件:serverless-pre-function 和 serverless-post-function。 serverless-pre-function 插件会在指定阶段开始时运行,serverless-post-function 插件会在指定阶段结束时运行。这两个插件使用相同的属性。 实现 我们的需求应该是采用 serverless-pre-function 来实现,具体过程描述如下:获得请求的 host, 对 host 进行相应的文本正则替换,将替换的文本和 uri 进行组合拼接,得到真正的 uri. ...

三月 4, 2023 · 1 分钟 · overstarry

使用 acme 自动更新 APISIX ssl 证书

前言 最近在给 APISIX 配置自动更新 SSL 证书的时候,发现了一些问题,本文记录以下发现问题的过程和解决方案。 步骤 我们先来看下原始的配置方法吧: 1 安装相应脚本 $ curl --output /root/.acme.sh/renew-hook-update-APISIX.sh --silent https://gist.githubusercontent.com/anjia0532/9ebf8011322f43e3f5037bc2af3aeaa6/raw/65b359a4eed0ae990f9188c2afa22bacd8471652/renew-hook-update-APISIX.sh $ chmod +x /root/.acme.sh/renew-hook-update-APISIX.sh $ /root/.acme.sh/renew-hook-update-APISIX.sh Usage : /root/.acme.sh/renew-hook-update-APISIX.sh -h <APISIX admin host> -p <certificate pem file> -k <certificate private key file> -a <admin api key> -t <print debug info switch off/on,default off> 2 安装 acme.sh curl https://get.acme.sh | sh -s [email protected] 3 申请证书,并添加 renew-hook 这里我采用的是 dns api 的方式申请证书的 ~/.acme.sh/acme.sh --issue --dns dns_ali -d *.xx.com --renew-hook '~/.acme.sh/renew-hook-update-APISIX.sh -h http://127.0.0.1:9280 -p ~/.acme.sh/"*.xx.com_ecc"/"fullchain.cer" -k ~/.acme.sh/"*.xx.com_ecc"/"*.xx.com.key" -a {admin-key}' --log --debug 这里的 http://127.0.0.1:9280 是你的 APISIX 的 admin 接口地址,admin-key 是你的 key。 ...

二月 25, 2023 · 5 分钟 · overstarry

Containerd 本地调试环境搭建

最近在学习常用的容器运行时 containerd, 本篇我就来介绍如何本地构建 containerd 进行调试开发,主要介绍 2 种 常规方式和使用容器构建,由于本地环境限制,我主要是使用 docker 搭建本地调试环境。 非容器 build 这里先开始介绍常规直接从源码本地构建的方式。 构建环境要求 1 go1.19.x 及以上版本 2 Protoc 3.x+ 3 适用于您的发行版的 Btrfs 标头和库。请注意,可以通过构建标签禁用构建 btrfs 驱动程序 no_btrfs,从而删除此依赖项。 前面 2 点相信大家都很清楚,第三点的 Btrfs 是什么呢?Btrfs 是一种现代的 Linux 写时复制(COW)文件系统,旨在实现先进的功能,同时也注重容错、修复和简易管理。 build 1 拉取 containerd 源代码至本地 2 构建 进入源代码根目录,执行一下命令: cd containerd make 执行后,会在 ./bin/ 目录下生成所有项目的二进制文件。 如果你需要修改 gRPC API ,修改后需要使用 protoc 编译生成新的代码:make generate docker 容器构建 接下来讲解怎么通过 docker 构建本地 containerd 调试环境。 构建要求 1 go1.19.x 及以上版本 2 Protoc 3.x+ ...

二月 19, 2023 · 1 分钟 · overstarry

containerd 安装和客户端简单使用

介绍 containerd 是一个用于管理容器生命周期的开源容器守护程序,是 Docker 引擎中的核心组件之一。它负责容器的创建、启动、停止、销毁等操作,并提供了对容器的基本管理功能,如镜像管理、网络管理、存储管理等。与 Docker 引擎相比,containerd 更加轻量级,同时也支持多种容器运行时,如 runc、gVisor、Kata Containers 等。由于其简单、可扩展和可移植等优点,containerd 也成为了许多容器平台和工具的基础组件之一。 安装 本文只介绍 Linux 系统下的安装方式。Linux 下的 deb 和 rpm 包 containerd.io 由 docker 官方进行分发,通过查阅官方文档,具体的安装步骤如下: 1 更新 apt 软件包索引并安装必要的软件包,以便 apt 能够使用 HTTPS 仓库。 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release 2 添加 Docker’s 官方 GPG key: sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 3 设置存储库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update 4 安装 ...

二月 11, 2023 · 2 分钟 · overstarry

Helm 介绍及使用

今天我来简单介绍 kubernetes 生态中一个重要一环 - 包管理工具 Helm。 介绍 Helm 是 Kubernetes 的开源包管理器。它提供了提供、共享和使用为 Kubernetes 构建的软件的能力。 Helm 于 2015 年在 Deis 创建,后来被微软收购。现在称为 Helm Classic 的是在当年 11 月的首届 KubeCon 上推出的。2016 年 1 月,Helm Classic 与谷歌的 Kubernetes 部署管理器合并到现在是 Helm 主要项目的存储库中。 该项目目前拥有超过 30,000 个 GitHub stars,每月从全球获得超过 200 万次下载。2020 年 4 月,Helm 在 CNCF 中获得毕业。 安装 Helm 二进制安装 1 打开 https://github.com/helm/helm/releases , 下载你需要的版本 2 解压安装包 3 将文件夹中的 helm 二进制文件移动到相应的位置 脚本安装 helm 官方提供了一个安装的脚本: $ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 $ chmod 700 get_helm.sh $ ./get_helm.sh 除了以上 2 种安装方式,你还可以通过各个操作系统的包管理工具安装和编译源码安装,这里就不过多赘述了。 ...

二月 4, 2023 · 2 分钟 · overstarry

Ubuntu20.04 设置 DNS

最近一台 Ubuntu 出现了网络问题,ping baidu.com 出现了 temporary failure in name resolution 报错,根据我的经验这是服务器的 DNS 出现了问题,特此在本文记录一下如何设置 DNS 的过程。 修改 netplan 配置文件 我先尝试修改 netplan 的配置文件,编辑相应的配置文件,我这里的路径是 /etc/netplan/00-installer-config.yaml, 修改后的内容如下: network: ethernets: ens160: addresses: - 192.168.1.51/24 gateway4: 192.168.1.1 nameservers: addresses: - 114.114.114.114 search: [] version: 2 修改后执行 netplan apply, 重新 ping 后发现没有效果,未能解决问题。 修改 /etc/resolv.conf 我们还可以通过修改 /etc/resolv.conf 文件来设置 dns, 虽然通过修改此文件可以解决我们的问题,但编辑 /etc/resolv.conf 文件时,发现了一行注释 This file is managed by man:systemd-resolved(8). Do not edit. 可以得知这个文件是由 man:systemd-resolved(8) 管理,/etc/resolv.conf 是一个动态生成的文件,下次重启服务器时此文件还会恢复到默认的内容,所以此方案只适合临时解决,不能一次性解决问题。 接下来我来介绍如何永久的修改 /etc/resolv.conf 修改 /etc/systemd/resolved.conf 文件 # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Entries in this file show the compile time defaults. # You can change settings by editing this file. # Defaults can be restored by simply deleting this file. # # See resolved.conf(5) for details [Resolve] DNS=114.114.114.114 8.8.8.8 #FallbackDNS= #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no #Cache=no-negative #DNSStubListener=yes #ReadEtcHosts=yes ~ ~ ~ ~ ~ ~ ~ 添加要修改的 dns 信息。 ...

一月 7, 2023 · 1 分钟 · overstarry

Postgresql 的 json 类型

最近工作需要使用 sql 语句进行 Postgresql json 类型字段的查询,本文特此记录下一些常用的函数。 Postgresql json 类型简介 postgresql 支持两种 json 数据类型:json 和 jsonb,而两者唯一的区别在于效率,json 是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而 jsonb 是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json 类型存储快,使用慢,jsonb 类型存储稍慢,使用较快。 json 类型操作符 我们先介绍 json 和 jsonb 的一些常用通用操作符: 操作符 右操作数类型 描述 示例 结果 -> int 获取 JSON 数组元素(索引从 0 开始) select ‘[{“a”:“foo”},{“b”:“bar”},{“c”:“baz”}]’::json->2; {“c”:“baz”} -> text 通过键获取值 select ‘{“a”: {“b”:“foo”}}’::json->‘a’; {“b”:“foo”} -» int 获取 JSON 数组元素为 text select ‘[1,2,3]’::json-»2; 3 -» text 通过键获取值为 text select ‘{“a”:1,“b”:2}’::json-»‘b’; 2 jsonb 独有的操作符 操作符 右操作数类型 描述 示例 结果 @> jsonb 左侧 json 最上层的值是否包含右边 json 对象 select ‘{“a”:{“b”:2}}’::jsonb @> ‘{“b”:2}’::jsonb; select ‘{“a”:1, “b”:2}’::jsonb @> ‘{“b”:2}’::jsonb; f t <@ jsonb 左侧 json 对象是否包含于右侧 json 最上层的值内 select ‘{“b”:2}’::jsonb <@ ‘{“a”:1, “b”:2}’::jsonb; t ? text text 是否作为左侧 Json 对象最上层的键 select ‘{“a”:1, “b”:2}’::jsonb ? ‘b’; t ?| text[] text[]中的任一元素是否作为左侧 Json 对象最上层的键 select ‘{“a”:1, “b”:2, “c”:3}’::jsonb ?| array[‘b’, ‘c’]; t ?& text[] text[]中的所有元素是否作为左侧 Json 对象最上层的键 select ‘[“a”, “b”]’::jsonb ?& array[‘a’, ‘b’]; t || jsonb 连接两个 json 对象,组成一个新的 json 对象 select ‘[“a”, “b”]’::jsonb || ‘[“c”, “d”]’::jsonb; [“a”, “b”, “c”, “d”] - text 删除左侧 json 对象中键为 text 的键值对 select ‘{“a”: “b”}’::jsonb - ‘a’; {} - integer 删除数组指定索引处的元素,如果索引值为负数,则从右边计算索引值。如果最上层容器内不是数组,则抛出错误。 select ‘[“a”, “b”]’::jsonb - 1; [“a”] 创建 json 类型 那我们该如何创建 json 类型呢,下面介绍一些常见的函数 ...

十二月 24, 2022 · 2 分钟 · overstarry

使用 APISIX 代理 PostgreSQL 数据库

本文我来讲解如何使用 APISIX 来代理 PostgreSQL 数据库服务。 初试 最开始我以为很简单,我采用了直接在 APISIX DashBoard 上配置了一条路由,配置好后,连接发现无法成功连接,提示连接失败。 经过仔细的思考,发现 PostgreSQL 是使用 TCP 协议的数据库,不能通过简单的 route 进行配置,必须使用 stream-proxy 进行代理,接下来我们来看看怎么样来进行配置。 stream-proxy TCP 是许多流行应用程序和服务的协议,例如 LDAP、MySQL 和 RTMP。UDP(用户数据报协议)是许多流行的非事务性应用程序的协议,例如 DNS、系统日志和 RADIUS。 APISIX 可以动态负载平衡 TCP/UDP 代理。在 Nginx 的世界里,我们把 TCP/UDP proxy 称为 stream proxy,APISIX 就遵循了这个说法。 启用 stream-proxy 要开启 APISIX 流代理需要在 APISIX 配置中开启,APISIX 默认是关闭的。 apisix: stream_proxy: # TCP/UDP proxy tcp: # TCP proxy address list - 9100 - "127.0.0.1:9101" udp: # UDP proxy address list - 9200 - "127.0.0.1:9211" 如果 apisix.enable_admin 为 true,则 HTTP 和流代理都启用了上述配置。 ...

十二月 17, 2022 · 2 分钟 · overstarry