Skip to content

Commit dca085e

Browse files
committed
Deploy Envoy on Google Axion C4A Arm virtual machine
Signed-off-by: odidev <[email protected]>
1 parent 7ea1b98 commit dca085e

File tree

8 files changed

+1479
-0
lines changed

8 files changed

+1479
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
title: Deploy Envoy on Google Axion processors
3+
4+
minutes_to_complete: 30
5+
6+
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.
7+
8+
learning_objectives:
9+
- Start an Arm virtual machine on Google Cloud Platform (GCP) using the C4A Google Axion instance family with RHEL 9 as the base image
10+
- Install and configure Envoy on Arm-based GCP C4A instances
11+
- Validate Envoy functionality through baseline testing
12+
- Benchmark Envoy performance on Arm
13+
14+
prerequisites:
15+
- A [Google Cloud Platform (GCP)](https://cloud.google.com/free?utm_source=google&hl=en) account with billing enabled
16+
- Familiarity with networking concepts and the [Envoy architecture](https://www.envoyproxy.io/docs/envoy/latest/).
17+
18+
author: Pareena Verma
19+
20+
##### Tags
21+
skilllevels: Advanced
22+
subjects: Web
23+
cloud_service_providers: Google Cloud
24+
25+
armips:
26+
- Neoverse
27+
28+
tools_software_languages:
29+
- Envoy
30+
- Siege
31+
32+
operatingsystems:
33+
- Linux
34+
35+
# ================================================================================
36+
# FIXED, DO NOT MODIFY
37+
# ================================================================================
38+
further_reading:
39+
- resource:
40+
title: Google Cloud official documentation
41+
link: https://cloud.google.com/docs
42+
type: documentation
43+
44+
- resource:
45+
title: Envoy documentation
46+
link: https://www.envoyproxy.io/docs/envoy/latest/about_docs
47+
type: documentation
48+
49+
- resource:
50+
title: The official documentation for Siege
51+
link: https://www.joedog.org/siege-manual/
52+
type: documentation
53+
54+
weight: 1 # _index.md always has weight of 1 to order correctly
55+
layout: "learningpathall" # All files under learning paths have this same wrapper
56+
learning_path_main_page: "yes" # Indicates this should be surfaced when looking for related content. Only set for _index.md of learning path content.
57+
---
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
# ================================================================================
3+
# FIXED, DO NOT MODIFY THIS FILE
4+
# ================================================================================
5+
weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation.
6+
title: "Next Steps" # Always the same, html page title.
7+
layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing.
8+
---
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
title: Getting started with Envoy on Google Axion C4A (Arm Neoverse-V2)
3+
4+
weight: 2
5+
6+
layout: "learningpathall"
7+
---
8+
9+
## Google Axion C4A Arm instances in Google Cloud
10+
11+
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.
12+
13+
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.
14+
15+
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.
16+
17+
## Envoy for service proxying and traffic management on Arm
18+
19+
Envoy is an open-source, high-performance edge and service proxy designed for cloud-native applications.
20+
21+
It handles service-to-service communication, traffic routing, load balancing, and observability, making microservices more reliable and secure.
22+
23+
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/).
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
---
2+
title: Envoy baseline testing on Google Axion C4A Arm Virtual machine
3+
weight: 5
4+
5+
### FIXED, DO NOT MODIFY
6+
layout: learningpathall
7+
---
8+
9+
10+
Since Envoy is installed successfully on your GCP C4A Arm virtual machine, follow these steps to validate that the Envoy is running.
11+
12+
## Validate Envoy installation with a baseline test
13+
14+
In this section, we covered how to create a minimal Envoy config, start Envoy with it, and verify functionality using `curl`.
15+
The test confirmed that Envoy listens on port **10000**, forwards requests to `httpbin.org`, and returns a successful **200 OK** response.
16+
17+
### Create a Minimal Configuration File
18+
19+
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.
20+
21+
```YAML
22+
static_resources:
23+
listeners:
24+
- name: listener_0
25+
address:
26+
socket_address:
27+
protocol: TCP
28+
address: 0.0.0.0
29+
port_value: 10000
30+
filter_chains:
31+
- filters:
32+
- name: envoy.filters.network.http_connection_manager
33+
typed_config:
34+
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
35+
stat_prefix: ingress_http
36+
route_config:
37+
name: local_route
38+
virtual_hosts:
39+
- name: backend
40+
domains: ["*"]
41+
routes:
42+
- match:
43+
prefix: "/"
44+
route:
45+
cluster: service_httpbin
46+
host_rewrite_literal: httpbin.org
47+
http_filters:
48+
- name: envoy.filters.http.router
49+
typed_config:
50+
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
51+
clusters:
52+
- name: service_httpbin
53+
connect_timeout: 0.5s
54+
type: LOGICAL_DNS
55+
dns_lookup_family: V4_ONLY
56+
lb_policy: ROUND_ROBIN
57+
load_assignment:
58+
cluster_name: service_httpbin
59+
endpoints:
60+
- lb_endpoints:
61+
- endpoint:
62+
address:
63+
socket_address:
64+
address: httpbin.org
65+
port_value: 80
66+
```
67+
- **Listeners:** Envoy is configured to accept incoming HTTP requests on port **10000** of your VM.
68+
- **HTTP Connection Manager:** A filter processes the incoming requests, directing them to the appropriate backend.
69+
- **Routing:** All traffic is routed to the `service_httpbin` cluster, with the `Host` header rewritten to `httpbin.org`.
70+
- **Clusters:** The `service_httpbin` cluster defines the upstream service as `httpbin.org` on port **80**, which is where requests are ultimately forwarded.
71+
72+
### Run and Test Envoy
73+
74+
This is the final phase of functional validation, confirming that the proxy is operational.
75+
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.
76+
77+
```console
78+
envoy -c envoy_config.yaml --base-id 1
79+
```
80+
The output should look similar to:
81+
82+
```output
83+
[2025-08-21 11:53:51.597][67137][info][config] [source/server/configuration_impl.cc:138] loading 1 listener(s)
84+
[2025-08-21 11:53:51.597][67137][info][config] [source/server/configuration_impl.cc:154] loading stats configuration
85+
[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.
86+
[2025-08-21 11:53:51.598][67137][info][main] [source/server/server.cc:969] starting main dispatch loop
87+
[2025-08-21 11:53:51.599][67137][info][runtime] [source/common/runtime/runtime_impl.cc:614] RTDS has finished initialization
88+
[2025-08-21 11:53:51.599][67137][info][upstream] [source/common/upstream/cluster_manager_impl.cc:240] cm init: all clusters initialized
89+
[2025-08-21 11:53:51.599][67137][info][main] [source/server/server.cc:950] all clusters initialized. initializing init manager
90+
[2025-08-21 11:53:51.599][67137][info][config] [source/common/listener_manager/listener_manager_impl.cc:930] all dependencies initialized. starting workers
91+
```
92+
93+
Now, **Send a test request** from another terminal window to the Envoy listener using `curl`.
94+
95+
```console
96+
curl -v http://localhost:10000/get
97+
```
98+
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.
99+
100+
The output should look similar to:
101+
102+
```output
103+
* Trying 127.0.0.1:10000...
104+
* Connected to 127.0.0.1 (127.0.0.1) port 10000 (#0)
105+
> GET /get HTTP/1.1
106+
> Host: 127.0.0.1:10000
107+
> User-Agent: curl/7.76.1
108+
> Accept: */*
109+
>
110+
* Mark bundle as not supporting multiuse
111+
< HTTP/1.1 200 OK
112+
< date: Fri, 22 Aug 2025 11:20:35 GMT
113+
< content-type: application/json
114+
< content-length: 301
115+
< server: envoy
116+
< access-control-allow-origin: *
117+
< access-control-allow-credentials: true
118+
< x-envoy-upstream-service-time: 1042
119+
<
120+
{
121+
"args": {},
122+
"headers": {
123+
"Accept": "*/*",
124+
"Host": "httpbin.org",
125+
"User-Agent": "curl/7.76.1",
126+
"X-Amzn-Trace-Id": "Root=1-68a85282-10af9cfe0385774600509ddd",
127+
"X-Envoy-Expected-Rq-Timeout-Ms": "15000"
128+
},
129+
"origin": "34.63.220.63",
130+
"url": "http://httpbin.org/get"
131+
}
132+
* Connection #0 to host 127.0.0.1 left intact
133+
```
134+
#### Summary of the curl Output
135+
136+
- **Successful Connection:** The **curl** command successfully connected to the Envoy proxy on **localhost:10000**.
137+
- **Correct Status Code:** Envoy successfully forwarded the request and received a healthy **200 OK** response from the upstream server.
138+
- **Host Header Rewrite:** The **Host** header was correctly rewritten from **localhost:10000** to **httpbin.org** as defined in the configuration.
139+
- **End-to-End Success:** The proxy is fully operational, proving that requests are correctly received, processed, and forwarded to the intended backend.
140+
141+
This confirms the end-to-end flow is working correctly.

0 commit comments

Comments
 (0)