# Kubernetes to Azure Container Apps - Assessment Guide

## Compatibility Matrix

### Kubernetes → Container Apps Resource Mapping

| Kubernetes Concept | Container Apps Equivalent | Supported | Notes |
|-------------------|--------------------------|-----------|-------|
| Deployment | Container App | ✅ Yes | One-to-one mapping for stateless workloads |
| Service (ClusterIP) | Internal ingress | ✅ Yes | Set `ingress.external: false` |
| Service (LoadBalancer) | External ingress | ✅ Yes | Set `ingress.external: true` |
| Ingress | Built-in ingress with custom domain | ✅ Yes | Supports TLS, traffic splitting |
| ConfigMap | Environment variables | ✅ Yes | Inline or from secrets |
| Secret | Secrets (Key Vault refs preferred) | ✅ Yes | Use managed identity for Key Vault |
| CronJob | Container Apps Job (scheduled) | ✅ Yes | Cron expression syntax |
| Job | Container Apps Job (manual/event) | ✅ Yes | One-time or event-triggered |
| HPA | Built-in scaling rules | ✅ Yes | HTTP, TCP, KEDA-compatible scalers |
| PersistentVolumeClaim | Azure Files mount | ⚠️ Limited | EmptyDir and Azure Files only; no block storage |
| DaemonSet | N/A | ❌ No | Consider sidecar containers or external agents |
| StatefulSet | N/A | ❌ No | Use external state (Cosmos DB, Redis, SQL) |
| Custom CRDs / Operators | N/A | ❌ No | Evaluate if Dapr components can replace |
| NetworkPolicy | VNet NSG rules | ⚠️ Limited | Configure at Environment subnet level |

### Resource Limits

| Resource | Kubernetes (typical) | Container Apps Maximum | Migration Impact |
|----------|---------------------|----------------------|------------------|
| CPU per container | Up to 64+ vCPU | 4 vCPU | Split large containers |
| Memory per container | Up to 256+ GiB | 8 GiB | Redesign memory-intensive workloads |
| Replicas per app | 1000+ | 300 per revision | Validate scale requirements |
| Request timeout | Configurable (hours+) | 240 seconds default | Redesign long-running requests |
| Startup probe timeout | Configurable | 240 seconds | Optimize startup time |
| Containers per pod/app | 10+ | Up to 10 sidecars | Init + sidecar containers supported |

## Unsupported Patterns

### Critical Blockers

1. **StatefulSets with persistent storage**
   - **Why**: Container Apps is designed for stateless workloads
   - **Alternative**: Migrate state to Azure Cosmos DB, Azure SQL, Redis, or Storage

2. **DaemonSets for node-level agents**
   - **Why**: No node-level access in managed environment
   - **Alternative**: Use Azure Monitor agents, Dapr components, or sidecar containers

3. **Privileged containers or host networking**
   - **Why**: Security isolation in managed platform
   - **Alternative**: Redesign to avoid host-level access

4. **Custom CRDs and Operators**
   - **Why**: No Kubernetes API server access
   - **Alternative**: Use Dapr state management, bindings, or Azure PaaS services

5. **Direct Kubernetes API calls from apps**
   - **Why**: Kubernetes API not exposed
   - **Alternative**: Use environment variables, service discovery via DNS, or Dapr

### Storage Considerations

- **EmptyDir**: Supported (ephemeral storage)
- **Azure Files**: Supported via volume mounts
- **Persistent Block Storage**: Not supported (migrate to Azure Blob, SQL, Cosmos DB)

## Assessment Checklist

### 1. Workload Inventory

- List all Deployments, StatefulSets, DaemonSets in target namespaces
- Identify workload types: API, background worker, CronJob, StatefulSet
- Document current resource requests/limits (CPU, memory)
- Note replica counts (min, max, typical)

### 2. Network Configuration

- **Service Types**: ClusterIP (internal) vs LoadBalancer (external)
- **Ingress**: Document hostnames, TLS certificates, path routing rules
- **Service Mesh**: Document if using Istio, Linkerd (consider migrating to Dapr)
- **NetworkPolicies**: List egress/ingress rules (map to NSG rules or VNet integration)

### 3. Storage and State

- **PersistentVolumeClaims**: List volumes, sizes, access modes (ReadWriteOnce, ReadWriteMany)
- **StatefulSets**: Document state storage patterns (candidates for external state migration)
- **EmptyDir/Temp Storage**: Note usage patterns (supported in Container Apps)
- **ConfigMaps/Secrets**: Count and categorize (migrate inline or to Key Vault)

### 4. Scaling and Performance

- **HPA**: Document scaling metrics (CPU, memory, custom metrics)
- **Min/Max Replicas**: Verify within Container Apps limits (0-300)
- **Startup Time**: Measure pod startup latency (must be <240s)
- **Request Patterns**: Long-running requests (>240s) need redesign

### 5. Dependencies

- **Internal Services**: List service-to-service calls (use internal DNS in Container Apps)
- **External Services**: Databases, APIs, message queues, storage
- **Authentication**: Service accounts, RBAC roles (map to managed identities)
- **Observability**: Logging, metrics, tracing (migrate to Azure Monitor, App Insights)

### 6. CI/CD and Deployment

- **Pipeline Tools**: kubectl, Helm, Kustomize, ArgoCD, Flux
- **Image Registries**: Docker Hub, GCR, ECR, private registries (migrate to ACR)
- **Deployment Strategy**: Rolling update, blue/green, canary (Container Apps supports traffic splitting)

## Complexity Assessment Guidelines

### Low Complexity
- Stateless Deployments with ClusterIP or LoadBalancer Services
- Simple environment variables (no complex ConfigMaps)
- No persistent storage or external state already in use
- Standard HTTP/gRPC ingress
- No service mesh dependencies

### Medium Complexity
- Multiple Deployments with inter-service communication
- ConfigMaps and Secrets requiring Key Vault migration
- HPA with custom metrics (need KEDA scaler mapping)
- CronJobs (map to Container Apps Jobs)
- Ingress with TLS and custom domains

### High Complexity
- StatefulSets requiring state migration to external services
- Service mesh (Istio/Linkerd) requiring Dapr migration
- Custom CRDs or Operators (need redesign)
- NetworkPolicies requiring VNet/NSG configuration
- Large-scale deployments (>100 replicas, need architecture review)
- Workloads exceeding Container Apps resource limits (>4 vCPU, >8 GiB)

## Assessment Report Structure

Generate `k8s-migration-assessment.md` with:

1. **Executive Summary**: Cluster name, namespace(s), workload count, complexity (Low/Medium/High), estimated timeline, Azure cost
2. **Current State**: Deployment inventory, resource usage, scaling config, storage usage, networking topology
3. **Compatibility Analysis**: Supported workloads, blockers, redesign requirements (StatefulSets, DaemonSets, CRDs)
4. **Azure Target**: Required resources (resource group, Container Apps Environment, ACR, Key Vault, Log Analytics, VNet if needed)
5. **Migration Plan**:
   - State migration strategy (databases, caches, storage)
   - Image migration approach (ACR import, rebuild)
   - IaC generation plan (Bicep templates per Deployment)
   - Deployment sequence (dependencies first, then consumers)
6. **Risk Assessment**: Blockers, feature gaps, performance considerations, downtime estimate
7. **Validation Tests**: Smoke tests, integration tests, performance benchmarks
