跳到主要内容
版本:3.2.16.4

准备性能测试环境(AWS EKS)

AWS EKS 环境准备

创建集群

  1. 在 AWS EKS 中添加一个新的测试集群

create cluster

  1. 配置测试集群,如果之前没有使用过 EKS 服务配置过集群服务角色,可以根据文档创建一个 EKS 集群角色:https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html#create-service-role

config cluster

  1. 点击下一步配置网络设置

cluster network

  1. 配置可观测性

cluster observability

  1. 选择插件(默认配置),点击下一步

cluster plugin

  1. 点击创建集群,等待 EKS 创建

create success

添加 Node

创建 Key pair(选做)

在 node 中配置了 Key Pair 就可以直接登录 node。如果已经有 Key Pair 的话,可以跳过创建 Key pair 这一步。

  1. 在 AWS 中控台选择 “EC2”,进入 EC2 界面,点击左边的 “Key Pairs”,在右边点击 “Create key pair”

create key

  1. 添加名称

update key name

  1. 创建密钥对,这时浏览器会自动下载 key pair,这个要保存好,方便之后使用命令登陆 node

create key success

创建节点组

我们需要添加 3 个节点组,分别在不同的节点组部署 API7 EE,NGINX 上游,wrk2。

注意:如果之前没有创建过 EKS Node Role 需要先创建,步骤类似 EKS 创建集群服务角色的过程。可以参考文档:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-node-role.html

  1. 选择“计算”,点击添加“节点组”

add node

  1. 配置节点组

config node

  1. 这里我们选择 c5.2xlarge 进行测试,测试过程使用单节点。

config ec2

  1. 配置网络,这里我们为了方便登陆到 node 中,开启了节点远程访问控制权限,不需要可以不开启。

config node network

  1. 根据上面的步骤,我们需要创建 3 个节点,名字分别为 api7ee,upstream,wrk2 等待创建完成。

create 3 node

使用 aws cli 配置 kubectl config

  1. 通过向 kubectl config 文件添加新上下文来启用 kubectl 与我们创建的集群通信。

具体细节参考文档:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-cluster.html

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

为 Node 打 label

我们分别为 4 个不同的 Node 打上对应的 label,方便之后的部署

kubectl label nodes <your-node-name> <label_key=label_value>

# example
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. 创建一个新的 namespace,之后所有的资源都在同一个 namespace 中管理
kubectl create namespace api7
  1. 使用 helm 安装 API7 EE CP
helm repo add api7 https://charts.api7.ai            
helm repo add apisix https://charts.apiseven.com
helm repo update
# 为安装 api7ee 指定 Node (之前我们为 Node 设置的 label)
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. 将端口转发到本机,登陆控制台并上传 license
kubectl -n api7 port-forward svc/api7ee3-dashboard 7443:7443

License 试用申请地址:https://api7.ai/try?product=enterprise

  1. 在控制台配置控制面地址:http://api7ee3-dp-manager:7900

config dp address

禁用 prometheus 插件

控制面默认会为网关组启用全局的 prometheus 插件,进行性能测试时,我们需要将它禁用掉。

disable prometheus

数据面安装

  1. 点击进入网关组中

access gateway group

  1. 点击新增网关实例按钮

add gateway

  1. 选择 Kubernetes 方式添加,配置命名空间,生成安装脚本并运行

get scripts

注意我们先修改 API7 Gateway 的 worker_process 数为 1,并指定安装的 Node

helm install -n api7 --create-namespace api7-ee-3-gateway api7/gateway \
--set "apisix.extraEnvVars[0].name=API7_CONTROL_PLANE_TOKEN" \
--set "apisix.extraEnvVars[0].value=a7ee-1onxEIUNvKhihuwLKIfNvP61QzYisftJp7fwU3MBMNx9W4h1kdbdf9031a24d7448da69b6120a526f902" \
--set "apisix.image.repository=api7/api7-ee-3-gateway" \
--set "apisix.image.tag=3.2.8.1" \
--set "etcd.host[0]=http://api7ee3-dp-manager:7900" \
--set "apisix.replicaCount=1" \
--set "nginx.workerProcesses"=1 \
--set apisix.securityContext.runAsNonRoot=false \
--set apisix.securityContext.runAsUser=0 \
--set apisix.nodeSelector.nodeName=api7ee

安装 NGINX 上游

  1. 创建 nginx-upstream.yaml 文件
---
# nginx conf configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: api7
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";
}
}
}
---
# nginx deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: api7
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

创建 wrk2.yaml 文件,并运行 kubectl apply -f wrk2.yaml

# wrk2 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: wrk2-deployment
namespace: api7
spec:
replicas: 1
selector:
matchLabels:
app: wrk2
template:
metadata:
labels:
app: wrk2
spec:
containers:
- name: wrk2
image: bootjp/wrk2
nodeSelector:
nodeName: wrk2

测试配置