From bb8ecac4f359c6ec1aef258b1ab2a89b21f14d8b Mon Sep 17 00:00:00 2001 From: Ivan Osipov Date: Sat, 13 Jan 2024 17:01:28 +0400 Subject: [PATCH 01/12] Add blog to site Signed-off-by: Ivan Osipov --- assets/sass/style.sass | 8 + config.toml | 7 +- ...8-08-17-welcome-to-network-service-mesh.md | 11 - ...-01-11-testing-service-mesh-performance.md | 196 ++++++++++++++++++ content/blog/_index.md | 4 + layouts/blog/section.en.html | 3 +- layouts/blog/single.en.html | 8 + layouts/partials/blog.html | 21 ++ static/img/blog/2024/01/11/Fig1.png | Bin 0 -> 15550 bytes static/img/blog/2024/01/11/Fig2.png | Bin 0 -> 1896 bytes static/img/blog/2024/01/11/Fig3.png | Bin 0 -> 3595 bytes static/img/blog/2024/01/11/Fig4.png | Bin 0 -> 1857 bytes static/img/blog/2024/01/11/Fig5.png | Bin 0 -> 3425 bytes 13 files changed, 245 insertions(+), 13 deletions(-) delete mode 100644 content/blog/2018-08-17-welcome-to-network-service-mesh.md create mode 100644 content/blog/2024/2024-01-11-testing-service-mesh-performance.md create mode 100644 content/blog/_index.md create mode 100644 layouts/blog/single.en.html create mode 100644 layouts/partials/blog.html create mode 100644 static/img/blog/2024/01/11/Fig1.png create mode 100644 static/img/blog/2024/01/11/Fig2.png create mode 100644 static/img/blog/2024/01/11/Fig3.png create mode 100644 static/img/blog/2024/01/11/Fig4.png create mode 100644 static/img/blog/2024/01/11/Fig5.png diff --git a/assets/sass/style.sass b/assets/sass/style.sass index 96731bf1..b82cb6ca 100644 --- a/assets/sass/style.sass +++ b/assets/sass/style.sass @@ -122,3 +122,11 @@ img[src*="/img/concepts/enterprise/3x1/"] img[src*="/img/concepts/"] width: 80%; + +ul.pagination + width: 25%; + +.paginator-container + padding: 10px; + display: flex; + justify-content: center; diff --git a/config.toml b/config.toml index 3e0af642..6430b1a0 100644 --- a/config.toml +++ b/config.toml @@ -31,12 +31,17 @@ name = "Events" url = "/events" weight = 3 +[[menu.navbar]] +name = "Blog" +url = "/blog" +weight = 4 + # The site's parameters [params] twitter = "nservicemesh" fontawesomeversion = "5.8.1" -dateFormat = "6 January 2006" +dateFormat = "2 January 2006" subtitle = "The Hybrid/Multi-cloud IP Service Mesh" description = """ diff --git a/content/blog/2018-08-17-welcome-to-network-service-mesh.md b/content/blog/2018-08-17-welcome-to-network-service-mesh.md deleted file mode 100644 index e9946ef1..00000000 --- a/content/blog/2018-08-17-welcome-to-network-service-mesh.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -title = "Welcome to Network Service Mesh" -date = 2018-08-17T16:18:07-05:00 -tags = ["network service mesh"] -categories = ["network service mesh"] -draft = true -+++ - -Welcome to the Network Service Mesh Project! We are excited you decided to stop -by our little corner of the internet. - diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md new file mode 100644 index 00000000..7950b122 --- /dev/null +++ b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md @@ -0,0 +1,196 @@ ++++ +title = "Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM" +date = 2024-01-11 +announce= "This article may be useful for those who are aware of service meshes and probably trying to improve scalability and connectivity between applications in Kubernetes and other container orchestration systems, e.g., adding encryption and authorization for application connections." ++++ + +# Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM + +## Introduction + +This article may be useful for those who are aware of service meshes and probably trying to improve scalability and connectivity between applications in Kubernetes and other container orchestration systems, e.g., adding encryption and authorization for application connections. + +Imagine your business is growing, so one Kubernetes cluster gets too much traffic and becomes overloaded, in other words it is no longer enough. As a result, you need more resources and in a short period of time. You also might need to meet new requirements and improve fault tolerance or isolate application resources for security purposes. + +Since different service meshes have similar basic functionalities, and most of them support multi-cluster scenarios, they are a useful tool in addressing the described problems. + +How do service meshes affect performance? There are [several](https://medium.com/elca-it/service-mesh-performance-evaluation-istio-linkerd-kuma-and-consul-d8a89390d630) [papers](https://layer5.io/resources/service-mesh-performance/analyzing-service-mesh-performance) comparing service mesh performance, but none says much about their application in a multi-cluster scenario, so the purpose of this paper is to provide an objective and reproducible testing process to compare the performance of selected service meshes in a dual cluster scenario. During the testing process, an optimal configuration is to be chosen for each service mesh to avoid a negative impact on the performance. + +## Relevance + +Many Kubernetes users employ such service meshes as Istio, Kuma or Consul. Since scaling is a mandatory requirement of any modern web application or service that allows one to increase performance under high load, this article covers cross-cluster scaling with different service meshes from the standpoint of their performance. + +## Goal + +The goal of the article is to assess the performance of different service meshes in the industrial scenarios using more than one cluster. + +## Formulation of the Problem + +The main problem of such assessment is providing reproducible, consistent and objective tests for service meshes in a multi-cluster topology that exclude any negative factors as an incorrect or non-optimal setup for a specific service mesh, network problems and resource availability. To do so, the following service meshes have been selected: + + - [Istio](https://istio.io/) + - [Kuma](https://kuma.io/) + - [NSM (Network Service Mesh)](https://networkservicemesh.io/) + +For deployment, the following cluster providers have been chosen: + - Equinix Metal, a highly performant cluster in terms of its hardware + - AWS EKS as the most common solution among managed clusters. + +## Setup + +For each working environment (AWS and Equinix Metal), 2 identical side-by-side clusters have been set up to employ the following testing scenario: + - One instance of Nginx deployment as a server workload; + - One instance of [Fortio](https://fortio.org/) deployment as a Nginx client; + - The client sends requests to the server. + +![General deployment diagram](/img/blog/2024/01/11/Fig1.png) +*Figure 1. General deployment diagram* + +This method was chosen as a first step in testing the performance of service meshes, and we planned to extend the experiments to more complex scenarios, so this paper covers the first step of our road map. So far, we have accumulated more than 1000 positive runs. About the same number of negative tests have been run to debug the environment and test scripts. The data collected this way enables us to say that the test scenario we have chosen has sufficient reproducibility and stability. + +## AWS EKS clusters + +The AWS clusters were set up using [eksctl CLI](https://eksctl.io/), each cluster consisting of a single node. The clusters were deployed on m5.2xlarge servers with the following parameters: + + - CPU: 8 vCPUs; + - Memory: 32 GB RAM; + - Network: up to 10 Gbps, MTU 1500; + - Location: us-east-1 zone; + - Load Balancer: ELB, Elastic Load Balancer. + +Find the cluster setup scripts [in the project’s repository](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/cluster-setup). + +## Equinix Metal clusters + +The Equinix Metal clusters were set using [clusterctl CLI](https://cluster-api.sigs.k8s.io/clusterctl/overview.html), each cluster consisting of 1 control plane and 1 worker node. The clusters were deployed on m5.2xlarge servers with the following parameters: + + - CPU: AMD EPYC 7402P, 24 cores; + - Memory: 64 GB RAM; + - Network: 2x10 Gbps network; + - Location: Dallas; + - Load Balancer: MetalLB, [provided by Equinix Metal](https://github.com/kubernetes-sigs/cloud-provider-equinix-metal#metallb-from-v0110-to-v0121). + +Find the cluster setup scripts [in the project’s repository](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/cluster-setup). + +## Istio + +We are currently using Istio v. 1.19.3 set up using instructions for [Multi-Primary on different networks](https://istio.io/latest/docs/setup/install/multicluster/multi-primary_multi-network/) installation. The connections are encrypted using [mTLS](https://istio.io/latest/docs/concepts/security/#mutual-tls-authentication). The workloads are connected via the standard [Istio multi-cluster DNS resolution](https://istio.io/latest/docs/ops/deployment/deployment-models/#dns-with-multiple-clusters). The data plane is [based on Envoy proxies](https://istio.io/latest/docs/ops/deployment/architecture/). + +Find the deployment files and related deploy scripts in the [Istio folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/istio) of the project’s repository. + +## Kuma + +We are currently using Kuma v.2.4.3 set up as a [Kuma multi-zone scenario](https://kuma.io/docs/2.4.x/production/deployment/multi-zone/) without the Egress component as [instructed](https://kuma.io/docs/2.4.x/production/cp-deployment/multi-zone/) by the Kuma documentation. The connections are encrypted using [mTLS](https://kuma.io/docs/2.4.x/policies/mutual-tls/). The workloads are connected via [Kuma DNS](https://kuma.io/docs/2.4.x/networking/dns/). The data plane is [based on Envoy proxies](https://kuma.io/docs/2.4.x/). + +Find the deployment files and related deploy scripts in the [Kuma folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/kuma) of the project’s repository. + +The Kuma multi-zone scenario requires a separate [global control plane](https://kuma.io/docs/2.4.x/production/deployment/multi-zone/#components-of-a-multi-zone-deployment) to be deployed, which was done as per the instructions from "the Universal on Kubernetes using Helm" tab. However, we modified the scenario to use [in-memory database](https://kuma.io/docs/2.4.x/documentation/configuration/#memory) instead of Postgres. Despite this configuration loses data on restart, it is a great solution for performance testing. + +## NSM + +We are currently using NSM v. 1.11.1 set up as an [NSM 2-cluster scenario](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/interdomain). The connections are encrypted using Wireguard, and the workloads are connected via NSM [vl3 DNS](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/features/vl3-dns) in a flat [vl3 network](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/features/vl3-dns). The data plane is based on the VPP framework. + +NSM’s feature is that it works at the network level, so while other service meshes handle HTTP requests, NSM processes TCP/IP ones. Nevertheless, it provides flexible application communication, encryption and DNS capabilities, in other words, it has all the functionality that is required for this performance testing. + +Find the deployment files and related deploy scripts in the [NSM folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/nsm) of the project’s repository. + +## Testing scenario + +The general test script is as follows: + + - Deploy service mesh components, wait for all components to report as ready; + - Deploy test workloads, wait for all of them to report as ready; + - Connect to Fortio using the kubectl port-forwarding; + - Use Fortio REST API to run tests; + - Run a warm-up test, discard results; + - Run the test one more time, save results; + - Delete/cleanup all resources; + - Iterate all of the above a specified number of times. + +Fortio requires you to set a target QPS (queries per second) and either the total amount of queries, so the test duration will vary, or the test duration, so the number of queries will vary. For our scenario the duration was set to 1 minute, which we considered to be enough to capture intermediate performance drops if there were any. Moreover, we experimentally determined that one minute was sufficient to collect enough data to calculate the required percentiles. + +During the initial testing, several QPS values had been employed, but for the final test, the QPS was set to be 6000 to get a better representation of maximum performance. All tested systems in all of our test scenarios have demonstrated the performance lower than the target, which is due to the fact we have been running our tests without multithreading with all queries executed in a sequence, meaning we are limited by the latency between client and server. + +## Description of testing process + +For each test run, the statistics calculated by Fortio are obtained that include such metrics as the average number of requests per second, minimum/average/maximum latency and several latency percentiles. For testing we have 2 environments and 3 service meshes. We use mean positive values for analysis. We check that the sample has no deviations from the mean values. + +The following key metrics were selected for comparative analysis of the performance test results: + + - Average QPS, HTTP requests per second; + - Average latency, ms; + - 90th percentile, ms; + - 99th percentile, ms; + - 99.9th percentile, ms. + +Such metrics as the minimum and maximum latencies are excluded, because they can be affected by single outliers. The average latency is interchangeable with the average QPS, but while the first is useful to compare it to the percentiles, the second enables one to understand the overall throughput. The Kubernetes [metrics server](https://github.com/kubernetes-sigs/metrics-server) is used to monitor the container CPU load to make sure that each container in a cluster is either well below the CPU limit or doesn't have a limit at all. + +In this paper, we consider the results obtained for 2023-11-14 (AWS EKS) and 2023-11-16 (Equinix Metal). The summarized test results can be found in [this Google Sheet table](https://docs.google.com/spreadsheets/d/10A_UrzczgT2GbzbBoAvTHxYrErfv16JBcH-H2DvTLcw/). + +## Results for AWS EKS clusters + +The average QPS and latency values for these clusters as well as their latency percentiles are summarized in Table 1 and Fig. 2 and 3: the highest performance was obtained for NSM vl3, the second for Kuma and the third for Istio. For this parameter, the difference between NSM vl3 and Istio was almost 2.7 times and between NSM vl3 and Kuma 1.5 times. What was even more interesting was the difference between Kuma and Istio, which was 1.8 times in favor of Kuma. This was strange because both meshes use Envoy for data transfer, so we had expected them to demonstrate similar results. + +The obtained latencies were another metrics worth considering (see Table 1, Figure 3): while Istio and Kuma had similar behavior for the 90th, 99th and 99.9th percentiles (their 90th percentile was close to the average latency, the 99th was significantly higher, and the 99.9th percentile was about 2 times larger than the 99th percentile), NSM vl3 demonstrated another behavior, so its 90th and 99th percentile were close to the average latency, and only the 99.9th percentile exceeded it significantly. + +The data for the 90th and 99th percentiles showed that NSM vl3 provided a more stable latency. For NSM vl3, the likelihood to get a query 1.4 times slower than average was 1% and to get a query 3.3 times slower than average 0.1%. For Kuma, this likelihood was for 3.8x- and 8.2x- slower queries, respectively. For Istio, this likelihood was detected for 2.9x- and 5.4x- slower queries. + +Hence in AWS EKS, Kuma and NSM significantly outperformed Istio for average QPS and for latency in all percentiles (90, 99, 99.9). Kuma was significantly faster than Istio in terms of average QPS, and but had similar latency behavior for the slowest requests. + +| AWS | QPS | Average latency | P90 | P99 | P99.9 | +| --- | ---: | ---: | ---: | ---: | ---: | +| Istio | 496.08 | 2.01 | 2.54 | 5.88 | 10.85 | +| Kuma | 886.37 | 1.13 | 1.30 | 4.28 | 9.33 | +| NSM vl3 | 1,332.38 | 0.74 | 0.84 | 1.04 | 2.45 | + +*Table 1. Test results for the AWS EKS clusters.* + +![AWS EKS average QPS comparison](/img/blog/2024/01/11/Fig2.png) + +*Figure 2. Average QPS for the AWS EKS clusters.* + +![AWS EKS latencies comparison](/img/blog/2024/01/11/Fig3.png) + +*Figure 3. Average latency and latency percentiles for the AWS EKS clusters.* + +## Results for Equinix Metal clusters + +The average QPS and latency values for these clusters as well as their latency percentiles are summarized in Table 2 and Fig. 4 and 5. The average QPS value was highest for NSM vl3, so the difference between NSM vl3 and Istio was 2.7 times, and between NSM vl3 and Kuma 1.13 times. Kuma turned out to be 2.4 times faster than Istio. If compared to the AWS EKS environment, the relative difference between NSM vl3 and Istio maintained in the Equinix Metal clusters as well, while Kuma reduced its gap with NSM vl3, and increased the one with Istio. + +Another interesting observation was that Kuma and NSM vl3 had similar percentile statistics: their 90th and 99th percentiles increased weakly if compared to the average latency, and the 99.9th was significantly higher than the 99th. Istio had a higher average latency, but it varied little up to the 99.9th percentile (see Table 2, Figure 5). + +Hence in Equinix Metal, Kuma and NSM significantly outperformed Istio both for average QPS and for latency in the 90th and 99th percentiles. Kuma and NSM had similar performance for average QPS and latency in the 90th and 99th percentiles, with a slight advantage towards NSM. As for the 99.9th percentile, Kuma was more likely to have slow queries (2.5 ms against the 0.2-ms average). + +| Packet | QPS | Average latency | P90 | P99 | P99.9 | +| --- | ---: | ---: | ---: | ---: | ---: | +| Istio | 1,864.44 | 0.53 | 0.57 | 0.68 | 0.95 | +| Kuma | 4,538.77 | 0.22 | 0.25 | 0.29 | 2.55 | +| NSM vl3 | 5,148.70 | 0.19 | 0.24 | 0.29 | 1.04 | + +*Table 2. Test results for the Equinix Metal clusters.* + +![Equinix Metal average QPS comparison](/img/blog/2024/01/11/Fig4.png) + +*Figure 4. Average QPS for the Equinix Metal clusters.* + +![Equinix Metal latencies comparison](/img/blog/2024/01/11/Fig5.png) + +*Figure 5. Average latency and latency percentiles for the Equinix Metal clusters.* + +## Conclusion + +The tests found big performance differences for the service meshes investigated in cross-cluster scenarios. In both testing environments, NSM vl3 showed the highest average QPS for cross-cluster connectivity scenarios. In comparison with Kuma the difference was 1.5 times on AWS and 1.13 times on Equinix Metal, in comparison with Istio the difference was 2.7 times in both environments. Kuma turned out to be 1.8 times faster than Istio in AWS, and 2.4 times faster in Equinix Metal for cross-cluster connectivity scenarios. This significant difference became a surprise to us, since both meshes use Envoy for data transfer, so we had expected their performances would be similar. Further research is required to understand the reasons for this difference. + +Kuma’s better relative performance in the Equinix Metal environment may be explained by the different technologies for providing external services, but this assumption also requires additional investigation. To do so, we plan to add a heavy load test scenario to test our hypotheses about the relationship between performance and environment. + +## About Us + +We are developers at Pragmagic Inc. with sufficient experience in implementing CNCF projects. +Your feedback, whether positive or negative, is deeply appreciated, so feel free to contact us via nsm@pragmagic.io. + +## Authors + + - Danil Uzlov, Software Engineer at Pragmagic Inc, https://pragmagic.io/ , nsm@pragmagic.io + - Denis Tingaikin, Technical Lead at Pragmagic Inc, https://pragmagic.io/, nsm@pragmagic.io + - Daniil Efremov, Director of Engineering at Pragmagic Inc, https://pragmagic.io/, nsm@pragmagic.io + \ No newline at end of file diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 00000000..e02c9e2d --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,4 @@ +--- +title: Blog +--- + diff --git a/layouts/blog/section.en.html b/layouts/blog/section.en.html index 42dce13a..6742a98c 100644 --- a/layouts/blog/section.en.html +++ b/layouts/blog/section.en.html @@ -3,5 +3,6 @@ {{ end }} {{ define "main" }} -

