Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
---
title: Deploy Envoy on Google Axion processors

draft: true
cascade:
draft: true

minutes_to_complete: 30

who_is_this_for: This introductory topic is for software developers interested in migrating their Envoy workloads from x86_64 platforms to Arm-based platforms, specifically on Google Axion–based C4A virtual machines.

learning_objectives:
- Start an Arm virtual machine on Google Cloud Platform (GCP) using the C4A Google Axion instance family with RHEL 9 as the base image
- Install and configure Envoy on Arm-based GCP C4A instances
- Validate Envoy functionality through baseline testing
- Benchmark Envoy performance on Arm

prerequisites:
- A [Google Cloud Platform (GCP)](https://cloud.google.com/free?utm_source=google&hl=en) account with billing enabled
- Familiarity with networking concepts and the [Envoy architecture](https://www.envoyproxy.io/docs/envoy/latest/).

author: Pareena Verma

##### Tags
skilllevels: Advanced
subjects: Web
cloud_service_providers: Google Cloud

armips:
- Neoverse

tools_software_languages:
- Envoy
- Siege

operatingsystems:
- Linux

# ================================================================================
# FIXED, DO NOT MODIFY
# ================================================================================
further_reading:
- resource:
title: Google Cloud official documentation
link: https://cloud.google.com/docs
type: documentation

- resource:
title: Envoy documentation
link: https://www.envoyproxy.io/docs/envoy/latest/about_docs
type: documentation

- resource:
title: The official documentation for Siege
link: https://www.joedog.org/siege-manual/
type: documentation

weight: 1 # _index.md always has weight of 1 to order correctly
layout: "learningpathall" # All files under learning paths have this same wrapper
learning_path_main_page: "yes" # Indicates this should be surfaced when looking for related content. Only set for _index.md of learning path content.
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
# ================================================================================
# FIXED, DO NOT MODIFY THIS FILE
# ================================================================================
weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation.
title: "Next Steps" # Always the same, html page title.
layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing.
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
title: Getting started with Envoy on Google Axion C4A (Arm Neoverse-V2)

weight: 2

layout: "learningpathall"
---

## Google Axion C4A Arm instances in Google Cloud

Google Axion C4A is a family of Arm-based virtual machines built on Google’s custom Axion CPU, which is based on Arm Neoverse-V2 cores. Designed for high-performance and energy-efficient computing, these virtual machines offer strong performance for modern cloud workloads such as CI/CD pipelines, microservices, media processing, and general-purpose applications.

The C4A series provides a cost-effective alternative to x86 virtual machines while leveraging the scalability and performance benefits of the Arm architecture in Google Cloud.

To learn more about Google Axion, refer to the [Introducing Google Axion Processors, our new Arm-based CPUs](https://cloud.google.com/blog/products/compute/introducing-googles-new-arm-based-cpu) blog.

## Envoy for service proxying and traffic management on Arm

Envoy is an open-source, high-performance edge and service proxy designed for cloud-native applications.

It handles service-to-service communication, traffic routing, load balancing, and observability, making microservices more reliable and secure.

Envoy is widely used in service meshes, API gateways, and modern cloud environments. Learn more from the [Envoy official website](https://www.envoyproxy.io/) and its [official documentation](https://www.envoyproxy.io/docs/envoy/latest/).
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
---
title: Envoy baseline testing on Google Axion C4A Arm Virtual machine
weight: 5

### FIXED, DO NOT MODIFY
layout: learningpathall
---


Since Envoy is installed successfully on your GCP C4A Arm virtual machine, follow these steps to validate that the Envoy is running.

## Validate Envoy installation with a baseline test

In this section, we covered how to create a minimal Envoy config, start Envoy with it, and verify functionality using `curl`.
The test confirmed that Envoy listens on port **10000**, forwards requests to `httpbin.org`, and returns a successful **200 OK** response.

### Create a Minimal Configuration File

Using a file editor of your choice, create a file named `envoy_config.yaml`, and add the below content to it. This file configures Envoy to listen on port **10000** and forward all traffic to `http://httpbin.org`. The host_rewrite_literal is essential to prevent 404 Not Found errors from the upstream server.

```YAML
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: service_httpbin
host_rewrite_literal: httpbin.org
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: service_httpbin
connect_timeout: 0.5s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_httpbin
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: httpbin.org
port_value: 80
```
- **Listeners:** Envoy is configured to accept incoming HTTP requests on port **10000** of your VM.
- **HTTP Connection Manager:** A filter processes the incoming requests, directing them to the appropriate backend.
- **Routing:** All traffic is routed to the `service_httpbin` cluster, with the `Host` header rewritten to `httpbin.org`.
- **Clusters:** The `service_httpbin` cluster defines the upstream service as `httpbin.org` on port **80**, which is where requests are ultimately forwarded.

### Run and Test Envoy

This is the final phase of functional validation, confirming that the proxy is operational.
Start the Envoy proxy using your configuration file. This command will keep the terminal occupied, so you will need a new terminal for the next step.

```console
envoy -c envoy_config.yaml --base-id 1
```
The output should look similar to:

```output
[2025-08-21 11:53:51.597][67137][info][config] [source/server/configuration_impl.cc:138] loading 1 listener(s)
[2025-08-21 11:53:51.597][67137][info][config] [source/server/configuration_impl.cc:154] loading stats configuration
[2025-08-21 11:53:51.598][67137][warning][main] [source/server/server.cc:928] There is no configured limit to the number of allowed active downstream connections. Configure a limit in `envoy.resource_monitors.downstream_connections` resource monitor.
[2025-08-21 11:53:51.598][67137][info][main] [source/server/server.cc:969] starting main dispatch loop
[2025-08-21 11:53:51.599][67137][info][runtime] [source/common/runtime/runtime_impl.cc:614] RTDS has finished initialization
[2025-08-21 11:53:51.599][67137][info][upstream] [source/common/upstream/cluster_manager_impl.cc:240] cm init: all clusters initialized
[2025-08-21 11:53:51.599][67137][info][main] [source/server/server.cc:950] all clusters initialized. initializing init manager
[2025-08-21 11:53:51.599][67137][info][config] [source/common/listener_manager/listener_manager_impl.cc:930] all dependencies initialized. starting workers
```

Now, **Send a test request** from another terminal window to the Envoy listener using `curl`.

```console
curl -v http://localhost:10000/get
```
The `-v` flag provides verbose output, showing the full request and response headers. A successful test will show a **HTTP/1.1 200 OK** response with a JSON body from httpbin.org.

The output should look similar to:

```output
* Trying 127.0.0.1:10000...
* Connected to 127.0.0.1 (127.0.0.1) port 10000 (#0)
> GET /get HTTP/1.1
> Host: 127.0.0.1:10000
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Fri, 22 Aug 2025 11:20:35 GMT
< content-type: application/json
< content-length: 301
< server: envoy
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 1042
<
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.76.1",
"X-Amzn-Trace-Id": "Root=1-68a85282-10af9cfe0385774600509ddd",
"X-Envoy-Expected-Rq-Timeout-Ms": "15000"
},
"origin": "34.63.220.63",
"url": "http://httpbin.org/get"
}
* Connection #0 to host 127.0.0.1 left intact
```
#### Summary of the curl Output

- **Successful Connection:** The **curl** command successfully connected to the Envoy proxy on **localhost:10000**.
- **Correct Status Code:** Envoy successfully forwarded the request and received a healthy **200 OK** response from the upstream server.
- **Host Header Rewrite:** The **Host** header was correctly rewritten from **localhost:10000** to **httpbin.org** as defined in the configuration.
- **End-to-End Success:** The proxy is fully operational, proving that requests are correctly received, processed, and forwarded to the intended backend.

This confirms the end-to-end flow is working correctly.
Loading