Skip to content

Commit a82ac7d

Browse files
Merge pull request #2798 from DougAnsonAustinTX/helm-tech-review-2
Helm LP Review 2
2 parents 8b6f898 + 31ec5fa commit a82ac7d

8 files changed

Lines changed: 187 additions & 226 deletions

File tree

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: Install and validate Helm on Google Cloud C4A Arm-based VMs
44
draft: true
55
cascade:
66
draft: true
7-
7+
88
minutes_to_complete: 60
99

1010
who_is_this_for: This is an introductory topic intended for developers who want to get hands-on experience using Helm on Linux Arm64 systems, specifically Google Cloud C4A virtual machines powered by Axion processors.

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/baseline.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,18 @@ helm install nginx bitnami/nginx
3333
```
3434
Deploy a simple test app to validate that Helm can create releases on the cluster.
3535

36-
The output is similar to the following (warnings can be safely ignored as they don't affect functionality):
36+
The output is similar to:
3737
```output
3838
NAME: nginx
39-
LAST DEPLOYED: Wed Dec 3 07:34:04 2025
39+
LAST DEPLOYED: Thu Jan 15 20:13:37 2026
4040
NAMESPACE: default
4141
STATUS: deployed
4242
REVISION: 1
4343
TEST SUITE: None
4444
NOTES:
4545
CHART NAME: nginx
46-
CHART VERSION: 22.3.3
47-
APP VERSION: 1.29.3
46+
CHART VERSION: 22.4.3
47+
APP VERSION: 1.29.4
4848
```
4949

5050

@@ -60,7 +60,7 @@ Confirm Helm recorded the release and that the deployment exists.
6060
The output is similar to:
6161
```output
6262
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
63-
nginx default 1 2025-12-09 21:04:15.944165326 +0000 UTC deployed nginx-22.3.3 1.29.3
63+
nginx default 1 2026-01-15 20:13:37.325530458 +0000 UTC deployed nginx-22.4.3 1.29.4
6464
```
6565

6666
Check Kubernetes resources:
@@ -72,13 +72,13 @@ kubectl get svc
7272
The output is similar to:
7373
```output
7474
NAME READY STATUS RESTARTS AGE
75-
nginx-7b9564dc4b-2ghkw 1/1 Running 0 3m5s
75+
nginx-6d597599b8-hrn7t 1/1 Running 0 116s
7676
77-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
78-
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m28s
79-
nginx LoadBalancer 10.96.216.137 <pending> 80:32708/TCP,443:31052/TCP 3m6s
77+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
78+
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m33s
79+
nginx LoadBalancer 10.96.88.148 <pending> 80:30166/TCP,443:32128/TCP 117s
8080
```
81-
All pods should be in the **Running** state. If pods are in **Pending** state, wait 30-60 seconds for container images to download, then retry the commands above.
81+
All pods should be in the **Running** state. If pods are in **Pending** state, wait 30 to 60 seconds for container images to download, then retry the commands above.
8282

8383

8484
## Validate Helm lifecycle

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/benchmarking.md

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ Since Helm does not provide built-in performance metrics, concurrency behavior i
1313

1414
### Prerequisites
1515

16-
{{% notice Note %}} Ensure the local Kubernetes cluster created earlier is running and has sufficient resources to deploy multiple NGINX replicas.{{% /notice %}}
16+
{{% notice Note %}}
17+
Ensure the local Kubernetes cluster created earlier is running and has sufficient resources to deploy multiple NGINX replicas.
18+
{{% /notice %}}
1719

1820
Before starting the benchmark, ensure Helm is installed and the Kubernetes cluster is accessible.
1921

@@ -89,11 +91,7 @@ wait
8991
This step simulates multiple teams deploying applications at the same time.
9092
Helm submits all requests without waiting for pods to fully start.
9193

92-
What this measures:
93-
94-
* Helm concurrency handling
95-
* Kubernetes API responsiveness
96-
* Helm CLI client-side execution behavior on Arm64
94+
This measures Helm concurrency handling, Kubernetes API responsiveness, and Helm CLI client-side execution behavior on Arm64.
9795

9896
You should see an output similar to:
9997
```output
@@ -111,10 +109,7 @@ helm list -n helm-bench
111109
kubectl get pods -n helm-bench
112110
```
113111

114-
Expected:
115-
116-
* All releases in `deployed` state
117-
* Pods in `Running` status
112+
All releases should be in `deployed` state and pods should be in `Running` status.
118113

119114
### Concurrent Helm install benchmark (with --wait)
120115
Run a benchmark that includes workload readiness time.
@@ -143,10 +138,7 @@ sys 0m0.312s
143138

144139
### Metrics to record
145140

146-
- Total elapsed time: overall time taken to complete all installs.
147-
- Number of parallel installs: number of Helm installs run at the same time.
148-
- Failures: any Helm failures or Kubernetes API errors.
149-
- Pod readiness delay: time pods take to become Ready (resource pressure)
141+
Record the following metrics: total elapsed time (overall time taken to complete all installs), number of parallel installs, any failures or Kubernetes API errors, and pod readiness delay (time pods take to become Ready under resource pressure).
150142

151143
### Benchmark summary
152144
Results from the earlier run on the `c4a-standard-4` (4 vCPU, 16 GB memory) Arm64 VM in GCP (SUSE):

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/gke-cluster-for-helm.md

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,7 @@ This setup differs from the earlier KinD-based local cluster, which was intended
1818

1919
## Prerequisites
2020

21-
Before starting, ensure the following are already completed:
22-
23-
- Docker installed
24-
- kubectl installed
25-
- Helm installed
26-
- Google Cloud account available
27-
28-
If Helm and kubectl are not installed, complete the **Install Helm** section first.
21+
Before starting, ensure that Docker, kubectl, and Helm are installed, and that you have a Google Cloud account available. If Helm and kubectl aren't installed, complete the **Install Helm** section first.
2922

3023
### Verify kubectl Installation
3124
Confirm that kubectl is available:
@@ -35,8 +28,17 @@ kubectl version --client
3528
```
3629
You should see an output similar to:
3730
```output
38-
Client Version: version.Info{Major:"1", Minor:"26+", GitVersion:"v1.26.15-dispatcher", GitCommit:"5490d28d307425a9b05773554bd5c037dbf3d492", GitTreeState:"clean", BuildDate:"2024-04-18T22:39:37Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/arm64"}
39-
Kustomize Version: v4.5.7
31+
Client Version: v1.30.1
32+
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
33+
```
34+
35+
### Install Python 3.11
36+
37+
Install python3.11:
38+
39+
```bash
40+
sudo zypper install -y python311
41+
which python3.11
4042
```
4143

