Skip to content

Commit 53b1fc2

Browse files
Merge pull request #2801 from DougAnsonAustinTX/helm-tech-review-2
Helm tech review 2 - additional updates
2 parents f3537ed + 185d611 commit 53b1fc2

4 files changed

Lines changed: 104 additions & 44 deletions

File tree

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,64 @@ gke-helm-arm64-cluster-default-pool-f4ab8a2d-5ldp Ready <none> 5h54m v1
142142

143143
All nodes should be in **Ready** state and the Kubernetes control plane should be accessible.
144144

145+
### Taint the cluster nodes for arm64 support
146+
147+
Taint the nodes to ensure proper scheduling on arm64 VMs. For each node starting with **gke**, run the following taint command.
148+
149+
{{% notice Note %}}
150+
Note the required "-" at the end... its needed!
151+
{{% /notice %}}
152+
153+
For example using the node IDs in the output above:
154+
155+
```console
156+
kubectl taint nodes gke-helm-arm64-cluster-default-pool-f4ab8a2d-5h6f kubernetes.io/arch=arm64:NoSchedule-
157+
kubectl taint nodes gke-helm-arm64-cluster-default-pool-f4ab8a2d-5ldp kubernetes.io/arch=arm64:NoSchedule-
158+
```
159+
160+
Replace the node names with your actual node names from the previous command output.
161+
162+
### Create hyperdisk storage class for our cluster
163+
164+
In order to use the c4a architecture with our cluster, a new storage class must be created.
165+
166+
Create a new file, hyperdisk.yaml, with this content:
167+
```yaml
168+
apiVersion: storage.k8s.io/v1
169+
kind: StorageClass
170+
metadata:
171+
name: my-hyperdisk-sc
172+
provisioner: pd.csi.storage.gke.io
173+
parameters:
174+
type: hyperdisk-balanced # Or hyperdisk-ssd, etc.
175+
reclaimPolicy: Delete
176+
volumeBindingMode: WaitForFirstConsumer
177+
```
178+
179+
Apply the hyperdisk.yaml file to the cluster:
180+
181+
```console
182+
kubectl apply -f ./hyperdisk.yaml
183+
```
184+
185+
Confirm that the new storage class has been added:
186+
187+
```console
188+
kubectl get storageclass
189+
```
190+
191+
The output should contain the new **my-hyperdisk-sc** storage class:
192+
193+
```output
194+
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
195+
my-hyperdisk-sc pd.csi.storage.gke.io Delete WaitForFirstConsumer false 7m27s
196+
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 20m
197+
standard kubernetes.io/gce-pd Delete Immediate true 20m
198+
standard-rwo (default) pd.csi.storage.gke.io Delete WaitForFirstConsumer true 20m
199+
```
200+
201+
The new storage class will be used in the next section.
202+
145203
## What you've accomplished and what's next
146204

