Designing for Failure: Building Highly Available Systems on Kubernetes and the Cloud