Blog

+{{ partial "hero.html" . }} +{{ partial "blog.html" . }} {{ end }} diff --git a/layouts/blog/single.en.html b/layouts/blog/single.en.html new file mode 100644 index 00000000..722df59c --- /dev/null +++ b/layouts/blog/single.en.html @@ -0,0 +1,8 @@ +{{ define "title" }} +Network Service Mesh events +{{ end }} + +{{ define "main" }} +{{ partial "hero.html" . }} +{{ partial "article.html" . }} +{{ end }} diff --git a/layouts/partials/blog.html b/layouts/partials/blog.html new file mode 100644 index 00000000..5c6eb074 --- /dev/null +++ b/layouts/partials/blog.html @@ -0,0 +1,21 @@ +{{ $paginator := .Paginate ((where site.RegularPages "Section" "blog").ByDate.Reverse ) }} +
+ {{ template "_internal/pagination.html" . }} +
+
+
+ {{ range $paginator.Pages }} + {{ .Title }}, + {{ .Date.Format site.Params.dateFormat }} + {{ if isset .Params "announce" }} +
+ {{ .Params.announce }} Read more... + {{ end }} +

+ {{ end }} + +
+
+
+ {{ template "_internal/pagination.html" . }} +
\ No newline at end of file diff --git a/static/img/blog/2024/01/11/Fig1.png b/static/img/blog/2024/01/11/Fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..83e57b5b4e616d53cc53b2c95fc991e564351bca GIT binary patch literal 15550 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 literal 0 HcmV?d00001 diff --git a/static/img/blog/2024/01/11/Fig2.png b/static/img/blog/2024/01/11/Fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..36215f2af894dafdf18f2e9e777669238636462c GIT binary patch literal 1896 zcmYjSc|6pK8~!4Ut1&~;#Ex5$I~fuhSFDB(X>&_R$Y2;IX9gpQoT-d1E#n;bErwdh zM(nuHF(Vn;$vtG&w!hzJ_n-H9Kkq;9^LgImA=sfTMFe4j004+sT`;>009@#UJQ>7u z5bxlUw-3PF&gQB)hr?m9SUNg7bUK}vmzT|EM@2;;@#`22roX?RL?VrjjuHrj%*@RC z`g%o0MIw>d)z#(c>4`$295OZ>9&h|Mxi?2t-2ni;X)CkySFz(O&sQQ|A%yXdDw&Xd z;JDY;z6K_GR5WAYcV-5nv)Z5yNs`+!mmph-nJ7RBW^(Ble!$>JMx~z!aQzxkkXv_D zA|@}c2CZFZJnIbPa=CeiB6L^fbb0S|z8=T=eZt-Zef05UKmaHX_%Knqc<6*9pZKsc zC5!G8=sRf|zD5MIu77V8&A&WP5df6(dn)gwidp)nfE5#$L9v~&1V8(oA%2?C$@yw6 zBm0FuASIbOEzuFIlUb^=;d!b+Ehp%5P-`~KIVuEo&qG~@O{q6+ueCWZlOyCzJLxh5 z?Wnpk{0_}mfB*)hAiwZ{N;V<0hl6mlbxV<_1N!e(OFfHa005}Oy|CR~8_2b<7LX(z z0ca(dLeH-OVM179{!ss=N+ZISZ!&XEU&5_$_%Y$_O7{}t%SXb~31K5iJ+CW8rH40e z_@!76n1cRQ~E;p(za!};3-elGs8(v*%$jmyCAcURO)ydA}9Y)=~U;WR*iFU zOETLYlw;=xZVv`D$*O9yP~7VkK3>{XR9!@gO6a^Jw~?g75)*l==mEG1&An+wcFfX$ zn+pyF>pf6=|Kv&O5HT?jvUJWJQxsq3m18g*Y1sDjfCg4$+~BI9~ynDue&S%zJ=2+wMM} zL%}#*yTLm1by?szX_U%hRl^@W3u+kfH-sky9+^^d^#mhQYlbFVb{boSFba#5^e5jN z(6{tqaO(!@n>g934U3D6#a0_)QVZRS6xK^snKqnchAz~q;ol1*2wOKM5~$T0y21XT zB6q_~iQE&ptfgsLo7oWW$x!s~;|PX-Q{mpU&5M9-|3#mYl&Uikwfs#@Ev9+r!2Tf?+_+5|J?`4S@@^uDv)xTudbF@z zr?8roAS}nt<@?57fYnMl33IR(=S0zy18e2TIQ9pM?QhbXtFiGGb- zJbgP`Dq5a3cFYpEEn1;aM4KWk#(v;ZjRjgh72~%@oaqO>_vr+V_&ho6#4hb0GXH0` zw_Bp`IyEE2(pz3MCx`)N`*DkQ_hOIwl~N|;fk0BLaf6Sk-p+yoN_9K|Lj9# zvu*jj15c2zKJ@J+HDvP@<9rFkORT~wLm!0xC0OupvC3P^<#35)V|ADKe`Wi@l*3Kh z3o9>;-)`Ch8_A=J0*2XHK9|}>xhQiLgk^qMvnc2LIkGJQ+-N5q_oor*erNK2b7e5Ro>)r=W$SG4?&7}gyR4gR{?(kyH6XU1fb>b&aQCuyg?v!Di zASTyyYCK$4xQl4gNz1V@UA|qaCLnPYhS{6$k7I};nubE^g_s*jJ-hd{>DEpoVeja3 z{lxe`vk1L;SN`6Q{qe{nvQaxNreh7+%FzFgNuy~2H&wP|{=Z+pF1_FlGblTL8Zx;0 z=0VlB6=6&8bIXm)>;mjc82h$=%X%P#KVp3#{HpD3>OgSYkmE$e(wv_<5g+oSNa)*l zN1m%beERd$&tUJyW{ri}2?7!(!D%EPhaTW1lPq zZ*(v;ecr38OWPLuvh9)OY;Y~h?;9DnL`%s-hhWxW4|V!mXO`AXNaHQ*Xp4SCqrrc? dDgENfWOB9}kwb(wNkx%Pl1(`@GloUu z5NgyIXF>)erb1#un;gTuYgFI2-{1GW@B4l0k7wP_{anv|-OqL3>-qiG6^G-8MTBI8 zU@(}7t&Nov3i-_mfG9f!@|OJb#*Ng zzfM}}eXHG+kdW~H!^oGJX#fB+GBV1`%O5{}OrzCLopJy&=2z)^R|lW3b~(qA7llK< zOhR0-wpIt7BUqoa2g5%Yidm;QtB2*)WVE$$xf7-~`uc`jALsICm-qRz82jT#v(u3l z+r%ukDE{&9hDaqVv;ZtY8D>MAI|Ngp`l@Eg3VnjZ(6HZ$QZ@CD=;7?_zbaB&ZybL0 zgvcMqnkKqJJ`r4XC@%91`+n@d6JyXub=wy#}Rw*7rTXYQI1Nt*WXO2xd=EU z9WkkoPJewb$GltNpihT``D-)5g>Cwb#{L|ZG>LeKEZ7sK-LUfH80+;p*N@JQ!YPcC z8Sh(aJc{JOG&-kxGyWo9j;PJ6sVIUClceW)_6A^o+=bYuNtoL$TcS`?>;Mx$WPmxz;_Z0?Qw z9#(v`bZ!+xBoZ|qO|GfV{gHp-{YmB=>GHfH6#61BE&U5De3qD z?zXp8!6JU=qqm5BcXh4&++Wz)I2cH?on`ahSpEgYK<)E#|2Ty%yjhsgVhFD)AlBDu zFm2TOMTeEOPNEzo?O^E$b3M2%b-YtEn(dZYHFWgwW~E+3;&9qtw)yL1BNL+_Z$b8( zc9JOU-Q>zOIgv!yO7Bkn2=v}(t{B|){41I_k&&pNvbPdWXt!&H!lx6$c)a6Rj;>sB zFClJ^>oLCN_Ms&jXG9i!mGLg$O8xLvB8hHr0HoB+pcI`h5tFLUe13oSK+0<5Bw^a0 z+vRyE$IQQdmsM)XUrZB;kIh`aFA{Hbo$u)H(#T#p`vAneObPJn?4KI(kX)wR{M{o; zeUd>p@O|Ng^v;`qZ;Ze#60{;RV^`!dTf(@NHLSQmir)+K_a!6iM1HUSwSJ zONddgjP+YDTQ7U0VQ-auZHw7)oP(V=CDry)hBLLe{q9pTMaV@l-_toZ9b9F$f-FEB`ZmQQQR`P2wk5XI`?W{!_bT|UApQpa=9Fg8p# zZN9ZC@Yfgi-->VpqAAZcFg5Q6lfU7{-jG_X)77zc=Cwn~V{ZQURK9f4iA?BmEN**^+;^iV%Tg2T+@x+AsNu}s0#LhkF-OX3VXLNPyVG!>y9N~+&~hm@u0A8 zM)r&Fl~iEA@OGRZ@wp8(uB2>Fo0+7rYc!*K{kq;D+@c&NCgb`EXNzS-8G?j|N%Dv< zTbpy#FwFuQpai`j(nczp0;s6~3QsDB`ShbA&hTMdnzkd%XDenmncWA}+&Fmf^K@W< zC(`Ni zW7fyAojbri$C2a3#c{FkiDE@5{y~E&=sGRw9-*%x-AwI}An@;o=jZRyULOaJqVjI^O#;1)+TQislmEe4*c%R10=6z+woR;77i>|`(ZgE!}Y)W9FZvv9R6Hyw zv)5shm#_VD^a5A_?;12#f96b9;en|>qkS<{(;#Oe zAK^*3Gn6w%Q+3ygLl3os%Y(a{eB$hq1?S>@V3IvjCiE=Fw#d;dI7j3!jGg;%4RFTJ zp3H+n12Qz5J4N!JaP61%|H6lNC~H6(phameqc@@jWllCTUNaPc;}JiZxq7`gAyyJgE6&xUr!*R1Ol|%t>ZMt0pq#$(^eWnTt7t%+~j3 z5(71$;)p6S=f2ghz3RZbg(xuRcAI1c)g=O*p93p0A)<|HK(2gV>3$TkPwFZM2;`vX zA6iTXSHgHT;RV_NgzFC;`Pm5B?SJc<^5X9Stp78dnI^&MD~`MlZ5X2SG6;tM48M`i zKTZ0eK3dy2lN#cCo}3Q44rAv`+$TE(ZD1KgzBA-CKUafrBFif?t2PH{c1t!X#!TQx za@c1wachR4f}l1WT%#>;aX3j**d4Yo_Qq~|t&gdu?43?l^aEpBX7j$Db|RpC(&=Y(Qo z)=Y(Gkeh_bi&#{xj})?W_>Xy?{wM)qWGM~aT3QePX%G{~WRI4((Fn7YzOd45ZY9`w z0R-?p4iBRfSeL+a#Q$ygyb#YJaNCOm1*SovUNJRz4rXP-{D{eD?3uj)Hi*y)`GN>q zdc2hl{C^L(Ly@HqYA?;(14+d$r8L$q@;GWC=8m@sN}Lo7td-1-dt#>$7^~>%y^PT4 z-;TFlrmZYzQ?P4zpbKwR(WT!rt5&)W3z!KZ2YNU8@d=aj*dQa|z{jU?0+@OiFDond zm{FksvNQ#2P0zijg^fq^k*c>9o^_?cNn4o3&1df-AX;PxNL!&mnOs!*euS9q2ZqL)aVeq^DCr%P27Afu6BkHSh)YAea>0& zkKDang30jV`V`+zcX~u{Nu%GDzrT4x5_>B*6>1-;4QTQ4bu01Z-fa=Zkm_?$rn`Kdj4YFi+{1_)~$fX&nsnwv{3SW n|C2S+)$RD?fAuu|dXZnqHE(j;?q)UU?+#{becXy-flc@aLBPwp literal 0 HcmV?d00001 diff --git a/static/img/blog/2024/01/11/Fig4.png b/static/img/blog/2024/01/11/Fig4.png new file mode 100644 index 0000000000000000000000000000000000000000..07c340e40a8249691d7b8b86dbde998d536b1a7e GIT binary patch literal 1857 zcmYjSdr*^i7X83Tcoa}}T_}%6l!xvLs00v^CXfK7fj|(I1$lIF5s-kzRTRaKjcd`! z8!KRhfMp>(BeEDOg;=mWG{iwdKmic}lLliXF)<&6?^m?bnVmUv?wLFHk9+UTz2|B; zHOSQ1+8BZ$)8Mbj5fG#Yuj^vN4eLAsSohY0e|Sh_005w(qC%liEG{l$Fc<_uU>Nql z{QmUm(*l8j$z(P*Haa>w@_0Nv9xoP)A3l6|?AS3Xm3pL1eWX-9Jgw8zBwIm{!Tn&e zU*y^6@~WxqmK~ceTZR`~kVU>Kl)K;Z?1RF}A1lOf9Zt+xu}HsW(EcJl4l!@<_ye5o zI#zGXJ9XTl-Ou!(qn>lMEvpkRs@+(LhI^(o3;vlWD!;2(3!CRQ89)hNsx8!U=uGzB z`MCwgh6K{gRZWkUPF z(P9scf5z!cdH2qKvd5&^AeVN8_4#;qSd>;`eRj+U^z3Nb@KS`A*QQ1uobq#N*+A#= z{N1MhIX<}pV~RyxUP2hkw`MB(J_ph?any&qPIZfBJdv?%&O?+`6)341O_w`Kr8(l0 z7O>{_w|1mK&FB|CQcYr-thI`s`14!wPtEqTHscjcI386;4!ENm?@TFZg9A%7%({&M zC!`D-_JLUMj(J;Htt9H0hpVBv{4og|IHClt^rZsSM#~2ba2y1M z^N{mp$t~r7do8R|W-u>YF`R43iCKCH%#B7$!9J{moEny15Rx&>9}u@?-XkIm{^<1n zlD`(?>C3%8Zf`Snc^SEO91Y!Enly4;J{3LU`{+PmsUz^Z8CZah4KHSW094YlBS)Xs zk+pmaaEwyCS?Uk%LgWMf(d%qq+uWL}EZTVWA|Ynfv&Bq~JK-@nDe@7(^ytI3g?}p8 z@8#O=t;~u6!A(s`lxHJ5VH-xC`FTvl%w#75pCm?_Qg}@s_i*j_0AiZBBz4sVebX7j z;?l4A6fF_9DCbh$$_zbFI za7hbW*IAdo;wdd3m>{#~fx5l{@bh8z1q-4rrsA`CFrpjubI@~FvEz9t5nXtq_EJh# zR6fzKRF+C-IKm!QI&b-12>BN|_nvJ<_<`^c=)7ORhjM93*dBHt1@S`!VQ(B(@8Ok& zX^Q@U-wGKmR~7Xug+`d-;d=YYNSuLHJcUjEX?-I}fB-vSsr8+4WJDey(& zg|q!n+VlxZoWJV=9E2WBG7rAEUs*1sF2EF&?c}ie)B=0u%Tj`bzYzAR%Qk`vF=4|c z#z+~Vv6!&Vp8&#m@BP+_jP@e@GylG#i|;0`T;*Fqn`#8x$~GEocz~zH+=toK<_vHH~s~o-G4nlcwL5toeriF zBa(BbzBbK2jCu+dU{ly9$}pk9Z^f*5Z-Nv9Df7?$2fDMZQpcSu!nf{mGRq}0cf~`p zHO*STs0;+?_7qWcTyE^h*iS@uKV|?tM!NlSckXL;-+INuQW_}hsm0~|L&wi2yz zwK~x?EK)gK1QxR%nZMVp7BN^Mz9j@9>a23#qMWycxb5C%d2TJSDKZ}f9%bFi({=Y je{GF=RsNs#%yM7|UwQPKnu}`nx+g-x0aS9Ee*)t-wrk)L literal 0 HcmV?d00001 diff --git a/static/img/blog/2024/01/11/Fig5.png b/static/img/blog/2024/01/11/Fig5.png new file mode 100644 index 0000000000000000000000000000000000000000..37eef7b94c15d4b3b177613ba73f360c0a672851 GIT binary patch literal 3425 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 literal 0 HcmV?d00001 From fbd1ec8b9da9335de64d7be679b72a011fe471b9 Mon Sep 17 00:00:00 2001 From: Ivan Osipov Date: Mon, 15 Jan 2024 12:47:31 +0400 Subject: [PATCH 02/12] Fix typo Signed-off-by: Ivan Osipov --- layouts/partials/blog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/blog.html b/layouts/partials/blog.html index 5c6eb074..7114df7d 100644 --- a/layouts/partials/blog.html +++ b/layouts/partials/blog.html @@ -18,4 +18,4 @@
{{ template "_internal/pagination.html" . }} -
\ No newline at end of file + From a0dfbc43545fed8bf267f5ebeff2af2c1ad7671b Mon Sep 17 00:00:00 2001 From: Ivan Osipov Date: Tue, 16 Jan 2024 11:35:28 +0400 Subject: [PATCH 03/12] Add news and blog sections to the main page Signed-off-by: Ivan Osipov --- assets/sass/news-section.sass | 23 ++++++++++++++ assets/sass/style.sass | 6 ++++ layouts/index.en.html | 2 ++ layouts/partials/home/news.html | 19 ++++++++++++ layouts/partials/home/recent-blog-posts.html | 32 ++++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 assets/sass/news-section.sass create mode 100644 layouts/partials/home/news.html create mode 100644 layouts/partials/home/recent-blog-posts.html diff --git a/assets/sass/news-section.sass b/assets/sass/news-section.sass new file mode 100644 index 00000000..f87a95fb --- /dev/null +++ b/assets/sass/news-section.sass @@ -0,0 +1,23 @@ +$news-section-padding: 0.5rem 1.5rem !default +$news-section-padding-medium: 1.5rem 1.5rem !default +$news-section-padding-large: 3rem 1.5rem !default + +.news-section + padding: $news-section-padding + // Responsiveness + +desktop + // Sizes + &.is-medium + padding: $news-section-padding-medium + &.is-large + padding: $news-section-padding-large + .news-header + overflow: hidden; + white-space: nowrap; + display: flex; + .news-title + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .news-link + padding-left: 0.75rem; diff --git a/assets/sass/style.sass b/assets/sass/style.sass index b82cb6ca..8f8e2419 100644 --- a/assets/sass/style.sass +++ b/assets/sass/style.sass @@ -56,6 +56,7 @@ $tabs-link-active-border-bottom-color: $dark @import "syntax" @import "header-link" @import "override" +@import "news-section" .is-borderless border: none !important @@ -130,3 +131,8 @@ ul.pagination padding: 10px; display: flex; justify-content: center; + +.rounded-tag + width: fit-content; + border-radius: 1rem; + padding: 0 1rem; diff --git a/layouts/index.en.html b/layouts/index.en.html index cf0f9fba..c1807060 100644 --- a/layouts/index.en.html +++ b/layouts/index.en.html @@ -1,8 +1,10 @@ {{ define "main" }} {{ $subtitle := site.Params.subtitle }} {{ partial "home/hero.html" . }} +{{ partial "home/news.html" . }} {{ partial "home/what-it-is.html" . }} {{ partial "home/use-cases.html" . }} {{ partial "home/how-it-works.html" . }} +{{ partial "home/recent-blog-posts.html" . }} {{ partial "home/cncf.html" . }} {{ end }} diff --git a/layouts/partials/home/news.html b/layouts/partials/home/news.html new file mode 100644 index 00000000..61335283 --- /dev/null +++ b/layouts/partials/home/news.html @@ -0,0 +1,19 @@ +{{ $lastnews := index (where site.RegularPages "Section" "blog").ByDate.Reverse 0 }} + +
+
+
+
+
+ Latest news +
+
+ +
+
+

