or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

backup-services.mdcompute-services.mdcontainer-services.mdcore-driver-system.mddns-management.mdindex.mdload-balancer-services.mdstorage-services.md

load-balancer-services.mddocs/

0

# Load Balancer Services

1

2

The load balancer service provides a unified interface for load balancer management across multiple cloud providers including AWS ELB/ALB, Azure Load Balancer, Google Load Balancer, Rackspace Load Balancer, and others.

3

4

## Providers

5

6

```python { .api }

7

from libcloud.loadbalancer.types import Provider

8

9

class Provider:

10

"""Enumeration of supported load balancer providers"""

11

ELB = 'elb' # AWS Elastic Load Balancer

12

ALB = 'alb' # AWS Application Load Balancer

13

GCE = 'gce' # Google Cloud Load Balancer

14

RACKSPACE = 'rackspace' # Rackspace Cloud Load Balancers

15

NINEFOLD = 'ninefold' # Ninefold Load Balancer

16

BRIGHTBOX = 'brightbox' # Brightbox Load Balancer

17

CLOUDSTACK = 'cloudstack' # CloudStack Load Balancer

18

DIMENSIONDATA = 'dimensiondata' # Dimension Data Load Balancer

19

# ... more providers

20

```

21

22

## Driver Factory

23

24

```python { .api }

25

from libcloud.loadbalancer.providers import get_driver

26

27

def get_driver(provider: Provider) -> type[Driver]

28

```

29

30

Get the driver class for a specific load balancer provider.

31

32

**Parameters:**

33

- `provider`: Provider identifier from the Provider enum

34

35

**Returns:**

36

- Driver class for the specified provider

37

38

**Example:**

39

```python

40

from libcloud.loadbalancer.types import Provider

41

from libcloud.loadbalancer.providers import get_driver

42

43

# Get AWS ELB driver class

44

cls = get_driver(Provider.ELB)

45

46

# Initialize driver with credentials

47

driver = cls('access_key', 'secret_key', region='us-east-1')

48

```

49

50

## Core Classes

51

52

### Driver

53

54

```python { .api }

55

class Driver(BaseDriver):

56

"""Base class for all load balancer drivers"""

57

58

def list_protocols(self) -> List[str]

59

def list_balancers(self) -> List[LoadBalancer]

60

def create_balancer(self, name: str, port: int, protocol: str, algorithm: Algorithm, members: List[Member]) -> LoadBalancer

61

def destroy_balancer(self, balancer: LoadBalancer) -> bool

62

def get_balancer(self, balancer_id: str) -> LoadBalancer

63

def update_balancer(self, balancer: LoadBalancer, **kwargs) -> LoadBalancer

64

def balancer_list_members(self, balancer: LoadBalancer) -> List[Member]

65

def balancer_attach_member(self, balancer: LoadBalancer, member: Member) -> bool

66

def balancer_detach_member(self, balancer: LoadBalancer, member: Member) -> bool

67

def balancer_attach_compute_node(self, balancer: LoadBalancer, node: Node) -> Member

68

def balancer_detach_compute_node(self, balancer: LoadBalancer, node: Node) -> bool

69

def ex_list_balancer_health_checks(self, balancer: LoadBalancer) -> List[Dict]

70

def ex_create_balancer_health_check(self, balancer: LoadBalancer, **kwargs) -> Dict

71

```

72

73

Base class that all load balancer drivers inherit from. Provides methods for managing load balancers and their members.

74

75

**Key Methods:**

76

77

- `list_balancers()`: List all load balancers in the account

78

- `create_balancer()`: Create a new load balancer

79

- `destroy_balancer()`: Delete a load balancer

80

- `balancer_attach_member()`: Add a member to a load balancer

81

- `balancer_detach_member()`: Remove a member from a load balancer

82

- `balancer_attach_compute_node()`: Attach a compute node as a member

83

84

### LoadBalancer

85

86

```python { .api }

87

class LoadBalancer:

88

"""Represents a load balancer"""

89

90

id: str

91

name: str

92

state: State

93

ip: str

94

port: int

95

driver: Driver

96

extra: Dict[str, Any]

97

98

def attach_member(self, member: Member) -> bool

99

def detach_member(self, member: Member) -> bool

100

def list_members(self) -> List[Member]

101

def destroy(self) -> bool

102

```

