在k8s中部署APISIX
2024-02-26 15:13:18

Apache APISIX 目前支持多种方式来安装部署,本文主要介绍在 kubernetes 环境中部署 Apach APISIX 以及 Apache APISIX-Dashboard。

简介

Apache APISIX 是一个动态、实时、高性能的开源 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

Kubernetes 是用于自动部署、扩展和管理 “容器化应用程序” 的开源系统。它旨在提供 “跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。

环境准备

  • 一个 k8s 集群
  • 良好的网络环境

推荐使用 kind 来在本地搭建 k8s 集群环境,非常方便。根据官方文档安装好 kind 之后,一条指令即可搭建好一套 k8s 环境。

1
kind create cluster

通过 Helm 安装 Apache APISIX

Helm 用于管理 Kubernetes 中的应用程序,类似于 apt、yum、pacman 这些 Linux 中的包管理器,Helm 也称为 Kubernetes 中的包管理器。

目前 Apache APISIX 已经提供了 Helm chart 仓库,可以通过 Helm 来部署和卸载 Apache APISIX。

首先需要添加 Apache APISIX Helm chart 地址,然后更新仓库

1
2
helm repo add apisix https://charts.apiseven.com
helm repo update

安装 Apache APISIX,这里只是做演示用,因此就没有单独创建 namesapce。

1
helm install apisix apisix/apisix

如果上述指令执行成功,应该可以看到如下返回信息

1
2
3
4
5
6
7
8
9
10
11
12
▶ helm install apisix apisix/apisix
NAME: apisix
LAST DEPLOYED: Sun Dec 5 14:43:19 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT

通过上述方式部署的 Apache APISIX,admin API 暴露在集群中的 9180 端口,gateway 暴露在 80 端口。如果要访问 admin API,可以使用 kubectl port-forward 将端口转发到本地主机上的端口。

这里我转发到了本机的 9080 端口,主要是和 Apache APISIX 官方文档同步,方便验证。

1
kubectl port-forward service/apisix-admin 9080:9180

参考 Apache APISIX 快速入门指南,添加 upstream,绑定 route 与 upstream。

要测试刚才创建的路由,由于我本地使用 kind 来搭建的 k8s 集群,apisix-gateway 的 NodePort 访问不了,所以还需要额外的一步,将集群中的 80 端口转发到本机 8080 端口。

1
kubectl port-forward service/apisix-gateway 8080:80

然后进行验证

1
curl -X GET "http://127.0.0.1:8080/get?foo1=bar1&foo2=bar2" -H "Host: httpbin.org"

期望的返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"args": {
"foo1": "bar1",
"foo2": "bar2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=1-61ac63b5-348d3c5567db393462cd0666",
"X-Forwarded-Host": "httpbin.org"
},
"origin": "127.0.0.1, 192.46.208.201",
"url": "http://httpbin.org/get?foo1=bar1&foo2=bar2"
}

部署 Apache APISIX-Dashboard

与部署 Apache APISIX 一样,通过 Helm 安装 Apache APISIX-Dashboard 也只需要一条指令

1
helm install apisix-dashboard apisix/apisix-dashboard

转发 dashboard 端口到本机

1
kubectl port-forward service/apisix-dashboard 8080:80

访问本地 localhost:8080 就可以看到登录页面了。

PS: 这里部署出来的 Apache APISIX-Dashboard 的系统信息中看不到 APISIX 的节点信息是正常的,因为通过 Helm 安装默认没有启用 system-info 插件,如有需要,可以在 apisix 的configmap 中自行添加。

通过 yaml 文件部署 Apache APISIX

相比于通过 Helm 部署,使用 yaml 来部署,可以更加方便的自定义配置。

在执行下面的步骤之前,最好先把前面使用 Helm 创建的资源清理干净。(主要是 ETCD 的 PVC 存储)

手动执行 yaml 文件,一共分为了三步;第一步是部署 etcd 集群,第二步是部署 Apache APISIX,第三步是部署 Apache APISIX-Dashboard。

这三步中所需要的 yaml 文件,我已经上传 GitHub的 apisix-on-kubernetes 仓库 中。

部署

克隆apisix-on-kubernetes 仓库

1
git clone https://github.com/zaunist/apisix-on-kubernetes.git

然后执行以下指令

1
2
3
kubectl apply -f etcd.yaml
kubectl apply -f apisix.yaml
kubectl apply -f apisix-dashboard.yaml

等待 pod 全部启动,转发 apisix-dashboard 端口到本机

1
kubectl port-forward service/apisix-dashboard 8080:80

访问 localhost:8080 ,默认账号密码为 adminadmin 。因为这里我默认开启了 system info 插件,因此可以点击系统信息,查看 Apache APISIX 的节点状态。

在安装过程中,可能会遇到一些问题,比如网络不好这些。在终端里查看集群信息始终还是比较麻烦,因此可以试试部署一个 Kubernetes Dashboard ,在网页端很直观的查看 pod 的运行情况。

总结

本文介绍了两种在 Kubernetes 中部署 Apache APISIX 和 Apache APISIX-Dashboard 的方式(其实本质都一样的),其中使用 helm 来安装非常方便,短短几条指令就可以执行完所有操作。而通过 yaml 来部署更方便自定义配置。