{{ $lastnews.Title }}

Read more -> +
+
+
+
+
diff --git a/layouts/partials/home/recent-blog-posts.html b/layouts/partials/home/recent-blog-posts.html new file mode 100644 index 00000000..a008dba9 --- /dev/null +++ b/layouts/partials/home/recent-blog-posts.html @@ -0,0 +1,32 @@ +{{ $posts := (where site.RegularPages "Section" "blog").ByDate.Reverse }} +{{ $maxposts := 4 }} + +{{ if gt $posts.Len 0 }} +
+
+
+
+

+ Recent blog posts +

+ +
+ + + + +
+ +
+
+
    + {{ range first $maxposts $posts }} +
  • {{ .Title}} + {{ end }} +
+
+
+
+
+
+{{ end }} From c48de00597bb015d918b71d56f1579908d411d28 Mon Sep 17 00:00:00 2001 From: Ivan Osipov Date: Tue, 16 Jan 2024 15:57:56 +0400 Subject: [PATCH 04/12] Update news link Signed-off-by: Ivan Osipov --- layouts/partials/home/news.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/home/news.html b/layouts/partials/home/news.html index 61335283..693e626a 100644 --- a/layouts/partials/home/news.html +++ b/layouts/partials/home/news.html @@ -11,7 +11,7 @@
-