4244
### Install Google Cloud SDK (gcloud)
@@ -54,28 +56,48 @@ tar -xvf google-cloud-sdk-460.0.0-linux-arm.tar.gz
5456
```console
5557
./google-cloud-sdk/install.sh
5658
```
57-
Restart the shell or reload the environment if prompted.
59+
60+
The shell will exit. Bring up a new SSH Shell:
61+
```console
62+
exit
63+
```
5864

5965
### Initialize gcloud
6066
Authenticate and configure the Google Cloud CLI:
6167

6268
```console
63-
./google-cloud-sdk/bin/gcloud init
69+
gcloud init
6470
```
6571

66-
During initialization:
72+
During initialization, select **Login with a new account**. You'll be prompted to use your browser to authenticate to Google and receive an auth code to copy back. Select the project you want to use and choose default settings when unsure.
6773

68-
- Log in using a Google account
69-
- Select the correct project
70-
- Choose default settings when unsure
74+
### Get the list of Google project IDs
75+
Retrieve the list of project IDs:
7176

77+
```console
78+
gcloud projects list
79+
```
80+
81+
The output is similar to:
82+
83+
```output
84+
PROJECT_ID NAME PROJECT_NUMBER
85+
arm-lp-test arm-lp-test 834184475014
86+
```
87+
88+
Note the **PROJECT_ID** for the project you want to set as active for use in the next step.
7289
### Set the Active Project
7390
Ensure the correct GCP project is selected:
7491

7592
```console
7693
gcloud config set project YOUR_PROJECT_ID
7794
```
7895

