For more info about how to use ResiProxy, have a look at this story on Medium
ResiProxy is a ToxiProxy k8s companion:
- intercepts REST proxy creation requests and open all the necessary ports
- forwards all the requests to toxiproxy (mainly inspired by https://hackernoon.com/writing-a-reverse-proxy-in-just-one-line-with-go-c1edfa78c84b)
- does not proxy non REST "admin" requests
- compatible with ToxiProxy 2.1.3
ToxiProxy Supported endpoints
All endpoints are JSON.
- GET /proxies - List existing proxies and their toxics
- POST /proxies - Create a new proxy
POST /populate - Create or replace a list of proxies- GET /proxies/{proxy} - Show the proxy with all its active toxics
- POST /proxies/{proxy} - Update a proxy's fields
- DELETE /proxies/{proxy} - Delete an existing proxy
- GET /proxies/{proxy}/toxics - List active toxics
- POST /proxies/{proxy}/toxics - Create a new toxic
- GET /proxies/{proxy}/toxics/{toxic} - Get an active toxic's fields
- POST /proxies/{proxy}/toxics/{toxic} - Update an active toxic
- DELETE /proxies/{proxy}/toxics/{toxic} - Remove an active toxic
- POST /reset - Enable all proxies and remove all active toxics
- GET /version - Returns the server version number
The helm chart creates several K8s resources
$ helm install chart/ --namespace toxy --name resiproxy
NAME: resiproxy
LAST DEPLOYED: Tue Nov 13 17:24:50 2018
NAMESPACE: toxy
STATUS: DEPLOYED
RESOURCES:
==> v1/ServiceAccount
NAME SECRETS AGE
resiproxy 1 0s
==> v1beta1/ClusterRole
NAME AGE
resiproxy-read 0s
==> v1beta1/ClusterRoleBinding
NAME AGE
resiproxy-read 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
resiproxy-resiproxy ClusterIP xxx.xxx.xxx.xxx <none> 8080/TCP 0s
resiproxy-toxiproxy ClusterIP xxx.xxx.xxx.xxx <none> 8474/TCP 0s
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
resiproxy-resiproxy 1 1 1 0 0s
==> v1beta1/Ingress
NAME HOSTS ADDRESS PORTS AGE
resiproxy-resiproxy resiproxy.marqub.com 80, 443 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
resiproxy-resiproxy-cfc4ccbff-6v9w5 0/3 Init:0/1 0 0s
==> v1/ConfigMap
NAME DATA AGE
configmap-resiproxy 4 0s
Use the ingress to access ResiProxy from outside the cluster https://resiproxy.marqub.com
A sample request to create a proxy would be
curl -X POST http://resiproxy.resiliency-testing.com/proxies \
-H 'Content-Type: application/json' \
-d '{
"name": "proxy_service2",
"listen": "[::]:8081",
"upstream": "service2-go-service.resiliency-testing:8080",
"enabled": true
}'
This sample request opens the port 8081 at the toxiproxy
service level to redirect the incoming traffic to the port 8080
of service2
in the namespace resiliency-testing
: service2-go-service.resiliency-testing:8080
$ kubectl describe service resiproxy-toxiproxy -n resiliency-testing
Name: resiproxy-toxiproxy
Namespace: resiliency-testing
Labels: app=resiproxy
chart=resiproxy-0.0.1
heritage=Tiller
release=resiproxy
Annotations: <none>
Selector: app=resiproxy,release=resiproxy
Type: NodePort
IP: xxx.xxx.xxx.xxx
Port: http-toxiproxy 8474/TCP
TargetPort: 8474/TCP
NodePort: http-toxiproxy 31974/TCP
Endpoints: xxx.xxx.xxx.xxx:8474
Port: 8081 8081/TCP
TargetPort: 8081/TCP
NodePort: 8081 30795/TCP
Endpoints: xxx.xxx.xxx.xxx:8081
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Use the toxiproxy service to redirect your traffic to your dependencies from any services running inside your cluster; for example to send a request to service2 use resiproxy-toxiproxy.toxy:8081