在 OpenShift 上安装 API7 企业版
本指南将引导你了解如何在 OpenShift 集群上部署 API7 企业版。
架构
概述
API7 企业版包括两套组件:
- 控制面:API7 控制台、API7 数据面管理器(DP Manager)、数据库(可以使用 RDS 替代)以及其他组件。
- 数据面:API7 网关。

高可用部署模式

先决条件
部署 OpenShift 集群
拥有一个运行中的 OpenShift 集群:

管理安全上下文约束(SCCs)
安全上下文约束(SCCs) 是 OpenShift 上的一组 API,用于管理 Pod 的安全策略约束。
OpenShift 中默认启用的 SCC 非常严格,要求容器中的进程对文件系统只读。遵循管理安全上下文约束文档,为 API7 企业版使用更灵活的 SCC nonroot-v2。
配置 OpenShift CLI
在控制台上找到登录命令:



使用你的 Token 和服务器地址登录到 OpenShift 集群:
oc login \
--token=sha256~Jk9gi578fm8tkdCje1qL0IyKc5ntqMOaladPjH3TuAk \
--server=https://api.v6g2f6c4y1v1q7s.edff.p1.openshiftapps.com:6443
请确保你的用户帐户具有执行集群管理操作的 cluster-admin 角色。
你应该会看到类似于以下的响应:
Logged into "https://api.v6g2f6c4y1v1q7s.edff.p1.openshiftapps.com:6443" as "admin" using the token provided.
You have access to 107 projects, the list has been suppressed. You can list all projects with 'oc projects'
Using project "default".
创建项目
在控制台中创建一个项目:


或者,你可以使用 CLI 创建一个项目:
oc new-project api7-enterprise-project
该项目名称将被用作 Kubernetes 命名空间。
将默认项目切换为 api7-enterprise-project:
oc project api7-enterprise-project
安装 API7 企业版
添加 API7 Helm Chart 仓库
在 "Helm" 选项卡下选择 "Repositories"。

添加 API7 仓库 https://charts.api7.ai。


安装控制面
在 "Helm" 选项卡下选择 "Releases" 来创建 Helm release。

首先选择 Api7,然后点击 Api7ee3 Helm chart 进行创建。


使用默认的最新 chart 版本,并粘贴以下代码片段来替换默认值:
# adjust the values if needed for additional customizations
postgresql:
primary:
podSecurityContext:
enabled: false
containerSecurityContext:
enabled: false
prometheus:
server:
podSecurityContext:
enabled: false
containerSecurityContext:
enabled: false
点击 Create 完成。

你应该会看到已安装的组件。

查看所有创建的服务:
kubectl get svc -owide -l app.kubernetes.io/name=api7ee3
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
api7ee3-dashboard ClusterIP 172.30.39.137 <none> 7080/TCP,7443/TCP 35s app.kubernetes.io/component=dashboard,app.kubernetes.io/instance=api7ee3,app.kubernetes.io/name=api7ee3
api7ee3-developer-portal ClusterIP 172.30.114.132 <none> 4321/TCP 35s app.kubernetes.io/component=developer-portal,app.kubernetes.io/instance=api7ee3,app.kubernetes.io/name=api7ee3
api7ee3-dp-manager ClusterIP 172.30.232.75 <none> 7900/TCP,7943/TCP 35s app.kubernetes.io/component=dp-manager,app.kubernetes.io/instance=api7ee3,app.kubernetes.io/name=api7ee3
在控制台中激活许可证
将 Dashboard 服务端口转发到 localhost:7443:
kubectl port-forward svc/api7ee3-dashboard 7443:7443
如果成功,你应该能够访问控制台 https://localhost:7443。
使用 admin 作为用户名和密码进行登录:

然后上传你的许可证。如果你没有许可证,你可以申请 30 天试用许可证。

选择 Activate:

现在你应该被重定向到控制台主界面。
添 加控制面地址
在添加更多网关实例之前,首先配置控制面的连接地址。
在同一个集群中,数据面和控制面采用 https://{service-name}.{namespace}.svc.cluster:7943 的格式,无论它们是否部署在同一个命名空间下。

默认情况下,API7 网关和控制面将使用 mTLS 进行验证认证。将 https://{service-name}.{namespace}.svc.cluster:7943 配置为 DP 管理器地址。
安装数据面
为 API7 网关配置 SCC
API7 网关需要在运行时生成本地文件,包括 nginx.conf、日志和缓存文件。具备所需权限的 nonroot-v2 SCC 就足够了。
创建一个服务账号(Service Account):
oc create serviceaccount api7-gateway -n api7-enterprise-project
使用 nonroot-v2 SCC 创建一个角色(Role):
oc create role api7-gateway \
--verb=use \
--resource=scc \
--resource-name=nonroot-v2 \
-n api7-enterprise-project
将该角色绑定到服务账号上:
oc create rolebinding api7-gateway \
--role=api7-gateway \
--serviceaccount=api7-enterprise-project:api7-gateway \
-n api7-enterprise-project
生成并运行部署脚本
与 Apache APISIX 相比,API7 企业版引入了一个额外的逻辑分组,称为网关组(Gateway Group),在这里你可以使用同一个 API7 控制台管理不同组的网关实例。
首先,你应该创建或选择目标网关组。在本指南中,你将选择 default 网关组。然后,选择 Gateway Instances 并点击 Add Gateway Instance:

切换到 Kubernetes 选项卡并填写参数。完成后,点击 Generate 以查看部署脚本。

生成的脚本结尾不包含反斜杠(\)。确保 apisix.image.tag 这一行以 \ 结尾,并将额外的 securityContext 设置追加到 Helm 命令的末尾。
命令应类似于以下内容:
helm repo add api7 https://charts.api7.ai
helm repo update
cat > /tmp/tls.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBhjCCATigAwIBAgICBAAwBQYDK2VwMEQxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
EwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYDVQQDEwhBUEk3IEluYzAe
Fw0yNTEyMjIwMjQ1MTRaFw0zNjAxMTkwMjQ1MTRaMC4xDTALBgNVBAoTBEFQSTcx
HTAbBgNVBAMTFEdBVEVXQVktQ0EtVkVSU0lPTi0xMCowBQYDK2VwAyEAj7eA6FJM
3TV6J5TfRQ8cyDR53YwoH3i9SHo/yI3UJgajZDBiMA4GA1UdDwEB/wQEAwIHgDAT
BgNVHSUEDDAKBggrBgEFBQcDAjAtBgNVHQ4EJgQkY2I2M2I4MjgtZTAxNC00ZDNh
LTg1YzMtNDk4OTQyZjhkMGE0MAwGA1UdIwQFMAOAATEwBQYDK2VwA0EALyFv3wdZ
inocl8npyQcplqGk9RdLIcSSRaTBWag7fruRnPHMoUJ7WLt0c9LdtNYY65I/l1fi
mKiOgbdJJF4XDQ==
-----END CERTIFICATE-----
EOF
cat > /tmp/tls.key <<EOF
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIKeCxj1X5nGbk1DPPOjuHbD4onJnpD1m0FwBvaiN6UR4
-----END PRIVATE KEY-----
EOF
cat > /tmp/ca.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBeDCCASqgAwIBAgIRAMGXTGlvMme6bPd9BWxagY0wBQYDK2VwMEQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYD
VQQDEwhBUEk3IEluYzAgFw0yNTEyMjIwMjE4MzlaGA8yMDg2MDEwNjAyMTgzOVow
RDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDTALBgNVBAoTBEFQ
STcxETAPBgNVBAMTCEFQSTcgSW5jMCowBQYDK2VwAyEAPCLKi9q/Mwe5HsmzgJyP
hYtvnHDxu15fQJBaoO/LjEujLzAtMA4GA1UdDwEB/wQEAwIChDAPBgNVHRMBAf8E
BTADAQH/MAoGA1UdDgQDBAExMAUGAytlcANBAKZrWTp4fogln52BvMmYr83oYSGU
S3yFz4wi1VW+0r47VSNnFkKSwcAiIpJ4Uu9MNJz4vbK3zDwrmLaMLS/ATAU=
-----END CERTIFICATE-----
EOF
kubectl create namespace api7-enterprise-project --dry-run=client -o yaml | kubectl apply -f -
kubectl create secret generic -n api7-enterprise-project 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
helm upgrade --install -n api7-enterprise-project --create-namespace api7-ee-3-gateway api7/gateway \
--set "etcd.auth.tls.enabled=true" \
--set "etcd.auth.tls.existingSecret=api7-ee-3-gateway-tls" \
--set "etcd.auth.tls.certFilename=tls.crt" \
--set "etcd.auth.tls.certKeyFilename=tls.key" \
--set "etcd.auth.tls.verify=true" \
--set "gateway.tls.existingCASecret=api7-ee-3-gateway-tls" \
--set "gateway.tls.certCAFilename=ca.crt" \
--set "apisix.extraEnvVars[0].name=API7_GATEWAY_GROUP_SHORT_ID" \
--set "apisix.extraEnvVars[0].value=default" \
--set "etcd.host[0]=https://api7ee3-dp-manager.api7-enterprise-project.svc.cluster.local:7943" \
--set "apisix.replicaCount=1" \
--set "serviceAccount.name=api7-gateway" \
--set "apisix.image.repository=api7/api7-ee-3-gateway" \
--set "apisix.image.tag=3.9.2" \
--set "apisix.securityContext.runAsNonRoot=true" \
--set "apisix.securityContext.runAsUser=636"
在你的集群上安装 API 网关实例。
返回到网关实例页面,你应该会看到一个处于健康(healthy)状态的网关实例。

