跳到主要内容
版本:3.9.x

在 OpenShift 上安装 API7 企业版

本指南将引导你了解如何在 OpenShift 集群上部署 API7 企业版。

架构

概述

API7 企业版包括两套组件:

  1. 控制面:API7 控制台、API7 数据面管理器(DP Manager)、数据库(可以使用 RDS 替代)以及其他组件。
  2. 数据面:API7 网关。

Architecture overview

高可用部署模式

high availability deployment architectural diagram

先决条件

部署 OpenShift 集群

拥有一个运行中的 OpenShift 集群:

cluster overview

管理安全上下文约束(SCCs)

安全上下文约束(SCCs) 是 OpenShift 上的一组 API,用于管理 Pod 的安全策略约束。

OpenShift 中默认启用的 SCC 非常严格,要求容器中的进程对文件系统只读。遵循管理安全上下文约束文档,为 API7 企业版使用更灵活的 SCC nonroot-v2

配置 OpenShift CLI

安装 OpenShift CLI (oc)

在控制台上找到登录命令:

Find OpenShift Command Line Tools

Copy OpenShift Login Command

Save OpenShift API Token

使用你的 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".

创建项目

在控制台中创建一个项目:

Create a project in the OpenShift console

Create API7 project in the OpenShift console

或者,你可以使用 CLI 创建一个项目:

oc new-project api7-enterprise-project

该项目名称将被用作 Kubernetes 命名空间。

将默认项目切换为 api7-enterprise-project

oc project api7-enterprise-project

安装 API7 企业版

添加 API7 Helm Chart 仓库

在 "Helm" 选项卡下选择 "Repositories"。

Add API7 Helm chart repository

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

Fill in the details of the Helm chart repository

Fill in the details of the Helm chart repository

安装控制面

在 "Helm" 选项卡下选择 "Releases" 来创建 Helm release。

Create Helm Release

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

Select Control Plane Helm Chart

install the API7 control plane 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 完成。 Finished Configuration

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

Finished installation

查看所有创建的服务:

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 作为用户名和密码进行登录:

log in with admin/admin

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

upload license

选择 Activate

activate the license

现在你应该被重定向到控制台主界面。

添加控制面地址

在添加更多网关实例之前,首先配置控制面的连接地址。

在同一个集群中,数据面和控制面采用 https://{service-name}.{namespace}.svc.cluster:7943 的格式,无论它们是否部署在同一个命名空间下。

Add DP Manager Address

默认情况下,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

Add gateway instance

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

Generate deployment script

生成的脚本结尾不包含反斜杠(\)。确保 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)状态的网关实例。

Active Gateway Instance

验证安装

创建示例服务

导航到“Published Services”页面,并手动添加一个服务。

Add New Service

创建一个服务 httpbin 并添加一个上游节点 httpbin.org 和端口 80。配置一个到 /anything 端点的路由,并只允许 GET 方法。

你应该会看到该服务现在显示已创建的路由:

Service and Route Configuration

转发网关服务端口

在你能向网关发送请求之前,你需要首先将网关的侦听端口转发到 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"