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

准备测试环境 (AWS EKS)

你也可以访问公开的性能基准测试仓库。该仓库详细记录了测试中使用的所有资源部署配置,以及每个测试场景的具体配置信息。

前置条件

创建集群

  1. 在 AWS EKS 中添加新集群:

create cluster

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

configuration cluster

  1. 配置网络:

configuration cluster networks

  1. 配置可观测性:

configuration observability

  1. 配置插件:

configuration cluster plugin

  1. 创建集群:

wait cluster creating

添加节点

创建密钥对(可选)

为节点配置 Key Pairs 后,你可以直接登录节点。如果你已经有 Key Pairs,可以跳过创建密钥对的步骤。

  1. 在 AWS 控制台中选择 "EC2",进入 EC2 界面,点击左侧的 "Key Pairs",再点击右侧的 "Create key pair"。

create key pairs

  1. 设置密钥对名称:

configuration key pairs

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

create key pairs success

创建节点组

你将添加 3 个节点组(Node Groups),你会分别将 API7 企业版、NGINX 上游(upstream)和 wrk2 部署到不同的节点组中。

**注意:**如果你以前没有创建过 EKS Node Role,需要先创建它。步骤与在 EKS 中创建集群服务角色的过程类似。请参阅 Amazon EKS node IAM role 了解更多细节。

  1. 选择 Compute 并点击 Add node group

add node group

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

configure node group details

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

configuration EC2

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

configuration networks

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

node info

配置 AWS CLI

  1. 通过向 kubectlconfig 文件添加新上下文,使 kubectl 能够与之前创建的集群通信。请参阅 Creating an Amazon EKS cluster 了解更多细节。
aws eks update-kubeconfig --region region-code --name my-cluster
  1. 运行 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 企业版

控制面

  1. 创建新命名空间:
kubectl create namespace api7
  1. 安装 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
  1. 检查部署状态:
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
  1. 将 dashboard 端口转发到本地机器,登录控制台,并上传许可证(License):

免费试用许可证

kubectl -n api7 port-forward svc/api7ee3-dashboard 7443:7443
  1. 设置控制面地址:

登录到 dashboard 并在此处配置 Gateway Settings 中的 "Control Plane Address":https://api7ee3-dp-manager:7943

gateway settings

禁用全局插件 prometheus

disable Prometheus

API7 网关(数据面)

  1. 点击 Add Gateway Instance 按钮:

add gateway instance

  1. 选择 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 上游

  1. 创建 NGINX 上游部署文件:
nginx-upstream.yaml
---
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
---
  1. 部署 NGINX 上游
kubectl apply -f nginx-upstream.yaml

安装 wrk2

  1. 创建 wrk2 部署文件:
wrk2.yaml
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
  1. 部署 wrk2
kubectl apply -f wrk2.yaml

配置

你可以在公开的性能基准测试仓库中找到每个测试场景的配置,或者使用 ADC 工具直接创建每个场景的配置。