package
4.0.0
Repository: https://github.com/gazebo-web/cloudsim.git
Documentation: pkg.go.dev

# README

Orchestrator

The Orchestrator package represents a component in charge of managing a single cluster. In order to do that, this component exposes a set of interfaces that are used as subcomponents for managing different resources in a cluster.

Cluster

The Cluster interface grants you access to the different interfaces available to manage resources. It's the main entry point when using the orchestrator component.

Kubernetes

Three functions have been added to initialize a Kubernetes cluster. A default implementation, a custom implementation and a fake one for testing purposes.

Default implementation: With the default implementation you avoid creating all the components that will be used by the orchestrator component to manage the cluster.

config, err := kubernetes.GetConfig()
if err != nil {
    panic(err)
}

client, err := kubernetes.NewAPI(config)
if err != nil {
    panic(err)
}

initializer := spdy.NewSPDYInitializer(config)

logger := gz.NewLoggerNoRollbar("Kubernetes", gz.VerbosityDebug)

ks := kubernetes.NewDefaultKubernetes(client, initializer, logger)

These steps are in the InitializeKubernetes function.


Custom implementation: When you need to initialize the cluster with different components, NewCustomKubernetes allows you to manually pass the different subcomponents.

config := Config{
    Nodes:           nil,
    Pods:            nil,
    Ingresses:       nil,
    IngressRules:    nil,
    Services:        nil,
    NetworkPolicies: nil,
}

ks := kubernetes.NewCustomKubernetes(config)

Nodes

The Nodes interface allows you to manage nodes. Nodes are a representation of a machine that's running inside the cluster. As it is right now, this interface exposes a method to wait until nodes have joined the cluster and are ready to be used.

config, err := kubernetes.GetConfig()
if err != nil {
    panic(err)
}

client, err := kubernetes.NewAPI(config)
if err != nil {
    panic(err)
}

logger := gz.NewLoggerNoRollbar("Kubernetes", gz.VerbosityDebug)

ns := NewNodes(client, logger)

Pods

The Pods interface allows you to manage pods. Pods are a representation of a Unit of Work running inside different Nodes.

  • Pods can be created by passing a CreatePodInput instance to the Create method.
  • Scripts and commands can be executed inside a Pod by using the Executor interface that can be accessed by calling the Exec method.
  • Files and logs can be read from a running Pod by using the Reader interface that can be accessed by calling the Read method.
  • Just like the Nodes interface, the Pods interface exposes a method to wait for a certain condition to happen.
  • Pods can be deleted by using the Delete method.
graph TD;
  subgraph node1[Node]
    pod1[Pod];
    pod2[Pod];
  end
  subgraph node2[Node]
    pod3[Pod];
    pod4[Pod];
  end

Services

The Services interface allows you to manage services. A Service is an abstraction that defines a policy on how to access Pods.

  • Services can be created by passing a CreateServiceInput instance to the Create method.
  • Services can be removed by using the Delete method.
graph TD;
  client[Client]-->service[Service];
  subgraph cluster[Cluster]
  pod1[Pod]-->service;
  service-->pod2[Pod];
  service-->pod3[Pod];
  end

Ingresses

The Ingresses interface allows you to manage ingresses. An Ingress exposes endpoints that allow external access to services within the cluster.

Two different implementations were create for Cloudsim, one using the default Kubernetes Ingress implementation, and another one using a third-party application called Gloo.

From Gloo's documentation:

Gloo is a feature-rich, Kubernetes-native ingress controller, and next-generation API gateway. Gloo is exceptional in its function-level routing; its support for legacy apps, microservices and serverless; its discovery capabilities; its numerous features; and its tight integration with leading open-source projects.

graph LR;
  client[Client]-->ingress[Ingress];
  ingress-->service[Service];
  subgraph cluster[Cluster]
  ingress;
  service-->pod1[Pod];
  service-->pod2[Pod];
  end

Ingress Rules

The IngressRules interface allows you to manage rules from a certain Ingress.

Rules

The Rule interface groups a set of methods to upsert and remove paths from a certain rule.

Paths

Path is data structure that groups all the fields needed to link a certain address (or route) to a specific service.

Path data structure

FieldKubernetesGloo
UIDHTTPIngressPath.Backend.ServiceNameRoute name
AddressHTTPIngressPath.PathRegex matcher
Endpoint.NameHTTPIngressPath.Backend.ServiceNameUpstream name
Endpoint.PortHTTPIngressPath.Backend.ServicePort.IntVal-

Gloo vs Kubernetes

A table has been added below to help you understand how these two implementations compare to each other by the implementation-specific resource they consume:

CloudsimKubernetesGloo
IngressesIngressVirtual Services
IngressRulesIngressRuleVirtual Host
RuleHTTPIngressRuleValueRoute
PathHTTPIngressPathRouteAction + Matcher

# Packages

No description provided by the author
No description provided by the author
No description provided by the author

# Interfaces

Cluster groups a set of methods for managing a cluster.