147205
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.

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

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ my-nginx/
2626
└── templates/
2727
```
2828

29+
### Clean templates
30+
31+
The default Helm chart includes several files that aren't required for a basic Nginx deployment. Remove the following files from `my-nginx/templates/` to avoid unnecessary complexity and template errors: ingress.yaml, hpa.yaml, serviceaccount.yaml, tests/, NOTES.txt, and httproute.yaml.
32+
33+
```console
34+
cd ./my-nginx/templates
35+
rm -rf hpa.yaml ingress.yaml serviceaccount.yaml tests/ NOTES.txt httproute.yaml
36+
cd $HOME/helm-microservices
37+
```
38+
39+
Only ngnix-specific templates will be maintained.
40+
2941
### Configure values.yaml
3042

3143
Replace the contents of `my-nginx/values.yaml` with the following to define configurable parameters including the NGINX image, service type, and public port:
@@ -92,21 +104,17 @@ A LoadBalancer provides a public IP required for browser access and is a common
92104
### Install & Access
93105

94106
```console
107+
cd $HOME/helm-microservices
95108
helm install nginx ./my-nginx
96109
```
97110

98111
```output
99112
NAME: nginx
100-
LAST DEPLOYED: Tue Jan 6 07:55:52 2026
113+
LAST DEPLOYED: Tue Jan 20 20:07:47 2026
101114
NAMESPACE: default
102115
STATUS: deployed
103116
REVISION: 1
104-
NOTES:
105-
1. Get the application URL by running these commands:
106-
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
107-
You can watch its status by running 'kubectl get --namespace default svc -w nginx-my-nginx'
108-
export SERVICE_IP=$(kubectl get svc --namespace default nginx-my-nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
109-
echo http://$SERVICE_IP:80
117+
TEST SUITE: None
110118
```
111119

112120
### Access NGINX from a browser
@@ -120,11 +128,11 @@ kubectl get svc
120128
Wait until **EXTERNAL-IP** is assigned.
121129

122130
```output
123-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
124-
kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 3h22m
125-
nginx-my-nginx LoadBalancer 34.118.239.19 34.63.103.125 80:31501/TCP 52s
126-
postgres-app-my-postgres ClusterIP 34.118.225.2 <none> 5432/TCP 13m
127-
redis-my-redis ClusterIP 34.118.234.155 <none> 6379/TCP 6m53s
131+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
132+
kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 42m
133+
nginx-my-nginx LoadBalancer 34.118.238.110 34.61.85.5 80:30954/TCP 69s
134+
postgres-app-my-postgres ClusterIP 34.118.233.240 <none> 5432/TCP 27m
135+
redis-my-redis ClusterIP 34.118.229.221 <none> 6379/TCP 8m24s
128136
```
129137

130138
Open the external IP in your browser:

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

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ This approach prevents hard-coding credentials and follows Kubernetes security b
105105

106106
### Create pvc.yaml
107107

108-
Create `my-postgres/templates/pvc.yaml` with the following content to request persistent storage so PostgreSQL data remains available even if the pod restarts:
108+
Create `my-postgres/templates/pvc.yaml` with the following content to request persistent storage so PostgreSQL data remains available even if the pod restarts. Note the specification of the storage class that will be used **my-hyperdisk-sc** which was created and added to our cluster in the previous section. This hyperdisk-based storage class is required for the c4a architecture:
109109

110110
```yaml
111111
apiVersion: v1
@@ -115,6 +115,7 @@ metadata:
115115
spec:
116116
accessModes:
117117
- ReadWriteOnce
118+
storageClassName: my-hyperdisk-sc
118119
resources:
119120
requests:
120121
storage: {{ .Values.persistence.size }}
@@ -211,31 +212,6 @@ REVISION: 1
211212
TEST SUITE: None
212213
```
213214

214-
### Taint the nodes
215-
216-
Taint the nodes to ensure proper scheduling. First, list the nodes:
217-
218-
```console
219-
kubectl get nodes
220-
```
221-
222-
The output is similar to:
223-
224-
```output
225-
NAME STATUS ROLES AGE VERSION
226-
gke-helm-arm64-cluster-default-pool-7400f0d3-dq80 Ready <none> 10m v1.33.5-gke.2072000
227-
gke-helm-arm64-cluster-default-pool-7400f0d3-v3c9 Ready <none> 10m v1.33.5-gke.2072000
228-
```
229-
230-
For each node starting with **gke**, run the taint command. For example:
231-
232-
```console
233-
kubectl taint nodes gke-helm-arm64-cluster-default-pool-7400f0d3-dq80 kubernetes.io/arch=arm64:NoSchedule-
234-
kubectl taint nodes gke-helm-arm64-cluster-default-pool-7400f0d3-v3c9 kubernetes.io/arch=arm64:NoSchedule-
235-
```
236-
237-
Replace the node names with your actual node names from the previous command output.
238-
239215
### Check the runtime status
240216

241217
Check the pod and PVC status:

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ my-redis/
2929

3030
### Clean templates
3131

32-
The default Helm chart includes several files that aren't required for a basic Redis deployment. Remove the following files from `my-redis/templates/` to avoid unnecessary complexity and template errors: ingress.yaml, hpa.yaml, serviceaccount.yaml, tests/, and NOTES.txt.
32+
The default Helm chart includes several files that aren't required for a basic Redis deployment. Remove the following files from `my-redis/templates/` to avoid unnecessary complexity and template errors: ingress.yaml, hpa.yaml, serviceaccount.yaml, tests/, NOTES.txt, and httproute.yaml.
3333

3434
```console
3535
cd ./my-redis/templates
36-
rm -rf hpa.yaml ingress.yaml serviceaccount.yaml tests/ NOTES.txt
36+
rm -rf hpa.yaml ingress.yaml serviceaccount.yaml tests/ NOTES.txt httproute.yaml
3737
cd $HOME/helm-microservices
3838
```
3939

@@ -113,9 +113,15 @@ ClusterIP is used because Redis is intended for internal communication only with
113113
Install Redis and validate that it's running and responding correctly:
114114

115115
```console
116+
cd $HOME/helm-microservices
116117
helm install redis ./my-redis
118+
```
119+
120+
Confirm that the redis pod is operating:
121+
122+
```console
123+
kubectl get pods
117124
kubectl get svc
118-
kubectl exec -it <redis-pod> -- redis-cli ping
119125
```
120126

121127
You should see an output similar to:
@@ -124,13 +130,25 @@ NAME READY STATUS RESTARTS AGE
124130
postgres-app-my-postgres-6dbc8759b6-jgpxs 1/1 Running 0 6m38s
125131
redis-my-redis-75c88646fb-6lz8v 1/1 Running 0 13s
126132
127-
>kubectl get svc
128-
redis-my-redis ClusterIP 34.118.234.155 <none> 6379/TCP 6m14s
133+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
134+
kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 37m
135+
postgres-app-my-postgres ClusterIP 34.118.233.240 <none> 5432/TCP 22m
136+
redis-my-redis ClusterIP 34.118.229.221 <none> 6379/TCP 3m19s
137+
```
138+
139+
Finally, execute a sample ping via redis:
129140

130-
> kubectl exec -it redis-my-redis-75c88646fb-6lz8v -- redis-cli ping
141+
```console
142+
kubectl exec -it <redis-pod> -- redis-cli ping
143+
```
144+
145+
You should see an output similar to:
146+
147+
```output
131148
PONG
132149
```
133150

151+
134152
The Redis pod should be in **Running** state and the service should be **ClusterIP** type.
135153

136154
## What you've accomplished and what's next

0 commit comments

Comments
 (0)