暴露您的应用
要从测试脚本访问您的应用,必须在其运行的集群中为其分配一个外部 IP。如何操作取决于您用于部署应用的平台。以下各节说明了不同的方法。
使用端口转发
kubectl
的 port-forward
命令允许使用本地端口访问在 Kubernetes 集群中运行的应用。
例如,以下命令将使 my-service
的端口 80
作为 localhost:8080
可访问
kubectl port-forward svc/my-service 8080:80
Forwarding from 127.0.0.1:8080 -> 80
使用端口转发的限制
为了能够注入故障,xk6-disruptor
必须在每个目标上安装一个代理,该代理会拦截请求并应用所需的干扰。此过程要求将任何现有连接重定向到代理。
由于 kubectl
中存在一个现有错误,安装 disruptor 的过程可能会破坏端口转发。请注意,只有在使用端口转发暴露的服务中注入故障时,才会出现此问题。如果故障注入到未通过端口转发暴露的其他服务中,则应该不会有任何问题。
在 kubectl
中解决此问题之前,使用端口转发访问服务的测试应确保在测试发送任何流量之前,已在目标中安装代理。
最简单的实现方法是确保执行负载的场景 (#2) 在注入故障的场景 (#1) 之后开始
scenarios: {
disrupt: { // #1 inject faults
executor: 'shared-iterations',
iterations: 1,
vus: 1,
exec: "disrupt",
startTime: "0s",
},
load: { // #2 execute load
executor: 'constant-arrival-rate',
rate: 100,
preAllocatedVUs: 10,
maxVUs: 100,
exec: "default",
startTime: '20s', // give time for the agents to be installed
duration: "30s",
}
}
作为 LoadBalancer 服务
类型为 LoadBalancer
的服务会从外部负载均衡提供商接收一个外部 IP。如何配置负载均衡器取决于您集群的部署平台和配置。以下各节提供了在常见开发环境中运行应用时暴露应用的指南。如果您的集群部署在公共云中,请查阅您的云提供商文档。
如果您希望测试访问的服务未定义为负载均衡器,可以使用以下命令更改服务类型。该服务随后将接收一个外部 IP。
kubectl -n <name space> patch svc <service name> -p '{"spec": {"type": "LoadBalancer"}}'
kubectl -n <name space> patch svc <service name> -p '{\"spec\": {\"type\": \"LoadBalancer\"}}'
您可以使用以下命令检索外部 IP 地址并将其存储在环境变量中(本例中为 SVC_IP
)
SVC_IP=$(kubectl -n <name space> get svc <service name> --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
$Env:SVC_IP=$(kubectl -n <name space> get svc <service name> --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
在 Kind 中配置 LoadBalancer
Kind 是一种使用 Docker 容器模拟节点来运行本地 Kubernetes 集群的工具。您可以使用 kind 进行本地开发或 CI。部署在 kind 集群中的服务可以暴露出来,以便从主机访问,可以使用 metallb 作为负载均衡器。
在 Minikube 中配置 LoadBalancer
Minikube 实现了本地 Kubernetes 集群,支持不同的技术来虚拟化集群基础设施,例如容器、VM 或裸金属。
Minikube 的 tunnel 命令作为进程运行,在主机上创建到集群服务 CIDR 的网络路由。它使用集群的 IP 地址作为网关。tunnel 命令将外部 IP 直接暴露给在主机操作系统上运行的任何程序。
minikube tunnel