{"id":88635,"date":"2019-02-20T07:00:46","date_gmt":"2019-02-20T05:00:46","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=88635"},"modified":"2019-02-19T13:05:46","modified_gmt":"2019-02-19T11:05:46","slug":"control-plane-manage-envoy-proxy-edge","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html","title":{"rendered":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh"},"content":{"rendered":"<p><a href=\"https:\/\/www.envoyproxy.io\">Envoy<\/a> has become a popular networking component as of late. Matt Klein <a href=\"https:\/\/blog.envoyproxy.io\/the-universal-data-plane-api-d15cec7a\">wrote a blog a couple years back<\/a> talking about Envoy\u2019s dynamic configuration API and how it has been part of the reason the adoption curve for Envoy has been up and to the right. He called the blog the \u201cuniversal data plane API\u201d. With <a href=\"https:\/\/www.envoyproxy.io\/community\">so many other projects adopting Envoy<\/a> as a central component to their offering, it would not be a stretch to say \u201cEnvoy has become the universal data plane in cloud-native architectures\u201d for application\/L7 networking solutions, not just establishing a standardized API.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" width=\"490\" height=\"267\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoy.png\" alt=\"Envoy Proxy\" class=\"wp-image-88667\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoy.png 490w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoy-300x163.png 300w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/figure>\n<\/div>\n<p>Moreover, because of <a href=\"https:\/\/blog.envoyproxy.io\/the-universal-data-plane-api-d15cec7a\">Envoy\u2019s universal data plane API<\/a>, we\u2019ve seen a multitude of implementations of a <em>management layer<\/em> to configure and drive Envoy-based infrastructure. We\u2019re going to take a deep dive into what it takes to build a control plane for Envoy so you can use this information to evaluate what type of infrastructure will fit your organization and usecases best. Because this is a broad topic, we\u2019ll tackle it in a multi-part series published over the next coming days. Follow along (<a href=\"https:\/\/twitter.com\/christianposta\">@christianposta<\/a>, <a href=\"https:\/\/twitter.com\/soloio_inc\">@soloio_inc<\/a>) for the next entries.<\/p>\n<p>There were some <a href=\"https:\/\/blog.envoyproxy.io\/envoycon-recap-579d53576511\">great talks at EnvoyCon\/KubeCon<\/a> where some organizations shared their experiences adopting Envoy including how they built their own control planes. Some of the reasons folks chose to build their own control plane:<\/p>\n<ul class=\"wp-block-list\">\n<li>Had existing solutions built on different data planes with pre-existing control planes and needed to retrofit Envoy in<\/li>\n<li>Building for infrastructure that doesn\u2019t have any existing opensource or other Envoy control planes (ie, VMs, AWS ECS, etc)<\/li>\n<li>Don\u2019t need to use all of Envoy\u2019s features; just a subset<\/li>\n<li>Prefer an domain-specific API\/object model for Envoy configuration that fits their workflows\/worldview better<\/li>\n<li>Other control planes weren\u2019t in a mature state when their respective organizations were ready to deploy<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" width=\"600\" height=\"486\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/control-plane-data-plane.png\" alt=\"Envoy Proxy\" class=\"wp-image-88668\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/control-plane-data-plane.png 600w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/control-plane-data-plane-300x243.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n<p>However, just because some early adopters built their own bespoke control planes doesn\u2019t mean YOU should do the same thing now. First, projects building control planes for Envoy have matured quite a bit in the last year and you should explore using those before deciding to re-create yet another control plane. Second, as the folks at Datawire found, and <a href=\"https:\/\/twitter.com\/danielbryantuk\">Daniel Bryant<\/a> recently articulated, <a href=\"https:\/\/www.infoq.com\/articles\/ambassador-api-gateway-kubernetes\">building a control plane for Envoy is not for the faint of heart<\/a>.<\/p>\n<p><a href=\"https:\/\/www.solo.io\">I work<\/a> on <a href=\"https:\/\/github.com\/istio\/istio\">a couple<\/a> <a href=\"https:\/\/github.com\/solo-io\/gloo\">open-source projects<\/a> that have built a control plane for Envoy. For example, <a href=\"https:\/\/gloo.solo.io\">Gloo<\/a> is <a href=\"https:\/\/medium.com\/solo-io\/announcing-gloo-the-function-gateway-3f0860ef6600\">a function gateway<\/a> that can act as a very powerful Kubernetes ingress, API Gateway, or function gateway to ease the transition of monoliths to microservices. Gloo <a href=\"https:\/\/gloo.solo.io\/introduction\/architecture\/\">has a control-plane for Envoy<\/a> that we can refer to in this series of posts as an example of how to build a simple abstraction that allows for pluggability and extensibility at the control points you need. Other solid control-plane implementations you can use for reference are <a href=\"https:\/\/istio.io\">Istio<\/a> and <a href=\"https:\/\/github.com\/heptio\/contour\">Heptio Contour<\/a> and we\u2019ll use those as good examples throughout the blog series. If nothing else, you can learn what options exist for an Envoy control plane and use that to guide your implementation if you have to go down that path.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoyprojects-1024x275.png\" alt=\"Envoy Proxy\" class=\"wp-image-88669\" width=\"768\" height=\"206\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoyprojects-1024x275.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoyprojects-300x81.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoyprojects-768x207.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/envoyprojects.png 1368w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>In this blog series, we\u2019ll take a look at the following areas:<\/p>\n<ul class=\"wp-block-list\">\n<li>Adopting a mechanism to dynamically update Envoy\u2019s routing, service discovery, and other configuration<\/li>\n<li>Identifying what components make up your control plane, including backing stores, service discovery APIs, security components, et. al.<\/li>\n<li>Establishing any domain-specific configuration objects and APIs that best fit your usecases and organization<\/li>\n<li>Thinking of how best to make your control plane pluggable where you need it<\/li>\n<li>Options for deploying your various control-plane components<\/li>\n<li>Thinking through a testing harness for your control plane<\/li>\n<\/ul>\n<p>To kick off the series, let\u2019s look at using Envoy\u2019s dynamic configuration APIs to update Envoy at runtime to deal with changes in topology and deployments.<\/p>\n<h2 class=\"wp-block-heading\">Dynamically configuring Envoy with its xDS API<\/h2>\n<p>One of the main advantages of building on top of Envoy is it\u2019s data plane API. With the data plane API, we can <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/intro\/arch_overview\/dynamic_configuration\">dynamically configure most of Envoy\u2019s important runtime settings<\/a>. Envoy\u2019s configuration via its xDS APIs is <a href=\"https:\/\/blog.envoyproxy.io\/embracing-eventual-consistency-in-soa-networking-32a5ee5d443d\">eventually consistent by design<\/a> \u2013 that is \u2013 there is no way to affect an \u201catomic update\u201d to all of the proxies in the cluster. When the control plane has configuration updates, it makes them available to the data plane proxies through the xDS APIs and each proxy will apply these updates independently from each other.<\/p>\n<p>The following are the parts of Envoy\u2019s runtime model we can configure dynamically through xDS:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/listeners\/lds#config-listeners-lds\">Listeners Discovery Service API &#8211; LDS<\/a> to publish ports on which to listen for traffic<\/li>\n<li><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/api-v2\/api\/v2\/eds.proto#envoy-api-file-envoy-api-v2-eds-proto\">Endpoints Discovery Service API- EDS<\/a> for service discovery,<\/li>\n<li><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/http_conn_man\/rds#config-http-conn-man-rds\">Routes Discovery Service API- RDS<\/a> for traffic routing decisions<\/li>\n<li><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/cluster_manager\/cds#config-cluster-manager-cds\">Clusters Discovery Service- CDS<\/a> for backend services to which we can route traffic<\/li>\n<li><a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/secret\">Secrets Discovery Service &#8211; SDS<\/a> for distributing secrets (certificates and keys)<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/xds-control-plane.png\" alt=\"Envoy Proxy\" class=\"wp-image-88670\" width=\"675\" height=\"449\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/xds-control-plane.png 900w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/xds-control-plane-300x199.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/02\/xds-control-plane-768x510.png 768w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/figure>\n<\/div>\n<p>The API is defined with <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/overview\/v2_overview#config-overview-v2\">proto3 Protocol Buffers<\/a> and even has a couple reference implementations you can use to bootstrap your own control plane:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/envoyproxy\/go-control-plane\">go-control-plane<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/envoyproxy\/java-control-plane\">java-control-plane<\/a><\/li>\n<\/ul>\n<p>Although each of these areas (LDS\/EDS\/RDS\/CDS\/SDS, together \u201cxDS\u201d) are dynamically configurable, that doesn\u2019t mean you must configure everything dynamically. You can have a combination of parts that are statically defined and some parts that are updated dynamically. For example, to implement a type of service discovery where <code>endpoints<\/code> are expected to be dynamic but the <code>clusters<\/code> are well known at deploy time, you can statically define the <code>clusters<\/code> and use the <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/api-v2\/api\/v2\/eds.proto#envoy-api-file-envoy-api-v2-eds-proto\">Endpoint Discovery Service<\/a> from Envoy. If you are not sure exactly which <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/intro\/arch_overview\/terminology\">upstream clusters<\/a> will be used at deploy time you could use the <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.9.0\/configuration\/cluster_manager\/cds#config-cluster-manager-cds\">Cluster Discovery Service<\/a> to dynamically find those. The point is, you can build a workflow and process that statically configures the parts you need while use dynamic xDS services to discover the pieces you need at runtime. One of the reasons why you see different control-plane implementation is not everyone has a fully dynamic and fungible environment where all of the pieces should be dynamic. Adopt the level of dynamism that\u2019s most appropriate for your system given the existing constraints and available workflows.<\/p>\n<p>In the case of Gloo, we use a control plane <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/ac3bddf202423b297fb909eb6eff498745a8c015\/projects\/gloo\/pkg\/xds\/envoy.go#L76\">based on go-control-plane<\/a> to implement the xDS APIs to serve Envoy\u2019s dynamic configuration. Istio uses this implementation also as does Heptio Contour. This control plane API leverages <a href=\"https:\/\/grpc.io\/docs\/guides\/concepts.html#server-streaming-rpc\">gRPC streaming<\/a> calls and stubs out the API so you can fill it with an implementation. Another project, which is unfortunately deprecated but can be used to learn a lot, is <a href=\"https:\/\/github.com\/turbinelabs\/rotor\">Turbine Labs\u2019 Rotor project<\/a>. This is a highly efficient way to integrate Envoy\u2019s data plane API with the control plane.<\/p>\n<p>gRPC streaming is not the only way to update Envoy\u2019s configuration. In <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/v1.5.0\/api-v1\/api\">previous versions of the Envoy xDS API<\/a>, polling was the only option to determine whether new configuration was available. Although this was acceptable, and met the criteria for \u201ceventually-consistent\u201d configuration updates, it was less efficient in both network and compute usage. It can also be difficult to properly tune the polling configurations to reduce wasted resources.<\/p>\n<p>Lastly, some Envoy management implementations opt to generate <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/overview\/v2_overview#static\">static Envoy configuration files<\/a> and periodically replace the configuration files on disk for Envoy and then perform a <a href=\"https:\/\/blog.envoyproxy.io\/envoy-hot-restart-1d16b14555b5\">hot reload of the Envoy process<\/a>. In a highly dynamic environment (like Kubernetes, but really any ephemeral-compute based platform) the management of this file generation, delivery, hot-restart, etc can get unwieldy. Envoy was originally operated in an environment that performed updates like this (Lyft, where it was created) but they are incrementally moving toward using the xDS APIs.<\/p>\n<h3 class=\"wp-block-heading\">Takeaway<\/h3>\n<p><a href=\"https:\/\/github.com\/solo-io\/gloo\/graphs\/contributors\">The Gloo team<\/a> believes using gRPC streaming and the xDS APIs is the ideal way to implement dynamic configuration and control for Envoy. Again, not all of the Envoy configurations should be served dynamically if you don\u2019t need that, however if you\u2019re operating in a highly dynamic environment (e.g., Kubernetes), the option to configure Envoy dynamically is critical. Other environments may not have this need. Either way, gRPC streaming API for the dynamic parts is ideal. Some benefits to this approach:<\/p>\n<ul class=\"wp-block-list\">\n<li>event-driven configuration updates; configuration is pushed to Envoy when it becomes available in the control plane<\/li>\n<li>no need to poll for changes<\/li>\n<li>no need to hot-reload Envoy<\/li>\n<li>no disruption to traffic<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">What\u2019s next<\/h2>\n<p>In this first part, we established some basic context on how to build a control plane for Envoy by covering the xDS APIs and the different options you have for serving dynamic configuration to Envoy. In the next sections, to be released in a few days, will cover breaking your control plane into deployable components, identifying which pieces you need, what a domain-specific configuration object model could look like, and how to think about pluggability of the control plane. Follow along on twitter (<a href=\"https:\/\/twitter.com\/christianposta\">@christianposta<\/a>, <a href=\"https:\/\/twitter.com\/soloio_inc\">@soloio_inc<\/a>) or blog (<a href=\"https:\/\/blog.christianposta.com\">https:\/\/blog.christianposta.com<\/a> <a href=\"https:\/\/medium.com\/solo-io\">https:\/\/medium.com\/solo-io<\/a>)<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Christian Posta, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.christianposta.com\/envoy\/guidance-for-building-a-control-plane-to-manage-envoy-proxy-based-infrastructure\/\" target=\"_blank\" rel=\"noopener\">Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Envoy has become a popular networking component as of late. Matt Klein wrote a blog a couple years back talking about Envoy\u2019s dynamic configuration API and how it has been part of the reason the adoption curve for Envoy has been up and to the right. He called the blog the \u201cuniversal data plane API\u201d. &hellip;<\/p>\n","protected":false},"author":204,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-88635","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-20T05:00:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Christian Posta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/christianposta\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christian Posta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html\"},\"author\":{\"name\":\"Christian Posta\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\"},\"headline\":\"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh\",\"datePublished\":\"2019-02-20T05:00:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html\"},\"wordCount\":1551,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html\",\"name\":\"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-02-20T05:00:46+00:00\",\"description\":\"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-manage-envoy-proxy-edge.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\",\"name\":\"Christian Posta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"caption\":\"Christian Posta\"},\"description\":\"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.\",\"sameAs\":[\"http:\\\/\\\/www.christianposta.com\\\/blog\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/christian-posta\\\/15\\\/412\\\/199\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/christianposta\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Christian-Posta\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks","description":"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html","og_locale":"en_US","og_type":"article","og_title":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks","og_description":"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh","og_url":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-02-20T05:00:46+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Christian Posta","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/christianposta","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Christian Posta","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html"},"author":{"name":"Christian Posta","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed"},"headline":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh","datePublished":"2019-02-20T05:00:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html"},"wordCount":1551,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html","url":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html","name":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-02-20T05:00:46+00:00","description":"Interested to learn about Envoy Proxy? Check our article explaining how to Build a Control Plane to Manage Envoy Proxy as a gateway, or in a mesh","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Guidance for Building a Control Plane to Manage Envoy Proxy at the edge, as a gateway, or in a mesh"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed","name":"Christian Posta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","caption":"Christian Posta"},"description":"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.","sameAs":["http:\/\/www.christianposta.com\/blog\/","http:\/\/www.linkedin.com\/pub\/christian-posta\/15\/412\/199","https:\/\/x.com\/http:\/\/twitter.com\/christianposta"],"url":"https:\/\/www.javacodegeeks.com\/author\/Christian-Posta"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/88635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/204"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=88635"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/88635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=88635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=88635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=88635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}