验证安装
创建示例服务
导航到“Published Services”页面,并手动添加一个服务。

创建一个服务 httpbin 并添加一个上游节点 httpbin.org 和端口 80。配置一个到 /anything 端点的路由,并只允许 GET 方法。
你应该会看到该服务现在显示已创建的路由:

转发网关服务端口
在你能向网关发送请求之前,你需要首先将网关的侦听端口转发到 localhost。
首先,列出所有 Service 以检查网关服务名称:
kubectl get svc
网关服务名称为 api7-ee-3-gateway-gateway:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api7-ee-3-gateway-gateway NodePort 172.30.197.112 <none> 80:30515/TCP,443:31177/TCP 4h58m
api7-postgresql ClusterIP 172.30.188.65 <none> 5432/TCP 5h54m
api7-postgresql-hl ClusterIP None <none> 5432/TCP 5h54m
api7-prometheus-server ClusterIP 172.30.6.167 <none> 9090/TCP 5h54m
api7ee3-dashboard ClusterIP 172.30.39.137 <none> 7080/TCP,7443/TCP 5h54m
api7ee3-developer-portal ClusterIP 172.30.114.132 <none> 4321/TCP 5h54m
api7ee3-dp-manager ClusterIP 172.30.232.75 <none> 7900/TCP,7943/TCP 5h54m
接下来,将网关的 80 端口转发到 localhost:9080:
kubectl port-forward svc/api7-ee-3-gateway-gateway 9080:80
发送请求
此请求收到正确响应,这意味着安装成功。
curl "http://127.0.0.1:9080/anything" -i
你应该会收到类似于以下的 HTTP/1.1 200 OK 响应:
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "localhost",
"User-Agent": "curl/8.7.1",
"X-Amzn-Trace-Id": "Root=1-697043ec-4be975291786b3e944175f56",
"X-Forwarded-Host": "localhost"
},
"json": null,
"method": "GET",
"origin": "127.0.0.1, 3.1.235.149",
"url": "http://localhost/anything"
}
后续步骤
除了通过控制台 UI 发布服务外,API7 还提供了一个可以操作声明式配置的命令行工具,因此你可以将 API7 操作与内部 GitOps 集成。参阅使用 APISIX 声明式命令行(ADC)以声明方式管理 APISIX。
参阅入门教程以了解有关如何使用 ADC 的更多信息。
常见问题(FAQ)
如何连接到现有的 PostgreSQL?
在 Helm values 文件 中配置你的数据库 DSN:
dashboard_configuration:
database:
dsn: "postgres://api7ee:changeme@api7-postgresql:5432/api7ee"
dp_manager_configuration:
database:
dsn: "postgres://api7ee:changeme@api7-postgresql:5432/api7ee"