# Basic Pod Example with Detailed Comments
# This example shows a simple nginx pod with health checks and resource limits
#
# 🎯 What this does: Creates a single nginx web server pod that:
# - Runs nginx web server on port 80
# - Has health checks to ensure it's working
# - Has resource limits to prevent it from consuming too much CPU/memory
# - Includes security best practices
#
# 📚 EDUCATIONAL EXAMPLE (not from your codebase)
# This is a learning example. Your codebase uses Helm charts and Deployments instead of direct Pods.
#
# ⚠️  IMPORTANT: Direct Pod creation is NOT good practice for production!
# This example is for learning purposes only. In production, you should use:
# - Deployments (for applications)
# - StatefulSets (for databases)
# - Helm charts (for complex applications)
# - kubectl apply (for declarative deployments)

apiVersion: v1                    # ← Kubernetes API version for Pod resources
kind: Pod                        # ← Resource type: Pod (smallest deployable unit)
metadata:                         # ← Metadata section: describes the pod
  name: nginx-pod                # ← Unique name for this pod in the namespace
  namespace: default             # ← Namespace where pod will be created (default if not specified)
  labels:                        # ← Labels for organizing and selecting pods
    app: nginx                   # ← Label: identifies this as an nginx application
    version: v1                 # ← Label: version of the application
    environment: development    # ← Label: environment this pod runs in
spec:                           # ← Specification: defines what the pod should do
  containers:                   # ← List of containers in this pod
  - name: nginx                 # ← Container name (used for logs, exec, etc.)
    image: nginx:latest         # ← Docker image to run (nginx with latest tag)
    ports:                      # ← Ports the container exposes
    - containerPort: 80         # ← Port 80 inside the container (nginx default)
      name: http                # ← Name for this port (useful for service references)
      protocol: TCP             # ← Protocol (TCP is default)

    # 🔧 Resource Management
    # These limits prevent the pod from consuming too many resources
    # Think of it like setting a budget for CPU and memory usage
    resources:
      requests:                 # ← Minimum resources guaranteed to the pod
        memory: "64Mi"          # ← 64 megabytes of RAM (minimum guaranteed)
        cpu: "250m"             # ← 0.25 CPU cores (250 millicores = 25% of 1 CPU)
      limits:                   # ← Maximum resources the pod can use
        memory: "128Mi"         # ← 128 megabytes of RAM (maximum allowed)
        cpu: "500m"             # ← 0.5 CPU cores (500 millicores = 50% of 1 CPU)

    # 🏥 Health Checks
    # These tell Kubernetes how to check if the pod is healthy
    # Like a doctor checking your vital signs!
    livenessProbe:              # ← Checks if the pod is alive (restarts if failed)
      httpGet:                  # ← Use HTTP GET request to check health
        path: /                 # ← Check the root path of nginx
        port: 80               # ← Check on port 80
      initialDelaySeconds: 30   # ← Wait 30 seconds before first check (nginx startup time)
      periodSeconds: 10         # ← Check every 10 seconds
      timeoutSeconds: 5         # ← Fail if response takes longer than 5 seconds
      failureThreshold: 3       # ← Restart pod after 3 consecutive failures

    readinessProbe:             # ← Checks if the pod is ready to receive traffic
      httpGet:                  # ← Use HTTP GET request to check readiness
        path: /                 # ← Check the root path
        port: 80               # ← Check on port 80
      initialDelaySeconds: 5   # ← Wait 5 seconds before first check
      periodSeconds: 5         # ← Check every 5 seconds
      timeoutSeconds: 3        # ← Fail if response takes longer than 3 seconds
      failureThreshold: 3      # ← Mark as not ready after 3 consecutive failures

    # 🔒 Security Context
    # These settings make the pod more secure
    # Like locking your doors and windows!
    securityContext:
      allowPrivilegeEscalation: false  # ← Prevent the container from gaining root privileges
      readOnlyRootFilesystem: true    # ← Make the root filesystem read-only (more secure)
      capabilities:                   # ← Remove unnecessary Linux capabilities
        drop:                         # ← Drop these capabilities
        - ALL                         # ← Drop ALL capabilities (most restrictive)
      runAsNonRoot: true              # ← Don't run as root user
      runAsUser: 101                 # ← Run as user ID 101 (nginx user)

    # 📁 Volume Mounts
    # These allow the container to access files from the pod
    volumeMounts:
    - name: tmp-volume           # ← Name of the volume to mount
      mountPath: /tmp            # ← Where to mount it inside the container
      readOnly: false            # ← Allow read/write access

  # 💾 Volumes
  # These define storage that can be mounted into containers
  volumes:
  - name: tmp-volume             # ← Volume name (matches volumeMounts above)
    emptyDir: {}                # ← Empty directory volume (temporary, deleted when pod dies)
    # emptyDir creates a temporary directory that exists as long as the pod exists
    # Perfect for temporary files, caches, etc.

# 🚀 How to use this (FOR LEARNING ONLY):
# kubectl apply -f basic-pod.yaml
# kubectl get pods                    # Check if pod is running
# kubectl logs nginx-pod              # View nginx logs
# kubectl port-forward nginx-pod 8080:80  # Access nginx at http://localhost:8080
# kubectl exec -it nginx-pod -- /bin/bash  # Get a shell inside the pod

# 🏭 YOUR CODEBASE COMPARISON:
# 
# ❌ Your codebase does NOT create Pods directly like this
# ✅ Your codebase uses Helm charts and Deployments instead
# 
# Example from your codebase:
# - Helm charts in: freeleaps-ops/freeleaps/helm-pkg/
# - Deployments with replicas, rolling updates, etc.
# - Automatic pod creation via Deployment controllers
# 
# Commands your codebase actually uses:
# helm install/upgrade <release> <chart> --namespace <namespace> -f <values.yaml>
# kubectl get pods -n <namespace> -l app.kubernetes.io/name=<app-name>

# 🎯 PRODUCTION BEST PRACTICES:
#
# ❌ DON'T DO THIS (bad practices):
# kubectl run nginx --image=nginx:latest                    # Creates standalone Pod
# kubectl run my-app --image=my-app:latest --port=8080      # No self-healing
# kubectl run database --image=postgres:13 --port=5432      # No scaling
#
# ✅ DO THIS INSTEAD (good practices):
# kubectl create deployment nginx --image=nginx:latest       # Creates Deployment
# helm install my-app ./my-app-chart --namespace my-app     # Use Helm charts
# kubectl apply -f deployment.yaml                          # Declarative deployment
# kubectl apply -f statefulset.yaml                        # For databases
#
# 🔧 When kubectl run is OK (limited use cases):
# kubectl run debug-pod --image=busybox --rm -it --restart=Never -- nslookup my-service
# kubectl run test-pod --image=nginx --rm -it --restart=Never -- curl http://my-service:80

# 📚 Learn more:
# - Pods: https://kubernetes.io/docs/concepts/workloads/pods/
# - Deployments: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
# - Helm: https://helm.sh/docs/
# - Health Checks: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
# - Security Context: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
# - Resource Management: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
