From 9e0a7ce3f1e8503bb42babe866b0c22681740f1f Mon Sep 17 00:00:00 2001 From: sky Date: Wed, 29 Jul 2020 04:42:30 +0800 Subject: [PATCH] Add a blog post: an alternative sidecar proxy for Istio. (#7743) * Add a blog post: An alternative sidecar proxy for Istio. * Fix typo. * typo: delete trailing spaces. * Use `github_file` instead of raw url. * Fix typo. * Update spelling file. * update spelling file. * Add some point. * fix style. * Add Ant word. * fix typo. * fix typo. * Update some point for review. * fix typo. * fix typo. * update. * update post. * Add a section of Moving forward. * update some point, thx @Craig Box. * add some drawbacks of MOSN, thx @Lin Sun. * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Lin Sun * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * Update content/en/blog/2020/mosn-proxy/index.md Co-authored-by: Frank Budinsky * add support section, thx @duderino @craigbox. * update some point. Co-authored-by: Lin Sun Co-authored-by: Frank Budinsky --- .spelling | 4 + content/en/blog/2020/mosn-proxy/index.md | 124 ++++++++++++++++++ content/en/blog/2020/mosn-proxy/mosn-arch.png | Bin 0 -> 29816 bytes 3 files changed, 128 insertions(+) create mode 100644 content/en/blog/2020/mosn-proxy/index.md create mode 100644 content/en/blog/2020/mosn-proxy/mosn-arch.png diff --git a/.spelling b/.spelling index aef3dadde8..24282dcda1 100644 --- a/.spelling +++ b/.spelling @@ -82,6 +82,7 @@ alt analytics Anantheswaran ANDed +Ant Ansible API api-server @@ -367,6 +368,7 @@ jwcrypto JWT jwt.io JWTs +katacoda Keepalived key.pem Keycloak @@ -423,6 +425,7 @@ misordered Mitigations MongoDB mongodb +MOSN mTLS Multicast Multicloud @@ -668,6 +671,7 @@ url user user1 UTF-8 +v0.14.0 v1 v1.7.4 v1.7.6_coreos.0 diff --git a/content/en/blog/2020/mosn-proxy/index.md b/content/en/blog/2020/mosn-proxy/index.md new file mode 100644 index 0000000000..0877afabcb --- /dev/null +++ b/content/en/blog/2020/mosn-proxy/index.md @@ -0,0 +1,124 @@ +--- +title: "Using MOSN with Istio: an alternative data plane" +subtitle: "A Cloud Native Proxy for Edge or Service Mesh" +description: "An alternative sidecar proxy for Istio." +publishdate: 2020-07-28 +attribution: "Wang Fakang (mosn.io)" +keywords: [mosn,sidecar,proxy] +--- + +[MOSN](https://github.com/mosn/mosn) (Modular Open Smart Network) is a network proxy server written in GoLang. It was built at [Ant Group](https://www.antfin.com) as a sidecar/API Gateway/cloud-native Ingress/Layer 4 or Layer 7 load balancer etc. Over time, we've added extra features, like a multi-protocol framework, multi-process plug-in mechanism, a DSL, and support for the [xDS APIs](https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol). Supporting xDS means we are now able to use MOSN as the network proxy for Istio. This configuration is not supported by the Istio project; for help, please see [Learn More](#learn-more) below. + +## Background + +In the service mesh world, using Istio as the control plane has become the mainstream. Because Istio was built on Envoy, it uses Envoy's data plane [APIs](https://blog.envoyproxy.io/the-universal-data-plane-api-d15cec7a) (collectively known as the xDS APIs). These APIs have been standardized separately from Envoy, and so by implementing them in MOSN, we are able to drop in MOSN as a replacement for Envoy. Istio's integration of third-party data planes can be implemented in three steps, as follows. + +- Implement xDS protocols to fulfill the capabilities for data plane related services. +- Build `proxyv2` images using Istio's script and set the relevant `SIDECAR` and other parameters. +- Specify a specific data plane via the `istioctl` tool and set the proxy-related configuration. + +## Architecture + +MOSN has a layered architecture with four layers, NET/IO, Protocol, Stream, and Proxy, as shown in the following figure. + +{{< image width="80%" + link="./mosn-arch.png" + caption="The architecture of MOSN" + >}} + +- NET/IO acts as the network layer, monitoring connections and incoming packets, and as a mount point for the listener filter and network filter. +- Protocol is the multi-protocol engine layer that examines packets and uses the corresponding protocol for decode/encode processing. +- Stream does a secondary encapsulation of the decode packet into stream, which acts as a mount for the stream filter. +- Proxy acts as a forwarding framework for MOSN, and does proxy processing on the encapsulated streams. + +## Why use MOSN? + +Before the service mesh transformation, we have expected that as the next generation of Ant Group's infrastructure, service mesh will inevitably bring revolutionary changes and evolution costs. We have a very ambitious blueprint: ready to integrate the original network and middleware various capabilities have been re-precipitated and polished to create a low-level platform for the next-generation architecture of the future, which will carry the responsibility of various service communications. + +This is a long-term planning project that takes many years to build and meets the needs of the next five or even ten years, and cooperates to build a team that spans business, SRE, middleware, and infrastructure departments. We must have a network proxy forwarding plane with flexible expansion, high performance, and long-term evolution. Nginx and Envoy have a very long-term capacity accumulation and active community in the field of network agents. We have also borrowed from other excellent open source network agents such as Nginx and Envoy. At the same time, we have enhanced research and development efficiency and flexible expansion. Mesh transformation involves a large number of departments and R & D personnel. We must consider the landing cost of cross-team cooperation. Therefore, we have developed a new network proxy MOSN based on GoLang in the cloud-native scenario. For GoLang's performance, we also did a full investigation and test in the early stage to meet the performance requirements of Ant Group's services. + +At the same time, we received a lot of feedback and needs from the end user community. Everyone has the same needs and thoughts. So we combined the actual situation of the community and ourselves to conduct the research and development of MOSN from the perspective of satisfying the community and users. We believe that the open source competition is mainly competition between standards and specifications. We need to make the most suitable implementation choice based on open source standards. + +## What is the difference between MOSN and Istio's default proxy? + +### Differences in language stacks + +MOSN is written in GoLang. GoLang has strong guarantees in terms of production efficiency and memory security. At the same time, GoLang has an extensive library ecosystem in the cloud-native era. The performance is acceptable and usable in the service mesh scenario. Therefore, MOSN has a lower intellectual cost for companies and individuals using languages such as GoLang and Java. + +### Differentiation of core competence + +- MOSN supports a multi-protocol framework, and users can easily access private protocols with a unified routing framework. +- Multi-process plug-in mechanism, which can easily extend the plug-ins of independent MOSN processes through the plug-in framework, and do some other management, bypass and other functional module extensions. +- Transport layer national secret algorithm support with Chinese encryption compliance, etc. + +### What are the drawbacks of MOSN + +- Because MOSN is written in GoLang, it doesn't have as good performance as Istio default proxy, but the performance is acceptable and usable in the service mesh scenario. +- Compared with Istio default proxy, some features are not fully supported, such as WASM, HTTP3, Lua, etc. However, these are all in the [roadmap](https://docs.google.com/document/d/12lgyCW-GmlErr_ihvAO7tMmRe87i70bv2xqe4h2LUz4/edit?usp=sharing) of MOSN, and the goal is to be fully compatible with Istio. + +## MOSN with Istio + +The following describes how to set up MOSN as the data plane for Istio. + +## Setup Istio + +You can download a zip file for your operating system from the [Istio release](https://github.com/istio/istio/releases/tag/1.5.2) page. This file contains: the installation file, examples and the `istioctl` command line tool. +To download Istio (this example uses Istio 1.5.2) uses the following command. + +{{< text bash >}} +$ export ISTIO_VERSION=1.5.2 +$ curl -L https://istio.io/downloadIstio | sh - +{{< /text >}} + +The downloaded Istio package is named `istio-1.5.2` and contains: +- `install/kubernetes`: Contains YAML installation files related to Kubernetes. +- `examples/`: Contains example applications. +- `bin/`: Contains the istioctl client files. + +Switch to the folder where Istio is located. + +{{< text bash >}} +$ cd istio-$ISTIO_VERSION/ +{{< /text >}} + +Add the `istioctl` client path to `$PATH` with the following command. + +{{< text bash >}} +$ export PATH=$PATH:$(pwd)/bin +{{< /text >}} + +## Setting MOSN as the Data Plane + +It is possible to flexibly customize the Istio control plane and data plane configuration parameters using the `istioctl` command line tool. MOSN can be specified as the data plane for Istio using the following command. + +{{< text bash >}} +$ istioctl manifest apply --set .values.global.proxy.image="mosnio/proxyv2:1.5.2-mosn" --set meshConfig.defaultConfig.binaryPath="/usr/local/bin/mosn" +{{< /text >}} + +Check that Istio-related pods and services are deployed successfully. + +{{< text bash >}} +$ kubectl get svc -n istio-system +{{< /text >}} + +If the service `STATUS` is Running, then Istio has been successfully installed using MOSN and you can now deploy the Bookinfo sample. + +## Bookinfo Examples + +You can run the Bookinfo sample by following the [MOSN with Istio tutorial](https://katacoda.com/mosn/courses/istio/mosn-with-istio) where you can find instructions for using MOSN and Istio. You can install MOSN and get to the same point you would have using the default Istio instructions with Envoy. + +## Moving forward + +Next, MOSN will not only be compatible with the features of the latest version of Istio, but also evolve in the following aspects. + +- _As a microservices runtime_, MOSN oriented programming makes services lighter, smaller and faster. +- _Programmable_, support WASM. +- _More scenario support_, Cache Mesh/Message Mesh/Block-chain Mesh etc. + +MOSN is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! [Here](https://github.com/mosn/community) are a few ways to find out what's happening and get involved. + +## Learn More + +- [MOSN website](https://mosn.io/en) +- [MOSN community](https://mosn.io/en/docs/community/) +- [MOSN tutorials](https://katacoda.com/mosn) diff --git a/content/en/blog/2020/mosn-proxy/mosn-arch.png b/content/en/blog/2020/mosn-proxy/mosn-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..55464b25b9d77ff174094410dabb37e22721b0f9 GIT binary patch literal 29816 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