103

104

Represents a load balancer instance.

105

106

**Properties:**

107

- `id`: Unique load balancer identifier

108

- `name`: Human-readable name

109

- `state`: Current state (running, pending, unknown, etc.)

110

- `ip`: Load balancer IP address or DNS name

111

- `port`: Port number the load balancer listens on

112

- `extra`: Provider-specific metadata

113

114

**Methods:**

115

- `attach_member()`: Add a member to this load balancer

116

- `detach_member()`: Remove a member from this load balancer

117

- `list_members()`: List all members attached to this load balancer

118

- `destroy()`: Delete this load balancer

119

120

### Member

121

122

```python { .api }

123

class Member:

124

"""Represents a load balancer member/target"""

125

126

id: str

127

ip: str

128

port: int

129

balancer: LoadBalancer

130

extra: Dict[str, Any]

131

```

132

133

Represents a member (backend server) attached to a load balancer.

134

135

**Properties:**

136

- `id`: Unique member identifier

137

- `ip`: Member IP address

138

- `port`: Port number on the member

139

- `balancer`: Parent load balancer

140

- `extra`: Provider-specific metadata (health status, weight, etc.)

141

142

### Algorithm

143

144

```python { .api }

145

class Algorithm:

146

"""Load balancing algorithms"""

147

ROUND_ROBIN = 'round_robin'

148

LEAST_CONNECTIONS = 'least_connections'

149

RANDOM = 'random'

150

WEIGHTED_ROUND_ROBIN = 'weighted_round_robin'

151

WEIGHTED_LEAST_CONNECTIONS = 'weighted_least_connections'

152

SOURCE_IP = 'source_ip'

153

```

154

155

Enumeration of supported load balancing algorithms.

156

157

### State

158

159

```python { .api }

160

class State:

161

"""Load balancer states"""

162

RUNNING = 0

163

PENDING = 1

164

UNKNOWN = 2

165

DELETED = 3

166

```

167

168

Enumeration of possible load balancer states.

169

170

### MemberCondition

171

172

```python { .api }

173

class MemberCondition:

174

"""Member health conditions"""

175

ENABLED = 'enabled'

176

DISABLED = 'disabled'

177

DRAINING = 'draining'

178

```

179

180

Enumeration of member health/status conditions.

181

182

### DEFAULT_ALGORITHM

183

184

```python { .api }

185

DEFAULT_ALGORITHM: Algorithm = Algorithm.ROUND_ROBIN

186

```

187

188

Default load balancing algorithm used when none is specified.

189

190

## Usage Examples

191

192

### Basic Load Balancer Management

193

194

```python

195

from libcloud.loadbalancer.types import Provider, Algorithm

196

from libcloud.loadbalancer.providers import get_driver

197

198

# Initialize driver

199

cls = get_driver(Provider.ELB)

200

driver = cls('access_key', 'secret_key', region='us-east-1')

201

202

# List existing load balancers

203

balancers = driver.list_balancers()

204

for balancer in balancers:

205

print(f"Load Balancer: {balancer.name} ({balancer.state}) - {balancer.ip}:{balancer.port}")

206

207

# Check supported protocols

208

protocols = driver.list_protocols()

209

print(f"Supported protocols: {protocols}")

210

211

# Create members for the load balancer

212

members = [

213

Member(id=None, ip='10.0.1.10', port=80, balancer=None),

214

Member(id=None, ip='10.0.1.11', port=80, balancer=None),

215

Member(id=None, ip='10.0.1.12', port=80, balancer=None)

216

]

217

218

# Create a new load balancer

219

balancer = driver.create_balancer(

220

name='web-lb',

221

port=80,

222

protocol='http',

223

algorithm=Algorithm.ROUND_ROBIN,

224

members=members

225

)

226

print(f"Created load balancer: {balancer.name} ({balancer.id})")

227

print(f"Load balancer IP: {balancer.ip}")

228

```

229

230

### Managing Load Balancer Members

231