96+
### Install the auth plugin for gcloud
97+
```console
98+
gcloud components install gke-gcloud-auth-plugin
99+
```
100+
79101
### Enable Kubernetes API
80102
Enable the required API for GKE:
81103

@@ -84,18 +106,17 @@ gcloud services enable container.googleapis.com
84106
```
85107

86108
### Create a GKE Cluster
87-
Create a Kubernetes cluster that will host Helm deployments.
109+
Create a Kubernetes cluster to host Helm deployments. Replace `YOUR_PROJECT_ID` with the project ID you set previously.
88110

89111
```console
90112
gcloud container clusters create helm-arm64-cluster \
91113
--zone us-central1-a \
92114
--machine-type c4a-standard-4 \
93-
--num-nodes 2
115+
--num-nodes 2 \
116+
--no-enable-ip-alias
94117
```
95118

96-
- This creates a standard GKE cluster
97-
- Node count and machine type can be adjusted later
98-
- Arm64 compatibility depends on available node types in the region
119+
This creates a standard GKE cluster. You can adjust the node count and machine type later as needed.
99120

100121
### Configure kubectl Access to GKE
101122
Fetch cluster credentials:
@@ -119,16 +140,11 @@ gke-helm-arm64-cluster-default-pool-f4ab8a2d-5h6f Ready <none> 5h54m v1
119140
gke-helm-arm64-cluster-default-pool-f4ab8a2d-5ldp Ready <none> 5h54m v1.33.5-gke.1308000
120141
```
121142

122-
- Nodes in Ready state
123-
- Kubernetes control plane accessible
143+
All nodes should be in **Ready** state and the Kubernetes control plane should be accessible.
124144

125-
### Outcome
126-
At this point:
145+
## What you've accomplished and what's next
127146

128-
- Google Cloud SDK is installed and configured
129-
- GKE cluster is running
130-
- kubectl is connected to the cloud cluster
131-
- Helm is ready to deploy applications on GKE
147+
You've successfully prepared your GKE environment by installing and configuring the Google Cloud SDK, creating a GKE cluster, connecting kubectl to the cluster, and verifying cluster access. Your environment is now ready to deploy applications using Helm charts.
132148

133-
The environment is now prepared to deploy Helm charts.
149+
Next, you'll deploy PostgreSQL on your GKE cluster using a custom Helm chart with persistent storage and secure credentials.
134150

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/installation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ helm version
9393

9494
You should see an output similar to:
9595
```output
96-
version.BuildInfo{Version:"v3.19.2", GitCommit:"8766e718a0119851f10ddbe4577593a45fadf544", GitTreeState:"clean", GoVersion:"go1.24.9"}
96+
version.BuildInfo{Version:"v3.19.4", GitCommit:"7cfb6e486dac026202556836bb910c37d847793e", GitTreeState:"clean", GoVersion:"go1.24.11"}
9797
```
9898

9999
## Install KinD

content/learning-paths/servers-and-cloud-computing/helm-on-gcp/nginx-helm.md

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,9 @@ weight: 9
66
layout: learningpathall
77
---
88

9-
## NGINX Deployment Using Custom Helm Chart
10-
This document explains how to deploy NGINX as a frontend service on Kubernetes using a custom Helm chart.
9+
## Deploy NGINX using a custom Helm chart
1110

12-
## Goal
13-
After completing this guide, the environment will include:
14-
15-
- NGINX deployed using Helm
16-
- Public access using a LoadBalancer service
17-
- External IP available for browser access
18-
- Foundation for connecting backend services (Redis, PostgreSQL)
11+
This section explains how to deploy NGINX as a frontend service on Kubernetes using a custom Helm chart. After completing this section, you'll have NGINX deployed using Helm with public access through a LoadBalancer service, providing an external IP for browser access and a foundation for connecting backend services like Redis and PostgreSQL.
1912

