During this summer period, I worked with Envoy & Layer5 community to enable distributed load testing of service meshes and envoy data planes, Envoy's performance benchmarking tool Nighthawk and Layer5's multimesh benchmarking tool Meshery were used to accomplish the project. Nighthawk is a L7 (HTTP/HTTPS/HTTP2) performance characterization tool which supports load testing with HTTP/1.1 and HTTP/2 over HTTP and HTTPS. Meshery is the multi-service mesh management plane offering lifecycle, configuration and performance management of service meshes and their workloads.
My main goal of this project was to focus on Nighthawk architecture and how it can be invoked in Meshery which currently supports load generation over fortio & wrk2, moreover I worked on SMI conformance tool, service mesh performance specification, architectural design & more.
With the onset of community bonding period, I started off by laying the groundwork required for the successful completion of project. On my journey ahead during the GSoC period I embraced with many new bleeding edge technologies like gRPC, Service Mesh Interface, Service Mesh Performance Specification, Performance Benchmarking, Open Service Mesh and more.
Although my work was primarily based on distributed services in Golang, I didn't restricted myself and explored the UI factor and CI pipelines of the services. By enabling cache store, parallelisation between jobs, and interdependency for workflows I was able to reduce the time taken by CI pipelines by around 12-15 times.
- Laid the base for upcoming refactors and features by enhancing existing server routes, focused on minor bug fixes in the server, refactored UI dependencies, reduced the production bundle package and drafting the design document for distributed performance benchmarking.
- Introduced ES-Lint for UI code and established standard code quality guidelines for the community.
- Implemented Build & Release for the repository artifacts using Goreleaser, automated the continuous delivery of the tool for brew, scoop & OS package files.
- Implemented Load-Test defaults per user for performance benchmarking.
- Introduced Traffic Specification and Application Metadata Specification for Service Mesh Performance.
- Sanitised the client-side code & removed the dead code from the server to increase application performance.
- Compared different performance benchmarking tools to have an architectural comparision among Nighthawk, Fortio & Wrk2.
- Created an interface using common methods for all the load generators termed as Load Generator Inteface, defined aliases and constants for different parameters in load generator.
- Following the design document for the Nighthawk integration, initiated a Golang based API for Nighthawk.
- Worked on design mockup & UI for the SMI Conformance tool invoked within the Meshery, service mesh management plane.
- Created a Golang package named nighthawk-go which will serve as a middleware layer between meshery & nighthawk to enable performance benchmarking.
- Migrated CI pipelines to introduce a cache store, parallelisation between jobs, and interdependency for workflows.
- Invoked Open Service Mesh Adapter in Meshery to expose its functionality to end-users.
- Meshery, service mesh management plane with SMI conformance & performance benchmarking capability
- Service Mesh Performance Specification
- Nighthawk-go, middleware API layer serving as an handler with nighthawk
Here is the design document invoking distributed load generation & performance benchmarking using nighthawk.
Being associated with such fluorishing community has been a boon to me, I not only made code contributions but also guided new contributors to get started with service-meshes. I reviewed more than 150 Pull Requests of my colleagues and new contributors during my work period. I published blog posts and articles about my journey with CNCF as a GSoC mentee, and my work was also presented at KubeCon+CloudNativeCon-2020 EU.
I will be active in community even after my GSoC Period, there is still few work remaining in the nighthawk api:
- Addition of e2e and behaviour driven tests using ginkgo for the API & command.
- Update the nighthawk-api to follow the upstream nighthawk client as soon as stable release with distributed performance architecture is made.
- Revamp the UI to expose more details about the capability of each load-generator and letting the end-users choose which one is suited for there use-case.