232

```python

233

# Get an existing load balancer

234

balancer = driver.get_balancer('lb-12345')

235

236

# List current members

237

current_members = balancer.list_members()

238

print(f"Current members: {len(current_members)}")

239

240

for member in current_members:

241

print(f" Member: {member.ip}:{member.port} (ID: {member.id})")

242

if 'condition' in member.extra:

243

print(f" Status: {member.extra['condition']}")

244

245

# Add a new member

246

new_member = Member(id=None, ip='10.0.1.13', port=80, balancer=balancer)

247

success = balancer.attach_member(new_member)

248

print(f"Added new member: {success}")

249

250

# Alternative: Add using driver method

251

success = driver.balancer_attach_member(balancer, new_member)

252

print(f"Added member via driver: {success}")

253

254

# Remove a member

255

if current_members:

256

member_to_remove = current_members[0]

257

success = balancer.detach_member(member_to_remove)

258

print(f"Removed member {member_to_remove.ip}: {success}")

259

```

260

261

### Integration with Compute Nodes

262

263

```python

264

from libcloud.compute.types import Provider as ComputeProvider

265

from libcloud.compute.providers import get_driver as get_compute_driver

266

267

# Initialize compute driver

268

compute_cls = get_compute_driver(ComputeProvider.EC2)

269

compute_driver = compute_cls('access_key', 'secret_key', region='us-east-1')

270

271

# Get existing compute nodes

272

nodes = compute_driver.list_nodes()

273

web_servers = [node for node in nodes if 'web' in node.name.lower()]

274

275

print(f"Found {len(web_servers)} web server nodes")

276

277

# Attach compute nodes to load balancer

278

for node in web_servers[:3]: # Attach first 3 web servers

279

if node.private_ips: # Use private IP for internal load balancing

280

member = driver.balancer_attach_compute_node(balancer, node)

281

print(f"Attached node {node.name} ({node.private_ips[0]}) as member {member.id}")

282

283

# Alternative: Detach a compute node

284

if web_servers:

285

node_to_detach = web_servers[0]

286

success = driver.balancer_detach_compute_node(balancer, node_to_detach)

287

print(f"Detached node {node_to_detach.name}: {success}")

288

```

289

290

### Advanced Load Balancer Configuration

291

292

```python

293

# Create load balancer with advanced configuration

294

advanced_members = [

295

Member(id=None, ip='10.0.1.10', port=80, balancer=None),

296

Member(id=None, ip='10.0.1.11', port=80, balancer=None)

297

]

298

299

# AWS ELB specific configuration

300

elb_balancer = driver.create_balancer(

301

name='advanced-web-lb',

302

port=443, # HTTPS

303

protocol='https',

304

algorithm=Algorithm.LEAST_CONNECTIONS,

305

members=advanced_members

306

)

307

308

print(f"Created HTTPS load balancer: {elb_balancer.name}")

309

310

# Configure health checks (provider specific)

311

try:

312

health_checks = driver.ex_list_balancer_health_checks(elb_balancer)

313

print(f"Current health checks: {len(health_checks)}")

314

315

# Create custom health check

316

health_check = driver.ex_create_balancer_health_check(

317

balancer=elb_balancer,

318

target='HTTP:80/health',

319

interval=30,

320

timeout=5,

321

healthy_threshold=2,

322

unhealthy_threshold=5

323

)

324

print(f"Created health check: {health_check}")

325

326

except AttributeError:

327

print("Health check configuration not available for this provider")

328

```

329

330

### Multi-Protocol Load Balancer

331

332

```python

333

# Create load balancer for multiple protocols (if supported)

334

def create_multi_protocol_lb(driver, name, members):

335

"""Create load balancers for different protocols"""

336

protocols = ['http', 'https', 'tcp']

337

balancers = {}

338

339

for protocol in protocols:

340

port = 80 if protocol == 'http' else (443 if protocol == 'https' else 8080)

341

342

try:

343

balancer = driver.create_balancer(

344

name=f'{name}-{protocol}',

345

port=port,

346

protocol=protocol,

347

algorithm=Algorithm.ROUND_ROBIN,

348

members=members

349

)

350

balancers[protocol] = balancer

351

print(f"Created {protocol.upper()} load balancer: {balancer.ip}:{balancer.port}")

352

353

except Exception as e:

354

print(f"Failed to create {protocol} load balancer: {e}")

355

356

return balancers

357

358

# Usage

359

multi_members = [

360

Member(id=None, ip='10.0.1.10', port=80, balancer=None),

361

Member(id=None, ip='10.0.1.11', port=80, balancer=None)

362

]

363

364

protocol_balancers = create_multi_protocol_lb(driver, 'api-lb', multi_members)

365

```