2013
### Create Helm Chart
2114
Generates a Helm chart skeleton that will be customized for NGINX.
@@ -34,13 +27,8 @@ my-nginx/
3427
```
3528

3629
### Configure values.yaml
37-
Defines configurable parameters such as:
38-
39-
- NGINX image
40-
- Service type
41-
- Public port
4230

43-
Replace the contents of `my-nginx/values.yaml` with:
31+
Replace the contents of `my-nginx/values.yaml` with the following to define configurable parameters including the NGINX image, service type, and public port:
4432
```yaml
4533
image:
4634
repository: nginx
@@ -51,20 +39,11 @@ service:
5139
port: 80
5240
```
5341
54-
That matters
55-
56-
- Centralizes configuration
57-
- Allows service exposure without editing templates
58-
- Simplifies future changes
59-
60-
### Deployment Definition (deployment.yaml)
61-
Defines how the NGINX container runs inside Kubernetes, including:
42+
This configuration centralizes settings, allows service exposure without editing templates, and simplifies future changes.
6243
63-
- Container image
64-
- Pod labels
65-
- Port exposure
44+
### Deployment definition (deployment.yaml)
6645
67-
Replace `my-nginx/templates/deployment.yaml` completely:
46+
Replace the entire contents of `my-nginx/templates/deployment.yaml` with the following to define how the NGINX container runs inside Kubernetes, including the container image, pod labels, and port exposure:
6847

6948
```yaml
7049
apiVersion: apps/v1
@@ -91,10 +70,9 @@ spec:
9170
- containerPort: 80
9271
```
9372

94-
### Service Definition (service.yaml)
95-
Exposes NGINX to external traffic using a Kubernetes LoadBalancer.
73+
### Service definition (service.yaml)
9674

97-
Replace `my-nginx/templates/service.yaml` with:
75+
Replace the entire contents of `my-nginx/templates/service.yaml` with the following to expose NGINX to external traffic using a Kubernetes LoadBalancer:
9876

9977
```yaml
10078
apiVersion: v1
@@ -109,11 +87,7 @@ spec:
10987
app: {{ include "my-nginx.name" . }}
11088
```
11189

112-
Why LoadBalancer:
113-
114-
- Provides a public IP
115-
- Required for browser access
116-
- Common pattern for frontend services
90+
A LoadBalancer provides a public IP required for browser access and is a common pattern for frontend services.
11791

11892
### Install & Access
11993

@@ -135,14 +109,15 @@ NOTES:
135109
echo http://$SERVICE_IP:80
136110
```
137111

138-
### Access NGINX from Browser
139-
Get External IP
112+
### Access NGINX from a browser
113+
114+
Get the external IP by running the following command:
140115

141116
```console
142117
kubectl get svc
143118
```
144119

145-
Wait until EXTERNAL-IP is assigned.
120+
Wait until **EXTERNAL-IP** is assigned.
146121

147122
```output
148123
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
@@ -152,21 +127,19 @@ postgres-app-my-postgres ClusterIP 34.118.225.2 <none> 5432/
152127
redis-my-redis ClusterIP 34.118.234.155 <none> 6379/TCP 6m53s
153128
```
154129

155-
**Open in browser:**
130+
Open the external IP in your browser:
156131

157132
```bash
158-
http://<EXTERNAL-IP>
133+
http://<EXTERNAL-IP>
159134
```
160135

161-
You should see the default NGINX welcome page as shown below:
136+
You should see the default NGINX welcome page:
137+
138+
![NGINX default welcome page displayed in a web browser showing the welcome message and basic NGINX information#center](images/nginx-browser.png "NGINX welcome page")
162139

163-
![NGINX default welcome page in a web browser on an GCP VM alt-text#center](images/nginx-browser.png)
140+
## What you've accomplished and what's next
164141

165-
### Outcome
166-
This deployment achieves the following:
142+
You've successfully deployed NGINX as a frontend service using a custom Helm chart. The deployment includes public access through a LoadBalancer with an external IP, and the infrastructure is ready to route traffic to backend services.
167143

168-
- NGINX deployed using a custom Helm chart
169-
- Public access enabled via LoadBalancer
170-
- External IP available for frontend access
171-
- Ready to route traffic to backend services
144+
This completes the helm-on-gcp Learning Path. You've learned how to install and configure Helm on Google Cloud C4A Arm-based virtual machines, create and manage GKE clusters, deploy applications using both official and custom Helm charts, and validate Helm workflows on Arm64-based Kubernetes infrastructure.
172145

0 commit comments

Comments
 (0)