cloud orchestration with rightscale cloud workflow

Post on 15-Apr-2017

165 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

CLOUD ORCHESTRATION

WITH

RIGHTSCALE CLOUD WORKFLOW

• Raphael Simon

• Chief Architect, RightScale

• Ryan O’Leary

• Senior Director Product, RightScale

Speakers

• Why Cloud Orchestration Matters

• Use Cases

• Overview of Cloud Workflow

• Behind the Scenes

• Demo

• Extending Cloud Workflow with Plugins

Agenda

Cloud Workflow Orchestrating the Clouds

• Complexity of cloud applications has been increasing • Micro-services, SaaS, PaaS, IaaS, containers, etc

• Orchestration is a requirement for the entire application

lifecycle • Must be code-based (no manual steps)

• From provisioning to operational actions and maintenance to

shutdown/cleanup

• Orchestration technology must be vendor-agnostic • Agility to use new services and optimize targets is a requirement

Introduction

Use Cases Why Cloud Workflow

• Resource dependency

• Sequential/concurrent actions

• Dealing with failures/errors

• Provision “N” number of a given resource

Orchestrated Provisioning

Complex applications require multi-service

orchestration to launch and configure correctly

• Environment-specific policies

• Complex quotas (user/group, core/memory, cost)

• Multi-resource policy definitions

• Multiple policy levels, including automated and man-in-the-

loop

Smart Policies

Cloud usage must be governed to ensure compliance

and minimize waste

• Automated runbook execution for dealing with known

problems

• Resolution attempts with multiple escalation paths

• Correlating alert information from multiple sources for more

informed responses

Contextual Alert Actions

Increase operational efficiency by automating alert

actions

• Scale relative to the event

• Scale down intelligently, removing the ideal nodes for the

application

• Scale up cost effectively, leveraging spot and/or discounted

instance types

Optimized Array Scaling

Save cost and improve performance by reacting

appropriately to load/usage events

• Runbook automation for regularly performed maintenance

tasks

• Include dependencies on other parts of the

application/environment

• Notify stakeholders via multiple channels and trigger other

actions in case of unexpected behavior

Operational Scheduled Actions

Automate regular maintenance tasks with visibility and

reporting

Overview What is Cloud Workflow?

● Goal: robust orchestration of cloud services

● Mean: code centered around the concept of resources ○ RightScale resources (servers, volumes, networks, applications etc.)

○ Arbitrary service resources via plugins (UPCOMING)