366

367

### Load Balancer Monitoring and Health Management

368

369

```python

370

import time

371

from typing import Dict, List

372

373

def monitor_load_balancer_health(driver, balancer, interval: int = 60):

374

"""Monitor load balancer and member health"""

375

print(f"Monitoring load balancer: {balancer.name}")

376

377

while True:

378

try:

379

# Refresh balancer state

380

current_balancer = driver.get_balancer(balancer.id)

381

print(f"Load balancer state: {current_balancer.state}")

382

383

# Check member health

384

members = driver.balancer_list_members(current_balancer)

385

healthy_members = 0

386

387

for member in members:

388

status = member.extra.get('condition', 'unknown')

389

health = member.extra.get('health_status', 'unknown')

390

391

print(f" Member {member.ip}:{member.port} - Status: {status}, Health: {health}")

392

393

if status == 'enabled' and health == 'healthy':

394

healthy_members += 1

395

396

print(f"Healthy members: {healthy_members}/{len(members)}")

397

398

# Alert if too few healthy members

399

if healthy_members < 2:

400

print("WARNING: Less than 2 healthy members!")

401

# Here you could send alerts, create new instances, etc.

402

403

except Exception as e:

404

print(f"Error monitoring load balancer: {e}")

405

406

time.sleep(interval)

407

408

def manage_member_weights(driver, balancer, member_weights: Dict[str, int]):

409

"""Update member weights for weighted load balancing"""

410

members = driver.balancer_list_members(balancer)

411

412

for member in members:

413

member_key = f"{member.ip}:{member.port}"

414

if member_key in member_weights:

415

weight = member_weights[member_key]

416

417

# This is provider-specific - check your provider's documentation

418

try:

419

# Update member with new weight (example for providers that support it)

420

updated_member = driver.ex_update_balancer_member(

421

balancer, member, weight=weight

422

)

423

print(f"Updated weight for {member_key} to {weight}")

424

except AttributeError:

425

print(f"Weight management not supported by this provider")

426

427

# Usage examples

428

balancer = driver.get_balancer('lb-12345')

429

430

# Set different weights for members

431

weights = {

432

'10.0.1.10:80': 100, # Full weight

433

'10.0.1.11:80': 75, # Reduced weight

434

'10.0.1.12:80': 50 # Half weight

435

}

436

437

manage_member_weights(driver, balancer, weights)

438

439

# Start monitoring (run in separate thread/process)

440

# monitor_load_balancer_health(driver, balancer, interval=30)

441

```

442

443

### Auto-Scaling Integration

444

445

