Initial commit: 2048 game with Knative and Kourier deployment

- Complete 2048 game implementation with responsive design
- Knative Serving manifests for dev/staging/prod environments
- Scale-to-zero configuration with environment-specific settings
- Custom domain mapping for wa.darknex.us subdomains
- GitHub Actions workflows for CI/CD
- Docker container with nginx and health checks
- Setup scripts for Knative and Kourier installation
- GHCR integration for container registry
This commit is contained in:
greg
2025-06-30 20:43:19 -07:00
commit c3b227b7d7
26 changed files with 2244 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
apiVersion: serving.knative.dev/v1alpha1
kind: DomainMapping
metadata:
name: 2048-dev.wa.darknex.us
namespace: game-2048-dev
labels:
app: game-2048
environment: development
spec:
ref:
name: game-2048-dev
kind: Service
apiVersion: serving.knative.dev/v1

View File

@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: game-2048-dev
labels:
environment: development
app: game-2048

60
manifests/dev/service.yml Normal file
View File

@@ -0,0 +1,60 @@
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: game-2048-dev
namespace: game-2048-dev
labels:
app: game-2048
environment: development
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "10"
# Scale down to zero after 30 seconds of no traffic
autoscaling.knative.dev/scaleDownDelay: "30s"
# Target concurrency per pod
autoscaling.knative.dev/target: "100"
spec:
template:
metadata:
labels:
app: game-2048
environment: development
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "10"
autoscaling.knative.dev/scaleDownDelay: "30s"
autoscaling.knative.dev/target: "100"
spec:
containers:
- name: game-2048
image: ghcr.io/ghndrx/k8s-game-2048:latest
ports:
- containerPort: 8080
protocol: TCP
env:
- name: ENVIRONMENT
value: "development"
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
traffic:
- percent: 100
latestRevision: true

View File

@@ -0,0 +1,13 @@
apiVersion: serving.knative.dev/v1alpha1
kind: DomainMapping
metadata:
name: 2048.wa.darknex.us
namespace: game-2048-prod
labels:
app: game-2048
environment: production
spec:
ref:
name: game-2048-prod
kind: Service
apiVersion: serving.knative.dev/v1

View File

@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: game-2048-prod
labels:
environment: production
app: game-2048

View File

@@ -0,0 +1,60 @@
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: game-2048-prod
namespace: game-2048-prod
labels:
app: game-2048
environment: production
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "50"
# Scale down to zero after 5 minutes of no traffic (longer for production)
autoscaling.knative.dev/scaleDownDelay: "300s"
# Target concurrency per pod
autoscaling.knative.dev/target: "100"
spec:
template:
metadata:
labels:
app: game-2048
environment: production
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "50"
autoscaling.knative.dev/scaleDownDelay: "300s"
autoscaling.knative.dev/target: "100"
spec:
containers:
- name: game-2048
image: ghcr.io/ghndrx/k8s-game-2048:v1.0.0
ports:
- containerPort: 8080
protocol: TCP
env:
- name: ENVIRONMENT
value: "production"
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 1Gi
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
traffic:
- percent: 100
latestRevision: true

View File

@@ -0,0 +1,13 @@
apiVersion: serving.knative.dev/v1alpha1
kind: DomainMapping
metadata:
name: 2048-staging.wa.darknex.us
namespace: game-2048-staging
labels:
app: game-2048
environment: staging
spec:
ref:
name: game-2048-staging
kind: Service
apiVersion: serving.knative.dev/v1

View File

@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: game-2048-staging
labels:
environment: staging
app: game-2048

View File

@@ -0,0 +1,60 @@
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: game-2048-staging
namespace: game-2048-staging
labels:
app: game-2048
environment: staging
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "20"
# Scale down to zero after 60 seconds of no traffic (longer for staging)
autoscaling.knative.dev/scaleDownDelay: "60s"
# Target concurrency per pod
autoscaling.knative.dev/target: "100"
spec:
template:
metadata:
labels:
app: game-2048
environment: staging
annotations:
# Scale to zero configuration
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "20"
autoscaling.knative.dev/scaleDownDelay: "60s"
autoscaling.knative.dev/target: "100"
spec:
containers:
- name: game-2048
image: ghcr.io/ghndrx/k8s-game-2048:staging
ports:
- containerPort: 8080
protocol: TCP
env:
- name: ENVIRONMENT
value: "staging"
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1000m
memory: 512Mi
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
traffic:
- percent: 100
latestRevision: true