● Code in RCL (RightScale Cloud Workflow Language ○ Built-in functions to control resources lifetime (provision and delete)

○ Resource specific actions that make requests to arbitrary APIs

○ Scoping, variables, control flow, error handling, concurrency ...

Overview

Example

@deployment = rs_cm.deployment.create(name: “CWF rocks!”) @deployment.lock() # make API request to “lock” action delete(@deployment) # delete destroys the resource

API resource action parameters

Where does it fit?

Cloud

Workflow

Cloud Templates (CloudFormation, Azure

Templates)

Config. Mgmt (Puppet, Chef)

Client Tools (Terraform, ad-hoc

scripts)

Code type Imperative Declarative Mix Depends

Error Handling Explicit Implicit Implicit Depends

Multicloud? Yes No Yes Yes (w/ caveats)

Scope Systems Systems Servers Systems

Execution Hosted Hosted Mix Client / CI

Failure Modes Catastrophic Catastrophic SPOF SPOF

Introspection Full Basic No Basic

● Script like syntax

● Robust error handling

● Built-in timeout support

● Simple and explicit concurrency control

● Functions for making arbitrary HTTP requests

● Extensible via plugins

● Can be used together with Self-Service Cloud Applications

(CATs) to mix declarative with imperative code

Cloud Workflow Benefits

Error Handling

01 define main() do

02 @server = rs_cm.get(href: "/api/servers/123")

03 $attempts = 0

04

05 sub on_error: rescue($attempts) do

06 $attempts = $attempts + 1

07 @instance = @server.launch()

08 end

09 end

10

11 define rescue($attempts) do

12 if $attempts < 3

13 $_error_behavior = "retry"

14 end

15 end

Timeout

01 define main() do

02 @server = rs_cm.get(href: "/api/servers/123")

03 $atts = 0

04

05 sub timeout: 30s, on_timeout: rescue($atts), on_error:

rescue($atts) do

06 $atts = $atts + 1

07 @instance = @server.launch()

08 end

09 end

10

11 define rescue($attempts) do

12 if $attempts < 3

13 $_error_behavior = "retry"

14 end

15 end

Concurrency

1 define launch($serv1, $serv2, $serv3) return @inst1, @inst2,

@inst3 do

2 concurrent do

3 @inst1 = provision($server1) # blocks until @inst1 is

operational

4 @inst2 = provision($server2)

5 end

6 @inst3 = @serv3.launch()

7 end

Making HTTP requests

1 define random_text() return $body do

2 $resp = http_get(url: "http://loripsum.net/api")

3 $body = $resp["body"]["value"] # $resp contains the parsed

JSON

4 end

Behind the Scenes Cloud Workflow

Process Execution Flow

RCL Cloud

Workflow

External

API

Parse

Store

AST

Run

one expression Cloud

Workflow

Load / Save

one expression

No external state affected until step #4 ⇒ step #2 can be retried idempotently

This algorithm guarantees that the state of a process is

always consistent even when system failures occur.

Process Execution Algorithm

1. Load expression

2. Evaluate

3. Save expression

4. Apply evaluation outcome: make API requests, sleep,

raise error ...

5. Repeat until all expressions have completed

● A single process can run a number of concurrent tasks

● Code is not run concurrently, API requests are made concurrently

● Only one expression runs at any given time in the scope of a process to

guarantee that the state remains consistent even when system failures

occur.

Use concurrency to run flows concurrently, think workflow split and join

Process Concurrency

Parent

task

Parent

task

exp exp

exp exp exp

concurrent

Process Concurrency (2)

Parent Parent

activity (API requests)

T 1 T 2 T 1

activity

T 2

Concurrent execution

Demo

define main() do

task_label("Creating deployment")

@deployment = rs_cm.deployments.create(deployment: {"name": "CWF webinar"})

task_label("Waiting for deployment name to change to 'GO'")

sleep_until(@deployment.name == "GO")

task_label("Attempting to delete deployment ")

delete(@deployment)

task_label("Done!")

end

define main() do

task_label("Creating deployment")

@deployment = rs_cm.deployments.create(deployment: {"name": "CWF webinar"})

task_label("Waiting for deployment name to change to 'GO'")

sleep_until(@deployment.name == "GO")

$attempt = 1

sub on_error: handle_error(@deployment) do

task_label("Attempting to delete deployment (attempt " + $attempt + ")")

$attempt = $attempt + 1

delete(@deployment)

sleep(5)

end

task_label("Done!")

end

define handle_error(@deployment) do

task_label("Unlocking deployment")

@deployment.unlock()

sleep(5)

$_error_behavior = "retry"

end

Plugins Extending Cloud Workflow

RCL has the following built-in namespaces (a.k.a. APIs):

● rs_cm: RightScale Cloud Management APIs

● rs_ss: RightScale Self-Service APIs

● rs_ca: RightScale Cloud Analytics APIs (UPCOMING)

RCL also supports making HTTP requests to arbitrary

endpoints via the http_xxx functions.

Built-in Support

Describe resources hosted in external services, including:

● List of fields required to create resource

● List of output fields contained in created resource

● JMESPath expression for extracting output fields from responses

● List of actions supported by the resource (HTTP endpoints and

mapping of resource output fields to HTTP request)

● RCL definitions for provisioning and deleting resources

Plugins

Plugins - Example

plugin "digo" do

type "droplet" do

provision "provd"

delete "deld"

field "name" do

type "string", required: true

end

field "api_version" do

type "string"

location "header"

end

output_path "droplet"

output "id", "name"

...

...

action "show", "create",

"destroy"

action "kernels" do

verb "GET"

path "$href/kernels"

end

end

end

define provd($droplet) return @droplet

do

@droplet =

digo.droplet.create($droplet)

sleep_until(@droplet.status ==

"active")

end

define deld(@droplet) do

@droplet.detroy()

end

Plugins - Usage

define launch($droplet) return @droplet do

@droplet = provision($droplet)

@action = digo.actions.create(type: "enable_ipv6")

sleep_until(@action.status == "completed")

end

define main() return $name do

$fields = { "name" : "my droplet" }

$droplet = { "namespace": "digo", "type": "droplet", "fields":

$fields }

@droplet = launch($droplet)

$name = @droplet.name

end

• Need help optimizing cloud costs?

• sales@rightscale.com

• Learn More • Plugin Webinar: https://www.rightscale.com/webinars (search “plugins”)

Q&A

top related