```python

446

def auto_scale_load_balancer(compute_driver, lb_driver, balancer, template_node, min_members=2, max_members=10):

447

"""Auto-scale load balancer members based on health"""

448

449

members = lb_driver.balancer_list_members(balancer)

450

healthy_members = sum(1 for m in members if m.extra.get('health_status') == 'healthy')

451

452

print(f"Current members: {len(members)}, Healthy: {healthy_members}")

453

454

# Scale up if too few healthy members

455

if healthy_members < min_members and len(members) < max_members:

456

print("Scaling up: Creating new compute node...")

457

458

# Create new compute node based on template

459

new_node = compute_driver.create_node(

460

name=f"auto-web-{int(time.time())}",

461

size=template_node.size,

462

image=template_node.image,

463

location=template_node.extra.get('availability_zone')

464

)

465

466

# Wait for node to be running

467

compute_driver.wait_until_running([new_node])

468

469

# Add to load balancer

470

new_member = lb_driver.balancer_attach_compute_node(balancer, new_node)

471

print(f"Added new member: {new_member.ip}:{new_member.port}")

472

473

# Scale down if too many healthy members

474

elif healthy_members > max_members:

475

print("Scaling down: Removing excess members...")

476

477

# Find oldest member to remove

478

members_by_age = sorted(members, key=lambda m: m.extra.get('created_time', ''))

479

member_to_remove = members_by_age[0]

480

481

# Remove from load balancer

482

success = lb_driver.balancer_detach_member(balancer, member_to_remove)

483

if success:

484

print(f"Removed member: {member_to_remove.ip}:{member_to_remove.port}")

485

486

# Optionally terminate the compute node

487

# node_to_terminate = compute_driver.get_node(member_to_remove.extra.get('node_id'))

488

# compute_driver.destroy_node(node_to_terminate)

489

490

# Usage

491

template_node = compute_driver.list_nodes()[0] # Use existing node as template

492

auto_scale_load_balancer(compute_driver, driver, balancer, template_node)

493

```

494

495

### Cross-Provider Load Balancer Management

496

497

```python

498

from libcloud.loadbalancer.types import Provider

499

from libcloud.loadbalancer.providers import get_driver

500

501

# Configure multiple load balancer providers

502

lb_providers = {

503

'aws_elb': {

504

'driver': get_driver(Provider.ELB),

505

'credentials': ('aws_access_key', 'aws_secret_key'),

506

'region': 'us-east-1'

507

},

508

'gce_lb': {

509

'driver': get_driver(Provider.GCE),

510

'credentials': ('service_account_email', 'key_file_path'),

511

'project': 'my-project'

512

}

513

}

514

515

# Initialize drivers

516

lb_drivers = {}

517

for name, config in lb_providers.items():

518

cls = config['driver']

519

if 'region' in config:

520

lb_drivers[name] = cls(*config['credentials'], region=config['region'])

521

elif 'project' in config:

522

lb_drivers[name] = cls(*config['credentials'], project=config['project'])

523

524

# Create similar load balancers across providers for redundancy

525

def create_redundant_load_balancers(providers_config, name, members):

526

"""Create load balancers across multiple providers for redundancy"""

527

balancers = {}

528

529

for provider_name, driver in lb_drivers.items():

530

try:

531

balancer = driver.create_balancer(

532

name=f'{name}-{provider_name}',

533

port=80,

534

protocol='http',

535

algorithm=Algorithm.ROUND_ROBIN,

536

members=members

537

)

538

balancers[provider_name] = balancer

539

print(f"Created load balancer on {provider_name}: {balancer.ip}")

540

541

except Exception as e:

542

print(f"Failed to create load balancer on {provider_name}: {e}")

543

544

return balancers

545

546

# Create members for each provider (adjust IPs as needed)

547

aws_members = [

548

Member(id=None, ip='10.0.1.10', port=80, balancer=None),

549

Member(id=None, ip='10.0.1.11', port=80, balancer=None)

550

]

551

552

gce_members = [

553

Member(id=None, ip='10.1.1.10', port=80, balancer=None),

554

Member(id=None, ip='10.1.1.11', port=80, balancer=None)

555

]

556

557

# Create redundant load balancers

558

redundant_lbs = create_redundant_load_balancers(lb_providers, 'global-api', aws_members)

559

```

560

561

### Load Balancer Configuration Backup and Restore

562

563

