1. Compute Engine
    1. Virtual version of physical computer
    2. Full control with flexibility for customization
    3. User configures CPU/GPU, memory, disk space, OS, networking
    4. Google handles hardware management and virtualization layer
    5. Where managed platform services not a good fit
    6. Commonly used to migrate existing servers into the cloud
    7. Good fit for applications with specific OS requirements
  2. Kubernetes Engine
    1. Manage container based workloads, not machines
    2. Benefits from the portability of containers
    3. No dependency on OS version
    4. Google manages the cluster (node, software updates, autoscaling)
    5. Supports a cloud-native micro-service architectures
  3. App Engine
    1. Serverless application platform
    2. Users focusses on code and use platform to manage HTTP requests and versioning
    3. Google handles infrastructure, updates, scaling, networking etc
    4. Standard environment supports rapid scaling from zero instances
    5. Standard environment supports limited runtime - python, java, PHP, go, nodej
    6. Flexible environment is slower scaling up/down
    7. Suitable for websites, mobile app backends, IoT apps
  4. Cloud Functions
    1. Serverless computing platform
    2. Function executes in response to cloud based events
    3. Simple, single purpose functions
    4. Scale down to zero. Autoscales with usage
    5. Limited runtime support (nodejs, python, PHP, go)
    6. Can be triggered by pub/sub and cloud storage events
  5. Preemptible VM
    1. Short lived, low cost VM
    2. Can be shutdown at anytime (30 seconds warning)
    3. 24 hours max
    4. Not for critical single VM
    5. Most often used in managed instance groups
    6. Fixed pricing up to 80% off regular instance price
    7. Compute (CPU/memory) is cheaper. Storage and licensing same cost
    8. Ideal for fault tolerant batch processing workloads
  6. Best Practice
    1. Many small machines better than a few large ones
    2. Less likely to be shutdown completely
    3. Run jobs during off peak times
    4. Application tolerating preemption
    5. Test by manually stopping the instance
    6. Preserve disk on machine termination
    7. Use shutdown script to pick up where left off