README



Liqo Logo

A Kubernetes platform about dynamic and decentralized multi-cluster


Explore the docs »

View Demo · Report Bug · Request Feature

About the project

Liqo is a platform to enable dynamic and decentralized resource sharing across Kubernetes clusters, either on-prem or managed. Liqo allows to run pods on a remote cluster seamlessly and without any modification of Kubernetes and the applications. With Liqo it is possible to extend the control plane of a Kubernetes cluster across the cluster's boundaries, making multi-cluster native and transparent: collapse an entire remote cluster to a virtual local node, by allowing workloads offloading and resource management compliant with the standard Kubernetes approach.



Table of Contents
  1. Main Features
  2. Quickstart
  3. Installation
  4. Roadmap
  5. Contributing
  6. Community
  7. License

Main features

  • Decentralized governance: peer-to-peer paradigm, without any centralized management entity.
  • Clusters discovery: leverage on three different ways to discover (and peer to) other clusters:
    • Manual configuration: through a custom API representing other clusters
    • DNS: automatic discovery through DNS records
    • LAN: automatic discovery of neighboring clusters available in the same LAN.
  • Transparent offloading: pods scheduled on the virtual node are offloaded to the remote cluster; they can be controlled by merely accessing the pod objects in the local one; the resources needed by the pods (services, endpoints, configmaps, etc.) are translated and replicated remotely. It allows inter-cluster pod-to-pod and pod-to-service communication.
  • Pod resilience: the offloaded pods' lifecycle is controlled by a remote replicaset.
  • Inter-cluster networking: the clusters inter-connection is implemented by a Wireguard tunnel, which ensure encryption and reliability.
  • CNI independence: compliance with many CNIs (Calico, Cilium, Flannel, etc.) even in heterogeneous scenarios (the two clusters can have different CNIs).

Quickstart

This quickstart lets you try Liqo in a playground environment built by two clusters in KinD.

