在 Kubernetes 上部署
本指南介绍如何使用 Helm Chart 在 Kubernetes 上部署 API7 网关。部署包含两个主要组件:
- 控制面(CP ):Dashboard、DP Manager 和 PostgreSQL 数据库。
- 数据面(DP):处理 API 流量的 API7 网关实例。
架构概览
前提条件
开始前,请确保具备:
- 运行
1.25或更高版本的 Kubernetes 集群,例如 EKS、GKE、AKS 或自建集群。 - 已配置集群访问权限的
kubectl1.25或更高版本。 - Helm
3.10或更高版本。请参阅安装 Helm。 - PostgreSQL
12或更高版本。生产环境建议使用外部数据库。 - API7 网关许可证。请参阅获取试用许可证。
PostgreSQL 和 Prometheus 默认启用持久化存储。如果集群未配置 StorageClass,将出现 PVC 绑定错误。请配置 StorageClass,或禁用持久化(生产 环境不建议)。
第 1 步:添加 API7 Helm 仓库
helm repo add api7 https://charts.api7.ai
helm repo update
验证仓库是否添加成功:
helm search repo api7/
预期输出包含 api7/api7ee3(控制面)和 api7/gateway(数据面)。
第 2 步:创建命名空间
为所有 API7 组件创建专用命名空间:
kubectl create namespace api7
第 3 步:准备 PostgreSQL 数据库
生产部署应使用外部 PostgreSQL 数据库(例如 Amazon RDS、Cloud SQL、Azure Database for PostgreSQL),以获得持久性和高可用。
如果正在评估 API7 或运行非生产环境,Helm Chart 可以部署内置 PostgreSQL 实例。此时跳过本步骤,并在第 4 步的控制面配置文件中设置 postgresql.builtin: true。
对于外部 PostgreSQL,请创建数据库和用户:
CREATE DATABASE api7ee;
CREATE USER api7ee WITH ENCRYPTED PASSWORD 'YOUR_DB_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE api7ee TO api7ee;
第 4 步:配置控制面
创建 cp-values.yaml 文件:
# -- 禁用内置 PostgreSQL Chart,并将 Dashboard 指向外部数据库。
postgresql:
builtin: false
dashboard_configuration:
database:
dsn: "postgres://api7ee:YOUR_DB_PASSWORD@YOUR_PG_HOST:5432/api7ee"
dp_manager_configuration:
database:
dsn: "postgres://api7ee:YOUR_DB_PASSWORD@YOUR_PG_HOST:5432/api7ee"
dashboard_service:
type: ClusterIP
- 使用外部数据库时禁用内置 PostgreSQL Chart。
- 将 Dashboard 和 DP Manager 中的
YOUR_PG_HOST、YOUR_DB_PASSWORD替换为 PostgreSQL 连接信息。使用 AWS RDS 时,请填写实例端点,例如api7ee.xxxx.us-east-1.rds.amazonaws.com。 - 初始安装建议使用
ClusterIP,通过kubectl port-forward访问 Dashboard。需要长期访问时,改用LoadBalancer或 Ingress Controller。
要使用内置 PostgreSQL 快速评估(不适用于生产环境):
postgresql:
builtin: true
primary:
persistence:
enabled: true
size: 10Gi
dashboard_service:
type: ClusterIP
- 在评估环境中启用内置 PostgreSQL Chart。
- 将 Dashboard Service 保持为
ClusterIP,并使用kubectl port-forward访问。
第 5 步:安装控 制面
helm install api7ee3 api7/api7ee3 \
-f cp-values.yaml \
-n api7
此处 Helm Release 名称和 Chart 名称均为 api7ee3,与 Chart 自身的 Chart.yaml 一致。可以选择其他 Release 名称,但修改后也要相应调整下方验证命令中的 Helm 选择器。
第 6 步:验证控制面 Pod
等待所有控制面 Pod 进入 Ready 状态:
kubectl -n api7 wait \
--for=condition=Ready pod \
-l app.kubernetes.io/name=api7ee3 \
--timeout=900s
镜像拉取期间也可以持续观察 Pod 状态:
kubectl get pods -n api7 -w
预期输出:
NAME READY STATUS RESTARTS AGE
api7ee3-dashboard-xxxxx-yyyyy 1/1 Running 0 2m
api7ee3-dp-manager-xxxxx-yyyyy 1/1 Running 0 2m
api7ee3-developer-portal-xxxxx-yyyyy 1/1 Running 0 2m
如果使用内置 PostgreSQL,还应看到:
api7-postgresql-0 1/1 Running 0 2m
冷启动时,内置 PostgreSQL 镜像仍在拉取或初始化,api7ee3-dp-manager 或 api7ee3-developer-portal 可能短暂重启。如果 Pod 日志显示数据库拒绝连接且 api7-postgresql-0 尚未就绪,请等待 PostgreSQL 就绪后重新检查控制面 Pod。数据库可用后,此暂时状态应自动恢复,无需手动操作。
第 7 步:验证控制面 Service
kubectl get svc -n api7 -l app.kubernetes.io/name=api7ee3 -o wide
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api7ee3-dashboard ClusterIP 10.100.25.236 <none> 7080/TCP,7443/TCP 3m
api7ee3-developer-portal ClusterIP 10.100.88.101 <none> 4321/TCP 3m
api7ee3-dp-manager ClusterIP 10.100.239.32 <none> 7900/TCP,7943/TCP 3m
关键 Service:
| Service | 端口 | 用途 |
|---|---|---|
api7ee3-dashboard | 7443 | Dashboard UI 和 Admin API |
api7ee3-dashboard | 7080 | Dashboard HTTP端点 |
api7ee3-developer-portal | 4321 | 开发者门户 Service |
api7ee3-dp-manager | 7900 | DP Manager HTTP端点 |
api7ee3-dp-manager | 7943 | DP Manager mTLS端点(网关连接) |
第 8 步:访问 Dashboard
将 Dashboard 端口转发到本地计算机:
kubectl -n api7 port-forward svc/api7ee3-dashboard 7443:7443
在浏览器中打开 https://localhost:7443,使用默认凭证(admin / admin)登录。首次登录时,Dashboard 会提示重置密码,随后打开 Activate License 页面,可在此上传并激活许可证。
第 9 步:配置 DP Manager 地址
在 API7 Dashboard 中进入 Gateway Settings,将 DP Manager Address 设置为 Kubernetes 内部 Service DNS:
https://api7ee3-dp-manager:7943
数据面实例将使用此地址连接控制面。
第 10 步:添加网关实例(生成数据面证书)
在 API7 Dashboard 中选择网关组(例如 default),进入 Gateway Instances 并点击 Add Gateway Instance。选择 Kubernetes,填写目标命名空间并生成部署脚本。Dashboard 将生成:
1.数据面的 TLS 证书(tls.crt)。
2. TLS 私钥(tls.key)。
3. 用于验证控制面的 CA 证书(ca.crt)。
4. 为生成证书创建 Secret 的 kubectl create secret 命令。
5. 包含所有必需参数的完整 Helm 安装命令。
复制生成的脚本,其中包含证书、Secret 创建命令,以及安装数据面的准确 Helm 命令。
第 11 步:创建 mTLS Secret
从生成的脚本提取证书并创建 Kubernetes Secret:
# 将生成脚本中的证书保存到文件,然后创建 Secret:
kubectl create secret generic api7-ee-3-gateway-tls \
--from-file=tls.crt=/tmp/tls.crt \
--from-file=tls.key=/tmp/tls.key \
--from-file=ca.crt=/tmp/ca.crt \
-n api7
每个网关组的证书都是唯一的。如果有多个网关组,每组都需要自己的证书和独立 Kubernetes Secret。
第 12 步:安装数据面
使用 Dashboard 生成的 Helm 命令,或将生成的配置写入 dp-values.yaml,再使用 Helm 安装数据面。
etcd:
auth:
tls:
enabled: true
existingSecret: api7-ee-3-gateway-tls
certFilename: tls.crt
certKeyFilename: tls.key
verify: true
host:
- https://api7ee3-dp-manager:7943
gateway:
tls:
existingCASecret: api7-ee-3-gateway-tls
certCAFilename: ca.crt
apisix:
extraEnvVars:
- name: API7_GATEWAY_GROUP_SHORT_ID
value: default
replicaCount: 2
image:
repository: api7/api7-ee-3-gateway
tag: ${GATEWAY_VERSION}
❶ 将数据面指向集群内部的 DP Manager mTLS Service。
❷ 如果不使用默认组,请将 default 替换为网关组短 ID。
❸ 根据可用性要求和与控制面兼容的网关镜像版本设置副本数及 ${GATEWAY_VERSION}。生产环境必须固定明确版本,不要使用 latest。
helm upgrade --install api7-ee-3-gateway api7/gateway \
-f dp-values.yaml \
-n api7
第 13 步:验证数据面 Pod
kubectl get pods -n api7 -l app.kubernetes.io/name=gateway -w
预期输出:
NAME READY STATUS RESTARTS AGE
api7-ee-3-gateway-xxxxx-yyyyy 1/1 Running 0 1m
api7-ee-3-gateway-xxxxx-zzzzz 1/1 Running 0 1m
第 14 步:验证数据面 Service
kubectl get svc -n api7 -l app.kubernetes.io/name=gateway
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api7-ee-3-gateway-gateway NodePort 10.100.50.100 <none> 80:31080/TCP,443:31443/TCP 1m
第 15 步:在 Dashboard 中验证连接
登录 API7 Dashboard 并进入 Gateway Groups,数据面实例应显示为 Healthy。
如果实例未出现:
- Check the DP pod logs:
kubectl logs -n api7 -l app.kubernetes.io/name=gateway --tail=50 - Verify the mTLS secret exists:
kubectl get secret api7-ee-3-gateway-tls -n api7 - Verify the secret contains all required files:
kubectl get secret api7-ee-3-gateway-tls -n api7 -o json | jq '.data | keys' - Confirm the CP address is reachable from the DP pods (a TLS handshake error is expected — this verifies DNS and network connectivity):
kubectl exec -n api7 <gateway-pod> -- curl -sk --connect-timeout 5 "https://api7ee3-dp-manager:7943/" -o /dev/null -w "%{http_code}"
第 16 步:暴露网关
选择以下一种方式,为外部流量暴露网关:
方式 A:NodePort Service(默认)
网关 Helm Chart 默认创建 NodePort Service。可以通过节点 IP 访问,也可以端口转发该 Service 进行本地验证。
# 使用端口转发访问默认 Service
kubectl port-forward -n api7 svc/api7-ee-3-gateway-gateway 9080:80