Skip to content

Commit 1083a39

Browse files
committed
Updated Helm learning path to include GKE and Helm-based app deployments
Signed-off-by: odidev <odidev@puresoftware.com>
1 parent f5c52b4 commit 1083a39

7 files changed

Lines changed: 784 additions & 6 deletions

File tree

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
---
22
title: Install and validate Helm on Google Cloud C4A Arm-based VMs
33

4-
minutes_to_complete: 45
4+
minutes_to_complete: 60
55

66
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.
77

88

99
learning_objectives:
1010
- Provision an Arm-based SUSE Linux Enterprise Server (SLES) virtual machine on Google Cloud (C4A with Axion processors)
11-
- Install Helm and kubectl on a SUSE Arm64 (C4A) instance
12-
- Create and validate a local Kubernetes cluster (KinD) on Arm64
13-
- Verify Helm functionality by performing install, upgrade, and uninstall workflows
11+
- Install and configure Helm and kubectl on a SUSE Arm64 (C4A) instance
12+
- Create and connect to a Google Kubernetes Engine (GKE) cluster running on Arm-based nodes
13+
- Deploy PostgreSQL, Redis, and NGINX on GKE using official Helm charts
14+
- Validate Helm workflows by performing install, upgrade, rollback, and uninstall operations
15+
- Verify application readiness and service access for PostgreSQL, Redis, and NGINX on GKE
1416
- Observe Helm behavior under concurrent CLI operations on an Arm64-based Kubernetes cluster
1517

1618
prerequisites:
@@ -32,8 +34,11 @@ armips:
3234
tools_software_languages:
3335
- Helm
3436
- Kubernetes
35-
- KinD
3637
- kubectl
38+
- GKE
39+
- PostgreSQL
40+
- Redis
41+
- NGINX
3742

3843
operatingsystems:
3944
- Linux
@@ -57,6 +62,11 @@ further_reading:
5762
link: https://kubernetes.io/docs/
5863
type: documentation
5964

65+
- resource:
66+
title: Bitnami Helm Charts
67+
link: https://github.com/bitnami/charts
68+
type: documentation
69+
6070
weight: 1
6171
layout: "learningpathall"
6272
learning_path_main_page: "yes"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Benchmark Helm concurrency on a Google Axion C4A virtual machine
3-
weight: 6
3+
weight: 10
44