```python

564

import json

565

from datetime import datetime

566

567

def backup_load_balancer_config(driver, balancer) -> Dict:

568

"""Create a backup of load balancer configuration"""

569

570

members = driver.balancer_list_members(balancer)

571

572

backup_data = {

573

'balancer': {

574

'name': balancer.name,

575

'port': balancer.port,

576

'state': balancer.state,

577

'extra': balancer.extra

578

},

579

'members': [

580

{

581

'ip': member.ip,

582

'port': member.port,

583

'extra': member.extra

584

}

585

for member in members

586

],

587

'backup_timestamp': datetime.now().isoformat()

588

}

589

590

# Try to get health checks if supported

591

try:

592

health_checks = driver.ex_list_balancer_health_checks(balancer)

593

backup_data['health_checks'] = health_checks

594

except AttributeError:

595

pass

596

597

print(f"Backed up load balancer {balancer.name} with {len(members)} members")

598

return backup_data

599

600

def restore_load_balancer_config(driver, backup_data, new_name=None):

601

"""Restore load balancer from backup"""

602

603

balancer_config = backup_data['balancer']

604

name = new_name or balancer_config['name']

605

606

# Recreate members

607

members = [

608

Member(id=None, ip=m['ip'], port=m['port'], balancer=None)

609

for m in backup_data['members']

610

]

611

612

# Create load balancer

613

try:

614

restored_balancer = driver.create_balancer(

615

name=name,

616

port=balancer_config['port'],

617

protocol=balancer_config['extra'].get('protocol', 'http'),

618

algorithm=Algorithm.ROUND_ROBIN,

619

members=members

620

)

621

622

print(f"Restored load balancer: {restored_balancer.name}")

623

624

# Restore health checks if they were backed up

625

if 'health_checks' in backup_data:

626

for hc in backup_data['health_checks']:

627

try:

628

driver.ex_create_balancer_health_check(restored_balancer, **hc)

629

except (AttributeError, Exception) as e:

630

print(f"Could not restore health check: {e}")

631

632

return restored_balancer

633

634

except Exception as e:

635

print(f"Failed to restore load balancer: {e}")

636

return None

637

638

# Usage

639

balancer = driver.get_balancer('lb-12345')

640

641

# Create backup

642

backup = backup_load_balancer_config(driver, balancer)

643

644

# Save to file

645

with open(f'lb_backup_{balancer.name}_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json', 'w') as f:

646

json.dump(backup, f, indent=2)

647

648

# Restore from backup

649

restored_lb = restore_load_balancer_config(driver, backup, 'restored-lb')

650

```

651

652

## Exception Handling

653

654

```python

655

from libcloud.loadbalancer.types import LoadBalancerError

656

from libcloud.common.types import LibcloudError, InvalidCredsError

657

658

try:

659

# Create load balancer

660

balancer = driver.create_balancer(

661

name='test-lb',

662

port=80,

663

protocol='http',

664

algorithm=Algorithm.ROUND_ROBIN,

665

members=members

666

)

667

except InvalidCredsError:

668

print("Invalid credentials for load balancer provider")

669

except LoadBalancerError as e:

670

print(f"Load balancer specific error: {e}")

671

except LibcloudError as e:

672

print(f"General Libcloud error: {e}")

673

674

# Check balancer state before operations

675

if balancer.state == State.RUNNING:

676

success = driver.destroy_balancer(balancer)

677

elif balancer.state == State.PENDING:

678

print("Load balancer is still being created")

679

```

680

681

## Provider-Specific Features

682

683

Different providers offer additional features through the `ex_*` parameter pattern:

684

685

```python

686

# AWS ELB specific features

687

elb_driver = get_driver(Provider.ELB)('access_key', 'secret_key')

688

689

# Create ELB with AWS-specific configuration

690

elb_balancer = elb_driver.create_balancer(

691

name='aws-elb',

692

port=80,

693

protocol='http',

694

algorithm=Algorithm.ROUND_ROBIN,

695

members=members,

696

ex_scheme='internet-facing', # Internet-facing vs internal

697

ex_security_groups=['sg-12345'], # Security groups

698

ex_subnets=['subnet-12345'], # VPC subnets

699

ex_cross_zone=True # Cross-zone load balancing

700

)

701

702

# Google Cloud Load Balancer specific features

703

gce_driver = get_driver(Provider.GCE)('email', 'key_file', project='my-project')

704

705

# Create GCE load balancer with specific configuration

706

gce_balancer = gce_driver.create_balancer(

707

name='gce-lb',

708

port=80,

709

protocol='http',

710

algorithm=Algorithm.ROUND_ROBIN,

711

members=members,

712

ex_region='us-central1', # Regional load balancer

713

ex_session_affinity='CLIENT_IP' # Session affinity

714

)

715

```

716

717

Check provider-specific documentation for additional capabilities available through the `ex_*` parameters and methods.