<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gerald Mtetwa</title>
    <description>The latest articles on DEV Community by Gerald Mtetwa (@gerald475).</description>
    <link>https://dev.to/gerald475</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3429524%2F681db40e-03ad-4bd0-a975-e964a0f06e7e.png</url>
      <title>DEV Community: Gerald Mtetwa</title>
      <link>https://dev.to/gerald475</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gerald475"/>
    <language>en</language>
    <item>
      <title>From CrashLoopBackOff to Hello World: Deploying a Flask App on GKE</title>
      <dc:creator>Gerald Mtetwa</dc:creator>
      <pubDate>Tue, 12 Aug 2025 11:26:55 +0000</pubDate>
      <link>https://dev.to/gerald475/from-crashloopbackoff-to-hello-world-deploying-a-flask-app-on-gke-35cm</link>
      <guid>https://dev.to/gerald475/from-crashloopbackoff-to-hello-world-deploying-a-flask-app-on-gke-35cm</guid>
      <description>&lt;p&gt;🚀 Project Overview&lt;br&gt;
Tech stack:&lt;/p&gt;

&lt;p&gt;Flask – Python web framework&lt;/p&gt;

&lt;p&gt;Docker – Containerizing the app&lt;/p&gt;

&lt;p&gt;Kubernetes – Orchestrating the containers&lt;/p&gt;

&lt;p&gt;Google Kubernetes Engine (GKE) – Running everything in the cloud&lt;/p&gt;

&lt;p&gt;Goal: Deploy a Python Flask app that greets users, using Kubernetes on GCP.&lt;/p&gt;

&lt;p&gt;📦 Step 1 – The Flask App&lt;br&gt;
Here’s the simple app (app.py):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, my name is Gerald. What is your name?"

@app.route('/greet', methods=['POST'])
def greet():
    user_name = request.form.get('name', 'Guest')
    return f"Hello {user_name}!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why port 80?&lt;br&gt;
Because Kubernetes services often route HTTP traffic to port 80 by default — using another port caused issues later.&lt;/p&gt;

&lt;p&gt;🐳 Step 2 – Dockerizing the App&lt;br&gt;
Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Use the official Python image
FROM python:3.12-slim

# Set working directory
WORKDIR /app

# Copy files
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# Expose port 80
EXPOSE 80

# Start the app
CMD ["python", "app.py"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build &amp;amp; Push to Artifact Registry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t africa-south1-docker.pkg.dev/k8s-project-468723/my-docker-repo/my-python-app:v1 .
docker push africa-south1-docker.pkg.dev/k8s-project-468723/my-docker-repo/my-python-app:v1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;☸ Step 3 – Kubernetes Deployment&lt;br&gt;
deployment.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-python-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-python-app
  template:
    metadata:
      labels:
        app: my-python-app
    spec:
      containers:
      - name: my-python-app
        image: africa-south1-docker.pkg.dev/k8s-project-468723/my-docker-repo/my-python-app:v1
        ports:
        - containerPort: 80

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f deployment.yaml

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expose it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl expose deployment my-python-app \
  --type=LoadBalancer \
  --port 80 \
  --target-port 80

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠 Debugging the CrashLoopBackOff&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CrashLoopBackOff
At first, pods kept failing:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -l app=my-python-app
# STATUS: CrashLoopBackOff


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs showed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python: can't open file '/app/app.py': [Errno 2] No such file or directory

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Fix: My main file was actually named gerald.py. Either rename it to app.py or update the CMD in the Dockerfile to run the correct file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wrong Port
Originally, Flask ran on port 5000.
Since the Kubernetes Service was exposing port 80, the app never responded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ Fix: Changed Flask to run on port 80 and updated the Dockerfile to expose port 80.&lt;/p&gt;

&lt;p&gt;🎉 Final Result&lt;br&gt;
After fixing the filename and port&lt;/p&gt;

&lt;p&gt;Opening the external IP in the browser showed:&lt;/p&gt;

&lt;p&gt;Hello, my name is Gerald. What is your name?&lt;/p&gt;

&lt;p&gt;💡 Lessons Learned&lt;br&gt;
Match your container port and service target port — they must align.&lt;/p&gt;

&lt;p&gt;Always check pod logs (kubectl logs) for clues.&lt;/p&gt;

&lt;p&gt;Keep filenames consistent between your code and Docker configuration.&lt;/p&gt;

&lt;p&gt;Start small — test locally before pushing to Kubernetes.&lt;/p&gt;

&lt;p&gt;📂 See the Code&lt;br&gt;
Full project available on GitHub: &lt;a href="https://github.com/gerald475/simple-python-app" rel="noopener noreferrer"&gt;https://github.com/gerald475/simple-python-app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 Have you ever battled CrashLoopBackOff?&lt;br&gt;
Share your experience in the comments — let's help each other debug faster!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvlsur52kcje8if4ovs8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvlsur52kcje8if4ovs8.png" alt=" " width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>gke</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