55
### FIXED, DO NOT MODIFY
66
layout: learningpathall
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
---
2+
title: Prepare GKE Cluster for Helm Deployments
3+
weight: 6
4+
5+
### FIXED, DO NOT MODIFY
6+
layout: learningpathall
7+
---
8+
9+
## Overview
10+
This section explains how to prepare a **Google Kubernetes Engine (GKE) cluster** for deploying Helm charts.
11+
The prepared GKE cluster is used to deploy the following services using custom Helm charts:
12+
13+
- PostgreSQL
14+
- Redis
15+
- NGINX
16+
17+
This setup differs from the earlier KinD-based local cluster, which was intended only for local validation.
18+
19+
## Prerequisites
20+
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.
29+
30+
### Verify kubectl Installation
31+
Confirm that kubectl is available:
32+
33+
```console
34+
kubectl version --client
35+
```
36+
You should see an output similar to:
37+
```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
40+
```
41+
42+
### Install Google Cloud SDK (gcloud)
43+
The Google Cloud SDK is required to create and manage GKE clusters.
44+
45+
**Download and extract:**
46+
47+
```console
48+
wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-460.0.0-linux-arm.tar.gz
49+
tar -xvf google-cloud-sdk-460.0.0-linux-arm.tar.gz
50+
```
51+
52+
**Install gcloud:**
53+
54+
```console
55+
./google-cloud-sdk/install.sh
56+
```
57+
Restart the shell or reload the environment if prompted.
58+
59+
### Initialize gcloud
60+
Authenticate and configure the Google Cloud CLI:
61+
62+
```console
63+
./google-cloud-sdk/bin/gcloud init
64+
```
65+
66+
During initialization:
67+
68+
- Log in using a Google account
69+
- Select the correct project
70+
- Choose default settings when unsure
71+
72+
### Set the Active Project
73+
Ensure the correct GCP project is selected:
74+
75+
```console
76+
gcloud config set project YOUR_PROJECT_ID
77+
```
78+
79+
### Enable Kubernetes API
80+
Enable the required API for GKE:
81+
82+
```console
83+
gcloud services enable container.googleapis.com
84+
```
85+
86+
### Create a GKE Cluster
87+
Create a Kubernetes cluster that will host Helm deployments.
88+
89+
```console
90+
gcloud container clusters create helm-arm64-cluster \
91+
--zone us-central1-a \
92+
--machine-type c4a-standard-4 \
93+
--num-nodes 2
94+
```
95+
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
99+
100+
### Configure kubectl Access to GKE
101+
Fetch cluster credentials:
102+
103+
```console
104+
gcloud container clusters get-credentials helm-arm64-cluster \
105+
--zone us-central1-a
106+
```
107+
108+
### Verify Cluster Access
109+
Confirm Kubernetes access:
110+
111+
```console
112+
kubectl get nodes
113+
```
114+
115+
You should see an output similar to:
116+
```output
117+
NAME STATUS ROLES AGE VERSION
118+
gke-helm-arm64-cluster-default-pool-f4ab8a2d-5h6f Ready <none> 5h54m v1.33.5-gke.1308000
119+
gke-helm-arm64-cluster-default-pool-f4ab8a2d-5ldp Ready <none> 5h54m v1.33.5-gke.1308000
120+
```
121+
122+
- Nodes in Ready state
123+
- Kubernetes control plane accessible
124+
125+
### Outcome
126+
At this point:
127+
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
132+
133+
The environment is now prepared to deploy Helm charts.
134+
45.6 KB
Loading
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
---
2+
title: NGINX Deployment Using Custom Helm Chart
3+
weight: 9
4+
5+
### FIXED, DO NOT MODIFY
6+
layout: learningpathall
7+
---
8+
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.
11+
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)
19+
20+
### Create Helm Chart
21+
Generates a Helm chart skeleton that will be customized for NGINX.
22+
23+
```console
24+
helm create my-nginx
25+
```
26+
27+
### Resulting structure
28+
29+
```text
30+
my-nginx/
31+
├── Chart.yaml
32+
├── values.yaml
33+
└── templates/
34+
```
35+
36+
### Configure values.yaml
37+
Defines configurable parameters such as:
38+
39+
- NGINX image
40+
- Service type
41+
- Public port
42+
43+
Replace the contents of `my-nginx/values.yaml` with:
44+
```yaml
45+
image:
46+
repository: nginx
47+
tag: latest
48+
49+
service:
50+
type: LoadBalancer
51+
port: 80
52+
```
53+
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:
62+
63+
- Container image
64+
- Pod labels
65+
- Port exposure
66+
67+
Replace `my-nginx/templates/deployment.yaml` completely:
68+
69+
```yaml
70+
apiVersion: apps/v1
71+
kind: Deployment
72+
metadata:
73+
name: {{ include "my-nginx.fullname" . }}
74+
75+
spec:
76+
replicas: 1
77+
selector:
78+
matchLabels:
79+
app: {{ include "my-nginx.name" . }}
80+
81+
template:
82+
metadata:
83+
labels:
84+
app: {{ include "my-nginx.name" . }}
85+
86+
spec:
87+
containers:
88+
- name: nginx
89+
image: nginx
90+
ports:
91+
- containerPort: 80
92+
```
93+
94+
### Service Definition (service.yaml)
95+
Exposes NGINX to external traffic using a Kubernetes LoadBalancer.
96+
97+
Replace `my-nginx/templates/service.yaml` with:
98+
99+
```yaml
100+
apiVersion: v1
101+
kind: Service
102+
metadata:
103+
name: {{ include "my-nginx.fullname" . }}
104+
spec:
105+
type: LoadBalancer
106+
ports:
107+
- port: 80
108+
selector:
109+
app: {{ include "my-nginx.name" . }}
110+
```
111+
112+
Why LoadBalancer:
113+
114+
- Provides a public IP
115+
- Required for browser access
116+
- Common pattern for frontend services
117+
118+
### Install & Access
119+
120+
```console
121+
helm install nginx ./my-nginx
122+
```
123+
124+
```output
125+
NAME: nginx
126+
LAST DEPLOYED: Tue Jan 6 07:55:52 2026
127+
NAMESPACE: default
128+
STATUS: deployed
129+
REVISION: 1
130+
NOTES:
131+
1. Get the application URL by running these commands:
132+
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
133+
You can watch its status by running 'kubectl get --namespace default svc -w nginx-my-nginx'
134+
export SERVICE_IP=$(kubectl get svc --namespace default nginx-my-nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
135+
echo http://$SERVICE_IP:80
136+
```
137+
138+
### Access NGINX from Browser
139+
Get External IP
140+
141+
```console
142+
kubectl get svc
143+
```
144+
145+
Wait until EXTERNAL-IP is assigned.
146+
147+
```output
148+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
149+
kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 3h22m
150+
nginx-my-nginx LoadBalancer 34.118.239.19 34.63.103.125 80:31501/TCP 52s
151+
postgres-app-my-postgres ClusterIP 34.118.225.2 <none> 5432/TCP 13m
152+
redis-my-redis ClusterIP 34.118.234.155 <none> 6379/TCP 6m53s
153+
```
154+
155+
**Open in browser:**
156+
157+
```bash
158+
http://<EXTERNAL-IP>
159+
```
160+
161+
You should see the default NGINX welcome page as shown below:
162+
163+
![NGINX default welcome page in a web browser on an GCP VM alt-text#center](images/nginx-browser.png)
164+
165+
### Outcome
166+
This deployment achieves the following:
167+
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
172+

0 commit comments

Comments
 (0)