{{ $lastnews.Title }}

Read more -> +

{{ $lastnews.Title }}

Read more...
From a99f7319be0266afc59bf2b8d547964f7320253a Mon Sep 17 00:00:00 2001 From: Ivan Osipov Date: Wed, 17 Jan 2024 17:15:19 +0400 Subject: [PATCH 05/12] Address review comments Signed-off-by: Ivan Osipov --- assets/sass/blog.sass | 4 +++ assets/sass/style.sass | 1 + ...-01-11-testing-service-mesh-performance.md | 1 + layouts/blog/single.en.html | 4 +-- layouts/index.en.html | 1 - layouts/partials/blog/article.html | 30 +++++++++++++++++++ layouts/partials/blog/hero.html | 9 ++++++ layouts/partials/blog/toc.html | 7 +++++ 8 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 assets/sass/blog.sass create mode 100644 layouts/partials/blog/article.html create mode 100644 layouts/partials/blog/hero.html create mode 100644 layouts/partials/blog/toc.html diff --git a/assets/sass/blog.sass b/assets/sass/blog.sass new file mode 100644 index 00000000..fe37330d --- /dev/null +++ b/assets/sass/blog.sass @@ -0,0 +1,4 @@ +.blog-section + .content + p + text-align: justify; diff --git a/assets/sass/style.sass b/assets/sass/style.sass index 8f8e2419..cd45d0a8 100644 --- a/assets/sass/style.sass +++ b/assets/sass/style.sass @@ -57,6 +57,7 @@ $tabs-link-active-border-bottom-color: $dark @import "header-link" @import "override" @import "news-section" +@import "blog" .is-borderless border: none !important diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md index 7950b122..f9bc4ae3 100644 --- a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md +++ b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md @@ -2,6 +2,7 @@ title = "Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM" date = 2024-01-11 announce= "This article may be useful for those who are aware of service meshes and probably trying to improve scalability and connectivity between applications in Kubernetes and other container orchestration systems, e.g., adding encryption and authorization for application connections." +showToC = true +++ # Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM diff --git a/layouts/blog/single.en.html b/layouts/blog/single.en.html index 722df59c..4bccbeea 100644 --- a/layouts/blog/single.en.html +++ b/layouts/blog/single.en.html @@ -3,6 +3,6 @@ {{ end }} {{ define "main" }} -{{ partial "hero.html" . }} -{{ partial "article.html" . }} +{{ partial "blog/hero.html" . }} +{{ partial "blog/article.html" . }} {{ end }} diff --git a/layouts/index.en.html b/layouts/index.en.html index c1807060..c8b6d7dc 100644 --- a/layouts/index.en.html +++ b/layouts/index.en.html @@ -5,6 +5,5 @@ {{ partial "home/what-it-is.html" . }} {{ partial "home/use-cases.html" . }} {{ partial "home/how-it-works.html" . }} -{{ partial "home/recent-blog-posts.html" . }} {{ partial "home/cncf.html" . }} {{ end }} diff --git a/layouts/partials/blog/article.html b/layouts/partials/blog/article.html new file mode 100644 index 00000000..6d5a0e2c --- /dev/null +++ b/layouts/partials/blog/article.html @@ -0,0 +1,30 @@ +{{ $toc := .TableOfContents }} + +
+
+
+
+ {{ if eq .Params.showToC true }} + {{ with $toc }} +
+ {{ partial "blog/toc.html" . }} + +
+
+ {{ end }} + {{ end }} +
+ {{ .Content }} +
+
+ + {{ if eq .Params.showToC true }} + {{ with $toc }} +
+ {{ partial "blog/toc.html" . }} +
+ {{ end }} + {{ end }} +
+
+
diff --git a/layouts/partials/blog/hero.html b/layouts/partials/blog/hero.html new file mode 100644 index 00000000..17a30195 --- /dev/null +++ b/layouts/partials/blog/hero.html @@ -0,0 +1,9 @@ +
+
+
+