Provision two KinD clusters.
source <(curl -L https://get.liqo.io/clusters.sh)
Install Liqo on both clusters:
export KUBECONFIG=$KUBECONFIG_1
curl -L https://get.liqo.io | bash -s
export KUBECONFIG=$KUBECONFIG_2
curl -L https://get.liqo.io | bash -s

Wait that all containers are up and running. When a new virtual-kubelet pops out, a new node modeling the remote cluster is present and ready to receive pods. Check it out with:

kubectl get nodes
Use the resources

Create a new namespace and label it to tell Liqo that the pods created in that namespace are suitable for offloading in the remote cluster.

kubectl create namespace liqo-demo
kubectl label namespace liqo-demo liqo.io/enabled=true

Deploy the Google microservice Shop application.

kubectl apply -f https://get.liqo.io/app.yaml -n liqo-demo

You can observe that:

  • Your application is correctly working by exposing the application frontend port and later connecting with a browser to localhost:8000. To expose the pod port:
  kubectl port-forward -n liqo-demo service/frontend 8080:80
  • Your application is transparently deployed across two different clusters:
  kubectl get pods -n liqo-demo -o wide  

Installation

Liqo can be installed by using Helm. The configuration depends on the cluster type (K8s, K3s, managed) and the provider. Possible scenarios can be found here.

Once you identified your scenario, follow the instructions for the proper installation environment.

Roadmap

Planned features for the next release (v0.3, expected mid-July, 2021) are the following:

  • Support for deployments spanning across more than two clusters
  • Support for a more balanced scheduling mechanism to distribute jobs across clusters
  • Support for Amazon Elastic Kubernetes Service
  • Support for more-granular permission control over remote cluster resources

Contributing

All contributors are warmly welcome. If you want to become a new contributor, we are so happy!. Just, before doing it, read the repo's guidelines presented on our documentation website.

Community

To get involved with the Liqo community, join the slack channel.

notification Community Meeting
Liqo holds weekly community meeting on Monday, 5.30pm UTC (6.30 CET, 9.30am PST). To join the community meeting, follow this link. Convert to your timezone here.

License

Distributed under the Apache-2.0 License. See License for more information.

FOSSA Status

Liqo is a project kicked off at Polytechnic of Turin (Italy) and actively maintained with :heart: by this open-source community.

Directories

Path Synopsis
apis
config/v1alpha1
Package v1 contains API Schema definitions for the policy v1 API group +kubebuilder:object:generate=true +groupName=config.liqo.io
Package v1 contains API Schema definitions for the policy v1 API group +kubebuilder:object:generate=true +groupName=config.liqo.io
discovery/v1alpha1
Package v1alpha1 contains API Schema definitions for the discovery v1alpha1 API group +kubebuilder:object:generate=true +groupName=discovery.liqo.io
Package v1alpha1 contains API Schema definitions for the discovery v1alpha1 API group +kubebuilder:object:generate=true +groupName=discovery.liqo.io
net/v1alpha1
Package v1alpha1 contains API Schema definitions for the liqonetliqoio v1alpha1 API group +kubebuilder:object:generate=true +groupName=net.liqo.io
Package v1alpha1 contains API Schema definitions for the liqonetliqoio v1alpha1 API group +kubebuilder:object:generate=true +groupName=net.liqo.io
scheduling/v1alpha1
Package v1 contains API Schema definitions for the scheduling v1alpha1 API group +kubebuilder:object:generate=true +groupName=scheduling.liqo.io
Package v1 contains API Schema definitions for the scheduling v1alpha1 API group +kubebuilder:object:generate=true +groupName=scheduling.liqo.io
sharing/v1alpha1
Package v1alpha1 contains API Schema definitions for the sharing v1alpha1 API group +kubebuilder:object:generate=true +groupName=sharing.liqo.io
Package v1alpha1 contains API Schema definitions for the sharing v1alpha1 API group +kubebuilder:object:generate=true +groupName=sharing.liqo.io
virtualKubelet/v1alpha1
Package v1 contains API Schema definitions for the virtualkubelet v1alpha1 API group +kubebuilder:object:generate=true +groupName=virtualkubelet.liqo.io
Package v1 contains API Schema definitions for the virtualkubelet v1alpha1 API group +kubebuilder:object:generate=true +groupName=virtualkubelet.liqo.io
cmd
pkg
virtualKubelet/manager
Package manager provides access to kubernetes resources for providers.
Package manager provides access to kubernetes resources for providers.
virtualKubelet/node/module
Package node implements the components for operating a node in Kubernetes.
Package node implements the components for operating a node in Kubernetes.
virtualKubelet/node/module/api
Package api implements HTTP handlers for handling requests that the kubelet would normally implement, such as pod logs, exec, etc.
Package api implements HTTP handlers for handling requests that the kubelet would normally implement, such as pod logs, exec, etc.
test
internal
liqonet/route-operator
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
liqonet/tunnel-operator
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
utils/errdefs
Package errdefs defines the error types that are understood by other packages in this project.
Package errdefs defines the error types that are understood by other packages in this project.
utils/log
Package log defines the interfaces used for logging in virtual-kubelet.
Package log defines the interfaces used for logging in virtual-kubelet.
utils/log/logrus
Package logrus implements a github.com/netgroup-polito/liqo/internal/log.Logger using Logrus as a backend You can use this by creating a logrus logger and calling `FromLogrus(entry)`.
Package logrus implements a github.com/netgroup-polito/liqo/internal/log.Logger using Logrus as a backend You can use this by creating a logrus logger and calling `FromLogrus(entry)`.
utils/trace
Package trace abstracts virtual-kubelet's tracing capabilities into a set of interfaces.
Package trace abstracts virtual-kubelet's tracing capabilities into a set of interfaces.
utils/trace/opencensus
Package opencensus implements a github.com/netgroup-polito/liqo/internal/trace.Tracer using opencensus as a backend.
Package opencensus implements a github.com/netgroup-polito/liqo/internal/trace.Tracer using opencensus as a backend.