compute/

directory
v1.11.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 11, 2024 License: Apache-2.0

README

Cluster discovery

Motivation

Part of using a cloud infrastructure is need to discover/identify a collection of nodes, i.e. a cluster, that is used to implement certain functionality.

Introduction

Cluster discovery can be based on some attributes, e.g. EC2 tags in the AWS environment.
Additionaly, the discovered nodes represented by their IP addresses can be filtered by running health checks on the nodes. Currently, cluster discovery is implemented for Amazon, Google and Consul environments.

Usage

To discover a cluster, one has to pass the following parameters:

  • Cluster name (informational)
  • API ("AWS", "GCP", "CONSUL", "LOCAL"), a case insensitive string. "LOCAL" can be used for unit testing. It returns a single node cluster with the IP address of 127.0.0.1.
  • Criteria
  • Health checks

Health checks can be implemented as

  • HTTP check. Issues a GET request with predefined URL and checks for the HTTP status code.
  • Age check. Verifies whether the node is sufficiently "old".
AWS
package main

import (
	"github.com/viant/cloudless/compute/cluster"
	_ "github.com/viant/cloudless/compute/cluster/aws"
	"time"
)

func main() (*cluster.Cluster, error) {
	// Discovery object contains criteria and health checks definitions
	discovery := &cluster.Discovery{
		Api:     "AWS",
		Cluster: "Cluster1",
		Criteria: cluster.Criteria{
			Region: "us-west-2",
			Tags:   []string{"mytag"},
		},
		HealthChecks: []cluster.HealthCheck{
			{
				URL:            "http://{IP}:8080/x/y/z",
				TimeoutMs:      1000,
				ExpectedStatus: 200,
				MinAge:         time.Minute * 10,
			},
		},
	}

	s := cluster.New()

	// discover cluster
	cluster, err := s.Discover(discovery)

}
Google cloud
package compute

import (
	"github.com/viant/cloudless/compute/cluster"
	_ "github.com/viant/cloudless/compute/cluster/gcp"
	"time"
)

func main() {
	// Discovery object contains criteria and health checks definitions
	discovery := &cluster.Discovery{
		Api:     "GCP",
		Cluster: "Cluster2",
		Criteria: cluster.Criteria{
			Project: "ppp",
			Zone:    "us-east1-b",
			Tags:    []string{"aerospike"},
			Labels:  map[string]string,
		},
		HealthChecks: []cluster.HealthCheck{
			{
				MinAge: time.Duration(time.Minute * 10),
			},
		},
	}

	s := cluster.New()

	// discover cluster
	cluster, err := s.Discover(discovery)

}

Multiple "Labels" criteria imply AND logic whle "Tags" do OR logic.

Consul
package compute

import (
	"github.com/viant/cloudless/compute/cluster"
	_ "github.com/viant/cloudless/compute/cluster/consul"
	"time"
)

func main() {
	// Discovery object contains criteria and health checks definitions
	discovery := &cluster.Discovery{
		Api:     "CONSUL",
		Cluster: "Cluster3",
		Criteria: cluster.Criteria{
			URL:     "consul.vianttech.com:8500",
			Service: "consul",
		},
	}

	s := cluster.New()

	// discover cluster
	cluster, err := s.Discover(discovery)

}

Consul can run health checks inside its own infrastructure and return only healthy IP addresses. However, it is possible to specify additional checks using the same mechanism as AWS and GCP.

Directories

Path Synopsis
aws
gcp
lb

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL