准备测试环境 (AWS EKS)
你也可以访问公开的性能基准测试仓库。该仓库详细记录了测试中使用的所有资源部署配置,以及每个测试场景的具体配置信息。
前置条件
创建集群
- 在 AWS EKS 中添加新集群:

- 配置集群。如果你以前没有使用过 EKS 服务来配置集群服务角色,你可以按照文档创建一个 EKS 集群角色。

- 配置网络:

- 配置可观测性:

- 配置插件:

- 创建集群:

添加节点
创建密钥对(可选)
为节点配置 Key Pairs 后,你可以直接登录节点。如果你已经有 Key Pairs,可以跳过创建密钥对的步骤。
- 在 AWS 控制台中选择 "EC2",进入 EC2 界面,点击左侧的 "Key Pairs",再点击右侧的 "Create key pair"。

- 设置密钥对名称:

- 创建密钥对。此时,浏览器将自动下载密钥对文件。请保存此文件,以便稍后可以使用命令登录到节点。

创建节点组
你将添加 3 个节点组(Node Groups),你会分别将 API7 企业版、NGINX 上游(upstream)和 wrk2 部署到不同的节点组中。
**注意:**如果你以前没有创建过 EKS Node Role,需要先创建它。步骤与在 EKS 中创建集群服务角色的过程类似。请参阅 Amazon EKS node IAM role 了解更多细节。
- 选择 Compute 并点击 Add node group。

- 配置节点组详细信息,如名称和节点 IAM 角色。

- 选择
Amazon Linux2 (AL2_x86_64)作为 AMI 类型,并选择c5.4xlarge作为实例类型。

- 配置网络。如果你需要通过 SSH 登录节点,请相应地配置节点远程访问控制。

- 重复上述步骤,创建 3 个分别命名为 api7ee、upstream、
wrk2的节点组。

配置 AWS CLI
- 通过向
kubectl的config文件添加新上下文,使kubectl能够与之前创建的集群通信。请参阅 Creating an Amazon EKS cluster 了解更多细节。
aws eks update-kubeconfig --region region-code --name my-cluster
- 运行
kubectl get svc以验证是否成功与集群通信。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 39m
配置 K8s 集群节点标签
给节点打标签:
kubectl label nodes <your-node-name> <label_key=label_value>
# 示例
kubectl label nodes <your-node1-name> nodeName=api7ee
kubectl label nodes <your-node2-name> nodeName=upstream
kubectl label nodes <your-node3-name> nodeName=wrk2
安装
安装 API7 企业版
控制面
- 创建新命名空间:
kubectl create namespace api7
- 安装 API7 控制面:
helm repo add api7 https://charts.api7.ai
helm repo update
# 指定安装 api7ee 的 Node(即我们之前为 Node 设置的标签)。
helm install api7ee3 api7/api7ee3 --set nodeSelector."nodeName"=api7ee --set postgresql.primary.nodeSelector."nodeName"=api7ee --set prometheus.server.nodeSelector."nodeName"=api7ee -n api7
默认情况下,PostgreSQL 和 Prometheus 启用了持久化存储。如果你没有为集群配置 StorageClass,你可能会收到一些错误信息。
你也可以使用以下命令临时禁用持久化存储,但请注意不要在生产环境中禁用它,否则在 Pod 重启后数据将会丢失。
helm install api7ee3 api7/api7ee3 --set nodeSelector."nodeName"=api7ee --set postgresql.primary.nodeSelector."nodeName"=api7ee --set prometheus.server.nodeSelector."nodeName"=api7ee --set postgresql.primary.persistence.enabled=false --set prometheus.server.persistence.enabled=false -n api7
- 检查部署状态:
kubectl get svc -owide -l app.kubernetes.io/name=api7ee3 -n api7
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
api7ee3-dashboard ClusterIP 10.100.25.236 <none> 7080/TCP 18s app.kubernetes.io/component=dashboard,app.kubernetes.io/instance=api7ee3,app.kubernetes.io/name=api7ee3
api7ee3-dp-manager ClusterIP 10.100.239.32 <none> 7900/TCP,7943/TCP 18s app.kubernetes.io/component=dp-manager,app.kubernetes.io/instance=api7ee3,app.kubernetes.io/name=api7ee3
- 将 dashboard 端口转发到本地机器,登录控制台,并上传许可证(License):
kubectl -n api7 port-forward svc/api7ee3-dashboard 7443:7443
- 设置控制面地址:
登录到 dashboard 并在此处配置 Gateway Settings 中的 "Control Plane Address":https://api7ee3-dp-manager:7943

禁用全局插件 prometheus

API7 网关(数据面)
- 点击 Add Gateway Instance 按钮:

- 选择 Kubernetes 方式:
选择 Kubernetes 方式并配置 "namespace" 以生成安装脚本并运行它。默认情况下,API7 网关和控制面将通过 mTLS 进行身份验证。例如:
helm repo add api7 https://charts.api7.ai
helm repo update
cat > /tmp/tls.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBiDCCATqgAwIBAgICBAAwBQYDK2VwMEQxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
EwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYDVQQDEwhBUEk3IEluYzAe
Fw0yNDA4MDkwNjM0NDRaFw0yNTA5MDgwNjM0NDRaMDAxDTALBgNVBAoTBEFQSTcx
HzAdBgNVBAMTFmFwaTdlZTMtYXBpc2l4LWdhdGV3YXkwKjAFBgMrZXADIQA4EF9i
qogMWwWQnhrD478bCTQxxeDrT8zUUC+KC4lbLaNkMGIwDgYDVR0PAQH/BAQDAgeA
MBMGA1UdJQQMMAoGCCsGAQUFBwMCMC0GA1UdDgQmBCQzMmE2MTU3Yi0yMGFmLTQ4
NDctYWEyOC04M2M1M2ZmMTY4ZDAwDAYDVR0jBAUwA4ABMDAFBgMrZXADQQDzxx2i
QV62ZB0WOdxofuQ2J+35sh6tYCOayrjAn5KISQ5L1JMIrDZKotq5G8JLM3qMs9Nc
DZjDWzx+W1j94GAO
-----END CERTIFICATE-----
EOF
cat > /tmp/tls.key <<EOF
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEILY+bFM98L+OLxTWd73hnl9FmYGfhGASUhuYrpt/Q0CE
-----END PRIVATE KEY-----
EOF
cat > /tmp/ca.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBdjCCASigAwIBAgIRAJDZ9s+rZMNiqiiAyT3NXpkwBQYDK2VwMEQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYD
VQQDEwhBUEk3IEluYzAeFw0yNDA4MDkwNjI4MDBaFw0zNDA4MDcwNjI4MDBaMEQx
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3
MREwDwYDVQQDEwhBUEk3IEluYzAqMAUGAytlcAMhAN/VCNB2ChcL4BrXVImIW/EH
YZi2oDrXVub/mXaMSr7Zoy8wLTAOBgNVHQ8BAf8EBAMCAoQwDwYDVR0TAQH/BAUw
AwEB/zAKBgNVHQ4EAwQBMDAFBgMrZXADQQCA0M1McTsw6c9LGqmFP1g/BXNyeyDI
dBnVnPlZgCwMQCDqkI9S8wyZbz4jLGGccKnqAclNhuJsSn94UGuteaIG
-----END CERTIFICATE-----
EOF
kubectl create secret generic -n api7 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 --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:7943" \
--set "apisix.replicaCount=1" \
--set "apisix.image.repository=api7/api7-ee-3-gateway" \
--set "apisix.image.tag=3.2.14.4" \
# 注解 1
--set "nginx.workerProcesses"=1 \
# 注解 2
--set apisix.nodeSelector.nodeName=api7ee \
# 注解 3
--set apisix.securityContext.runAsNonRoot=false \
--set apisix.securityContext.runAsUser=0
你应该在单独的节点上安装网关并根据需要调整 worker_processes。此外,如果你想在网关容器中安装 top 及其他工具,你可以用 root 身份启动它。例如:
❶ 配置网关的 worker_processes:--set "nginx.workerProcesses"=1
❷ 配置节点选择器:--set apisix.nodeSelector.nodeName=api7ee
❸ 以 root 用户身份运行:
--set apisix.securityContext.runAsNonRoot=false--set apisix.securityContext.runAsUser=0
安装 NGINX 上游
- 创建 NGINX 上游部署文件:
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: api7
name: nginx-config
data:
nginx.conf: |
master_process on;
worker_processes 1;
events {
worker_connections 4096;
}
http {
resolver ipv6=off 8.8.8.8;
#access_log logs/access.log;
access_log off;
server_tokens off;
keepalive_requests 10000000;
server {
listen 1980;
server_name _;
location / {
proxy_set_header Connection "";
return 200 "hello world\n";
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: api7
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
nodeSelector:
nodeName: upstream
volumes:
- name: nginx-config-volume
configMap:
name: nginx-config
---
- 部署 NGINX 上游
kubectl apply -f nginx-upstream.yaml
安装 wrk2
- 创建
wrk2部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: api7
name: wrk2-deployment
spec:
replicas: 1
selector:
matchLabels:
app: wrk2
template:
metadata:
labels:
app: wrk2
spec:
containers:
- name: wrk2
image: bootjp/wrk2
nodeSelector:
nodeName: wrk2
- 部署
wrk2
kubectl apply -f wrk2.yaml