+ {{ .CurrentSection.Title }} +

+
+
+
diff --git a/layouts/partials/blog/toc.html b/layouts/partials/blog/toc.html new file mode 100644 index 00000000..a81b4b91 --- /dev/null +++ b/layouts/partials/blog/toc.html @@ -0,0 +1,7 @@ +
+

+ Table of contents +

+ + {{ . }} +
From 9dc4a8e8f1662373e7905406c45c7fd69f6cb9b2 Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Thu, 1 Feb 2024 18:10:52 +1100 Subject: [PATCH 06/12] some blog changes Signed-off-by: Nikita Skrynnik --- config.toml | 2 +- ...-01-11-testing-service-mesh-performance.md | 189 +----------------- layouts/partials/blog.html | 2 +- 3 files changed, 4 insertions(+), 189 deletions(-) diff --git a/config.toml b/config.toml index 6430b1a0..bd98f584 100644 --- a/config.toml +++ b/config.toml @@ -41,7 +41,7 @@ weight = 4 [params] twitter = "nservicemesh" fontawesomeversion = "5.8.1" -dateFormat = "2 January 2006" +dateFormat = "02.01.2006" subtitle = "The Hybrid/Multi-cloud IP Service Mesh" description = """ diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md index f9bc4ae3..6b290460 100644 --- a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md +++ b/content/blog/2024/2024-01-11-testing-service-mesh-performance.md @@ -7,191 +7,6 @@ showToC = true # Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM -## Introduction +Have you ever wondered how different service meshes perform in dual cluster scenarios? -This article may be useful for those who are aware of service meshes and probably trying to improve scalability and connectivity between applications in Kubernetes and other container orchestration systems, e.g., adding encryption and authorization for application connections. - -Imagine your business is growing, so one Kubernetes cluster gets too much traffic and becomes overloaded, in other words it is no longer enough. As a result, you need more resources and in a short period of time. You also might need to meet new requirements and improve fault tolerance or isolate application resources for security purposes. - -Since different service meshes have similar basic functionalities, and most of them support multi-cluster scenarios, they are a useful tool in addressing the described problems. - -How do service meshes affect performance? There are [several](https://medium.com/elca-it/service-mesh-performance-evaluation-istio-linkerd-kuma-and-consul-d8a89390d630) [papers](https://layer5.io/resources/service-mesh-performance/analyzing-service-mesh-performance) comparing service mesh performance, but none says much about their application in a multi-cluster scenario, so the purpose of this paper is to provide an objective and reproducible testing process to compare the performance of selected service meshes in a dual cluster scenario. During the testing process, an optimal configuration is to be chosen for each service mesh to avoid a negative impact on the performance. - -## Relevance - -Many Kubernetes users employ such service meshes as Istio, Kuma or Consul. Since scaling is a mandatory requirement of any modern web application or service that allows one to increase performance under high load, this article covers cross-cluster scaling with different service meshes from the standpoint of their performance. - -## Goal - -The goal of the article is to assess the performance of different service meshes in the industrial scenarios using more than one cluster. - -## Formulation of the Problem - -The main problem of such assessment is providing reproducible, consistent and objective tests for service meshes in a multi-cluster topology that exclude any negative factors as an incorrect or non-optimal setup for a specific service mesh, network problems and resource availability. To do so, the following service meshes have been selected: - - - [Istio](https://istio.io/) - - [Kuma](https://kuma.io/) - - [NSM (Network Service Mesh)](https://networkservicemesh.io/) - -For deployment, the following cluster providers have been chosen: - - Equinix Metal, a highly performant cluster in terms of its hardware - - AWS EKS as the most common solution among managed clusters. - -## Setup - -For each working environment (AWS and Equinix Metal), 2 identical side-by-side clusters have been set up to employ the following testing scenario: - - One instance of Nginx deployment as a server workload; - - One instance of [Fortio](https://fortio.org/) deployment as a Nginx client; - - The client sends requests to the server. - -![General deployment diagram](/img/blog/2024/01/11/Fig1.png) -*Figure 1. General deployment diagram* - -This method was chosen as a first step in testing the performance of service meshes, and we planned to extend the experiments to more complex scenarios, so this paper covers the first step of our road map. So far, we have accumulated more than 1000 positive runs. About the same number of negative tests have been run to debug the environment and test scripts. The data collected this way enables us to say that the test scenario we have chosen has sufficient reproducibility and stability. - -## AWS EKS clusters - -The AWS clusters were set up using [eksctl CLI](https://eksctl.io/), each cluster consisting of a single node. The clusters were deployed on m5.2xlarge servers with the following parameters: - - - CPU: 8 vCPUs; - - Memory: 32 GB RAM; - - Network: up to 10 Gbps, MTU 1500; - - Location: us-east-1 zone; - - Load Balancer: ELB, Elastic Load Balancer. - -Find the cluster setup scripts [in the project’s repository](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/cluster-setup). - -## Equinix Metal clusters - -The Equinix Metal clusters were set using [clusterctl CLI](https://cluster-api.sigs.k8s.io/clusterctl/overview.html), each cluster consisting of 1 control plane and 1 worker node. The clusters were deployed on m5.2xlarge servers with the following parameters: - - - CPU: AMD EPYC 7402P, 24 cores; - - Memory: 64 GB RAM; - - Network: 2x10 Gbps network; - - Location: Dallas; - - Load Balancer: MetalLB, [provided by Equinix Metal](https://github.com/kubernetes-sigs/cloud-provider-equinix-metal#metallb-from-v0110-to-v0121). - -Find the cluster setup scripts [in the project’s repository](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/cluster-setup). - -## Istio - -We are currently using Istio v. 1.19.3 set up using instructions for [Multi-Primary on different networks](https://istio.io/latest/docs/setup/install/multicluster/multi-primary_multi-network/) installation. The connections are encrypted using [mTLS](https://istio.io/latest/docs/concepts/security/#mutual-tls-authentication). The workloads are connected via the standard [Istio multi-cluster DNS resolution](https://istio.io/latest/docs/ops/deployment/deployment-models/#dns-with-multiple-clusters). The data plane is [based on Envoy proxies](https://istio.io/latest/docs/ops/deployment/architecture/). - -Find the deployment files and related deploy scripts in the [Istio folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/istio) of the project’s repository. - -## Kuma - -We are currently using Kuma v.2.4.3 set up as a [Kuma multi-zone scenario](https://kuma.io/docs/2.4.x/production/deployment/multi-zone/) without the Egress component as [instructed](https://kuma.io/docs/2.4.x/production/cp-deployment/multi-zone/) by the Kuma documentation. The connections are encrypted using [mTLS](https://kuma.io/docs/2.4.x/policies/mutual-tls/). The workloads are connected via [Kuma DNS](https://kuma.io/docs/2.4.x/networking/dns/). The data plane is [based on Envoy proxies](https://kuma.io/docs/2.4.x/). - -Find the deployment files and related deploy scripts in the [Kuma folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/kuma) of the project’s repository. - -The Kuma multi-zone scenario requires a separate [global control plane](https://kuma.io/docs/2.4.x/production/deployment/multi-zone/#components-of-a-multi-zone-deployment) to be deployed, which was done as per the instructions from "the Universal on Kubernetes using Helm" tab. However, we modified the scenario to use [in-memory database](https://kuma.io/docs/2.4.x/documentation/configuration/#memory) instead of Postgres. Despite this configuration loses data on restart, it is a great solution for performance testing. - -## NSM - -We are currently using NSM v. 1.11.1 set up as an [NSM 2-cluster scenario](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/interdomain). The connections are encrypted using Wireguard, and the workloads are connected via NSM [vl3 DNS](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/features/vl3-dns) in a flat [vl3 network](https://github.com/networkservicemesh/deployments-k8s/tree/release/v1.11.1/examples/features/vl3-dns). The data plane is based on the VPP framework. - -NSM’s feature is that it works at the network level, so while other service meshes handle HTTP requests, NSM processes TCP/IP ones. Nevertheless, it provides flexible application communication, encryption and DNS capabilities, in other words, it has all the functionality that is required for this performance testing. - -Find the deployment files and related deploy scripts in the [NSM folder](https://github.com/pragmagic/service-mesh-performance-testing/tree/main/nsm) of the project’s repository. - -## Testing scenario - -The general test script is as follows: - - - Deploy service mesh components, wait for all components to report as ready; - - Deploy test workloads, wait for all of them to report as ready; - - Connect to Fortio using the kubectl port-forwarding; - - Use Fortio REST API to run tests; - - Run a warm-up test, discard results; - - Run the test one more time, save results; - - Delete/cleanup all resources; - - Iterate all of the above a specified number of times. - -Fortio requires you to set a target QPS (queries per second) and either the total amount of queries, so the test duration will vary, or the test duration, so the number of queries will vary. For our scenario the duration was set to 1 minute, which we considered to be enough to capture intermediate performance drops if there were any. Moreover, we experimentally determined that one minute was sufficient to collect enough data to calculate the required percentiles. - -During the initial testing, several QPS values had been employed, but for the final test, the QPS was set to be 6000 to get a better representation of maximum performance. All tested systems in all of our test scenarios have demonstrated the performance lower than the target, which is due to the fact we have been running our tests without multithreading with all queries executed in a sequence, meaning we are limited by the latency between client and server. - -## Description of testing process - -For each test run, the statistics calculated by Fortio are obtained that include such metrics as the average number of requests per second, minimum/average/maximum latency and several latency percentiles. For testing we have 2 environments and 3 service meshes. We use mean positive values for analysis. We check that the sample has no deviations from the mean values. - -The following key metrics were selected for comparative analysis of the performance test results: - - - Average QPS, HTTP requests per second; - - Average latency, ms; - - 90th percentile, ms; - - 99th percentile, ms; - - 99.9th percentile, ms. - -Such metrics as the minimum and maximum latencies are excluded, because they can be affected by single outliers. The average latency is interchangeable with the average QPS, but while the first is useful to compare it to the percentiles, the second enables one to understand the overall throughput. The Kubernetes [metrics server](https://github.com/kubernetes-sigs/metrics-server) is used to monitor the container CPU load to make sure that each container in a cluster is either well below the CPU limit or doesn't have a limit at all. - -In this paper, we consider the results obtained for 2023-11-14 (AWS EKS) and 2023-11-16 (Equinix Metal). The summarized test results can be found in [this Google Sheet table](https://docs.google.com/spreadsheets/d/10A_UrzczgT2GbzbBoAvTHxYrErfv16JBcH-H2DvTLcw/). - -## Results for AWS EKS clusters - -The average QPS and latency values for these clusters as well as their latency percentiles are summarized in Table 1 and Fig. 2 and 3: the highest performance was obtained for NSM vl3, the second for Kuma and the third for Istio. For this parameter, the difference between NSM vl3 and Istio was almost 2.7 times and between NSM vl3 and Kuma 1.5 times. What was even more interesting was the difference between Kuma and Istio, which was 1.8 times in favor of Kuma. This was strange because both meshes use Envoy for data transfer, so we had expected them to demonstrate similar results. - -The obtained latencies were another metrics worth considering (see Table 1, Figure 3): while Istio and Kuma had similar behavior for the 90th, 99th and 99.9th percentiles (their 90th percentile was close to the average latency, the 99th was significantly higher, and the 99.9th percentile was about 2 times larger than the 99th percentile), NSM vl3 demonstrated another behavior, so its 90th and 99th percentile were close to the average latency, and only the 99.9th percentile exceeded it significantly. - -The data for the 90th and 99th percentiles showed that NSM vl3 provided a more stable latency. For NSM vl3, the likelihood to get a query 1.4 times slower than average was 1% and to get a query 3.3 times slower than average 0.1%. For Kuma, this likelihood was for 3.8x- and 8.2x- slower queries, respectively. For Istio, this likelihood was detected for 2.9x- and 5.4x- slower queries. - -Hence in AWS EKS, Kuma and NSM significantly outperformed Istio for average QPS and for latency in all percentiles (90, 99, 99.9). Kuma was significantly faster than Istio in terms of average QPS, and but had similar latency behavior for the slowest requests. - -| AWS | QPS | Average latency | P90 | P99 | P99.9 | -| --- | ---: | ---: | ---: | ---: | ---: | -| Istio | 496.08 | 2.01 | 2.54 | 5.88 | 10.85 | -| Kuma | 886.37 | 1.13 | 1.30 | 4.28 | 9.33 | -| NSM vl3 | 1,332.38 | 0.74 | 0.84 | 1.04 | 2.45 | - -*Table 1. Test results for the AWS EKS clusters.* - -![AWS EKS average QPS comparison](/img/blog/2024/01/11/Fig2.png) - -*Figure 2. Average QPS for the AWS EKS clusters.* - -![AWS EKS latencies comparison](/img/blog/2024/01/11/Fig3.png) - -*Figure 3. Average latency and latency percentiles for the AWS EKS clusters.* - -## Results for Equinix Metal clusters - -The average QPS and latency values for these clusters as well as their latency percentiles are summarized in Table 2 and Fig. 4 and 5. The average QPS value was highest for NSM vl3, so the difference between NSM vl3 and Istio was 2.7 times, and between NSM vl3 and Kuma 1.13 times. Kuma turned out to be 2.4 times faster than Istio. If compared to the AWS EKS environment, the relative difference between NSM vl3 and Istio maintained in the Equinix Metal clusters as well, while Kuma reduced its gap with NSM vl3, and increased the one with Istio. - -Another interesting observation was that Kuma and NSM vl3 had similar percentile statistics: their 90th and 99th percentiles increased weakly if compared to the average latency, and the 99.9th was significantly higher than the 99th. Istio had a higher average latency, but it varied little up to the 99.9th percentile (see Table 2, Figure 5). - -Hence in Equinix Metal, Kuma and NSM significantly outperformed Istio both for average QPS and for latency in the 90th and 99th percentiles. Kuma and NSM had similar performance for average QPS and latency in the 90th and 99th percentiles, with a slight advantage towards NSM. As for the 99.9th percentile, Kuma was more likely to have slow queries (2.5 ms against the 0.2-ms average). - -| Packet | QPS | Average latency | P90 | P99 | P99.9 | -| --- | ---: | ---: | ---: | ---: | ---: | -| Istio | 1,864.44 | 0.53 | 0.57 | 0.68 | 0.95 | -| Kuma | 4,538.77 | 0.22 | 0.25 | 0.29 | 2.55 | -| NSM vl3 | 5,148.70 | 0.19 | 0.24 | 0.29 | 1.04 | - -*Table 2. Test results for the Equinix Metal clusters.* - -![Equinix Metal average QPS comparison](/img/blog/2024/01/11/Fig4.png) - -*Figure 4. Average QPS for the Equinix Metal clusters.* - -![Equinix Metal latencies comparison](/img/blog/2024/01/11/Fig5.png) - -*Figure 5. Average latency and latency percentiles for the Equinix Metal clusters.* - -## Conclusion - -The tests found big performance differences for the service meshes investigated in cross-cluster scenarios. In both testing environments, NSM vl3 showed the highest average QPS for cross-cluster connectivity scenarios. In comparison with Kuma the difference was 1.5 times on AWS and 1.13 times on Equinix Metal, in comparison with Istio the difference was 2.7 times in both environments. Kuma turned out to be 1.8 times faster than Istio in AWS, and 2.4 times faster in Equinix Metal for cross-cluster connectivity scenarios. This significant difference became a surprise to us, since both meshes use Envoy for data transfer, so we had expected their performances would be similar. Further research is required to understand the reasons for this difference. - -Kuma’s better relative performance in the Equinix Metal environment may be explained by the different technologies for providing external services, but this assumption also requires additional investigation. To do so, we plan to add a heavy load test scenario to test our hypotheses about the relationship between performance and environment. - -## About Us - -We are developers at Pragmagic Inc. with sufficient experience in implementing CNCF projects. -Your feedback, whether positive or negative, is deeply appreciated, so feel free to contact us via nsm@pragmagic.io. - -## Authors - - - Danil Uzlov, Software Engineer at Pragmagic Inc, https://pragmagic.io/ , nsm@pragmagic.io - - Denis Tingaikin, Technical Lead at Pragmagic Inc, https://pragmagic.io/, nsm@pragmagic.io - - Daniil Efremov, Director of Engineering at Pragmagic Inc, https://pragmagic.io/, nsm@pragmagic.io - \ No newline at end of file +Check out the latest assessments from **PragmagicInc** in [Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kume vs NSM](https://dev.to/pragmagic/testing-service-mesh-performance-in-multi-cluster-scenario-istio-vs-kuma-vs-nsm-4agj) \ No newline at end of file diff --git a/layouts/partials/blog.html b/layouts/partials/blog.html index 7114df7d..9d69ae02 100644 --- a/layouts/partials/blog.html +++ b/layouts/partials/blog.html @@ -5,7 +5,7 @@
{{ range $paginator.Pages }} - {{ .Title }}, +

{{ .Title }}

, {{ .Date.Format site.Params.dateFormat }} {{ if isset .Params "announce" }}
From ffc43a0be6c69ecc5719f4436ec4f8857598788a Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Thu, 1 Feb 2024 18:28:45 +1100 Subject: [PATCH 07/12] add blog post with Enlightening Signed-off-by: Nikita Skrynnik --- ...4-01-11-testing-service-mesh-performance copy.md} | 0 .../2024-01-26-testing-service-mesh-performance.md | 12 ++++++++++++ layouts/partials/blog.html | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) rename content/blog/2024/{2024-01-11-testing-service-mesh-performance.md => 2024-01-11-testing-service-mesh-performance copy.md} (100%) create mode 100644 content/blog/2024/2024-01-26-testing-service-mesh-performance.md diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md similarity index 100% rename from content/blog/2024/2024-01-11-testing-service-mesh-performance.md rename to content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md diff --git a/content/blog/2024/2024-01-26-testing-service-mesh-performance.md b/content/blog/2024/2024-01-26-testing-service-mesh-performance.md new file mode 100644 index 00000000..b81494f5 --- /dev/null +++ b/content/blog/2024/2024-01-26-testing-service-mesh-performance.md @@ -0,0 +1,12 @@ ++++ +title = "Enlightning - Understanding Network Service Mesh" +date = 2024-01-26 +announce= Check out how Network Service Mesh enables your workloads to get connectivity, security, and observability amongst each other independent of where they are running! +showToC = true ++++ + +# Enlightning - Understanding Network Service Mesh + +Check out how Network Service Mesh enables your workloads to get connectivity, security, and observability amongst each other independent of where they are running! + +{{}} \ No newline at end of file diff --git a/layouts/partials/blog.html b/layouts/partials/blog.html index 9d69ae02..cec60bcc 100644 --- a/layouts/partials/blog.html +++ b/layouts/partials/blog.html @@ -5,7 +5,7 @@
{{ range $paginator.Pages }} -

{{ .Title }}

, + {{ .Title }}, {{ .Date.Format site.Params.dateFormat }} {{ if isset .Params "announce" }}
From 26c8df1e7c48802d6bbb2a291d4a885ef6778f2d Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Thu, 1 Feb 2024 18:34:38 +1100 Subject: [PATCH 08/12] fix params Signed-off-by: Nikita Skrynnik --- ...rformance.md => 2024-01-26-enlightning-understanding-nsm.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename content/blog/2024/{2024-01-26-testing-service-mesh-performance.md => 2024-01-26-enlightning-understanding-nsm.md} (65%) diff --git a/content/blog/2024/2024-01-26-testing-service-mesh-performance.md b/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md similarity index 65% rename from content/blog/2024/2024-01-26-testing-service-mesh-performance.md rename to content/blog/2024/2024-01-26-enlightning-understanding-nsm.md index b81494f5..78d80569 100644 --- a/content/blog/2024/2024-01-26-testing-service-mesh-performance.md +++ b/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md @@ -1,7 +1,7 @@ +++ title = "Enlightning - Understanding Network Service Mesh" date = 2024-01-26 -announce= Check out how Network Service Mesh enables your workloads to get connectivity, security, and observability amongst each other independent of where they are running! +announce = "Check out how Network Service Mesh enables your workloads to get connectivity, security, and observability amongst each other independent of where they are running!" showToC = true +++ From 1a800f636081ba89485bf23e4af46148c562979e Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Thu, 1 Feb 2024 19:55:38 +1100 Subject: [PATCH 09/12] fix some tags Signed-off-by: Nikita Skrynnik --- layouts/partials/blog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/blog.html b/layouts/partials/blog.html index cec60bcc..7114df7d 100644 --- a/layouts/partials/blog.html +++ b/layouts/partials/blog.html @@ -5,7 +5,7 @@
{{ range $paginator.Pages }} - {{ .Title }}, + {{ .Title }}, {{ .Date.Format site.Params.dateFormat }} {{ if isset .Params "announce" }}
From e6b47b10985d81a5b942fc49f37d90454e2673c3 Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Thu, 1 Feb 2024 19:58:08 +1100 Subject: [PATCH 10/12] remove ToC Signed-off-by: Nikita Skrynnik --- content/blog/2024/2024-01-26-enlightning-understanding-nsm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md b/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md index 78d80569..fdee73fe 100644 --- a/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md +++ b/content/blog/2024/2024-01-26-enlightning-understanding-nsm.md @@ -2,7 +2,7 @@ title = "Enlightning - Understanding Network Service Mesh" date = 2024-01-26 announce = "Check out how Network Service Mesh enables your workloads to get connectivity, security, and observability amongst each other independent of where they are running!" -showToC = true +showToC = false +++ # Enlightning - Understanding Network Service Mesh From 5229c8bf2c7414db157917b6a508fcbf296703d6 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 6 Feb 2024 17:06:56 +0700 Subject: [PATCH 11/12] fix some typos Signed-off-by: NikitaSkrynnik --- .../2024/2024-01-11-testing-service-mesh-performance copy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md index 6b290460..4a47244d 100644 --- a/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md +++ b/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md @@ -9,4 +9,4 @@ showToC = true Have you ever wondered how different service meshes perform in dual cluster scenarios? -Check out the latest assessments from **PragmagicInc** in [Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kume vs NSM](https://dev.to/pragmagic/testing-service-mesh-performance-in-multi-cluster-scenario-istio-vs-kuma-vs-nsm-4agj) \ No newline at end of file +Check out the latest assessments from **Pragmagic Inc** in [Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM](https://dev.to/pragmagic/testing-service-mesh-performance-in-multi-cluster-scenario-istio-vs-kuma-vs-nsm-4agj) \ No newline at end of file From 8f81caaefb7925262a0b261327a0ffd04f431332 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 6 Feb 2024 17:07:53 +0700 Subject: [PATCH 12/12] remove Table of Contents Signed-off-by: NikitaSkrynnik --- .../2024/2024-01-11-testing-service-mesh-performance copy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md b/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md index 4a47244d..017c6380 100644 --- a/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md +++ b/content/blog/2024/2024-01-11-testing-service-mesh-performance copy.md @@ -2,7 +2,7 @@ title = "Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM" date = 2024-01-11 announce= "This article may be useful for those who are aware of service meshes and probably trying to improve scalability and connectivity between applications in Kubernetes and other container orchestration systems, e.g., adding encryption and authorization for application connections." -showToC = true +showToC = false +++ # Testing Service Mesh Performance in Multi-Cluster Scenario: Istio vs Kuma vs NSM