k8slock

package module
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Apr 14, 2024 License: MIT Imports: 12 Imported by: 1

README

k8slock Godoc Go Report Card

k8slock is a Go module that makes it easy to do distributed locking using the Lease resource from the Kubernetes coordination API.

If you want to use Kubernetes to create a simple distributed lock, this module is for you.

This module implements the sync.Locker interface using the Lock() and Unlock() functions.

This module also supports using contexts via the LockContext() and UnlockContext() functions.

Basic Usage

package main

import "github.com/jrhouston/k8slock"

func main() {
    locker, err := k8slock.NewLocker("example-lock")
    if err != nil {
        panic(err)
    }

    locker.Lock()
    // do some work
    locker.Unlock()
}

Basic Usage – Context

package main

import (
    "context"
    "github.com/jrhouston/k8slock"
)

func main() {
    locker, err := k8slock.NewLocker("example-lock")
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    if err := locker.LockContext(ctx); err != nil {
        fmt.Println("Error trying to lock", err)
    }

    // do some work
    
    if err := locker.Unlock(ctx); err != nil {
        fmt.Println("Error trying to unlock", err)
    }
}

Locker Options

The locker can be configured using the following functional options:

Option Details
TTL(duration) The duration until the lock expires and can be forcibly claimed. By default the lock can be held infinitely.
RetryWaitDuration(duration) The duration to wait before retrying after failing to acquired the lock. Default: 1 second.
InClusterConfig() Get the kubernetes client config from inside a pod. Defaults to a clientset using the local kubeconfig.
Clientset(kubernetes.Interface) Configure a custom Kubernetes Clientset. Defaults to a clientset using the local kubeconfig.
Namespace(string) The kubernetes namespace to store the Lease resource. Defaults to "default".
ClientID(string) A unique ID for the client that is trying to obtain the lock. Defaults to a random UUID.
CreateLease(bool) Create a Lease resource if it does not already exist. Defaults to true.

e.g:

locker, err := k8slock.NewLocker("example-lock", k8slock.Namespace("locks"), k8slock.ClientID("client-0"))

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ClientID

func ClientID(id string) lockerOption

ClientID is a unique ID for the client acquiring the lock

func Clientset

func Clientset(c kubernetes.Interface) lockerOption

Clientset configures a custom Kubernetes Clientset

func CreateLease added in v0.2.0

func CreateLease(create bool) lockerOption

CreateLease specifies whether to create lease when it's absent.

func InClusterConfig

func InClusterConfig() lockerOption

InClusterConfig configures the Kubernetes client assuming it is running inside a pod

func Namespace

func Namespace(ns string) lockerOption

Namespace is the namespace used to store the Lease

func RetryWaitDuration

func RetryWaitDuration(d time.Duration) lockerOption

RetryWaitDuration is the duration the Lock function will wait before retrying after failing to acquire the lock

func TTL

func TTL(ttl time.Duration) lockerOption

TTL is the duration a lock can exist before it can be forcibly acquired by another client

Types

type Locker

type Locker struct {
	// contains filtered or unexported fields
}

Locker implements the Locker interface using the kubernetes Lease resource

func NewLocker

func NewLocker(name string, options ...lockerOption) (*Locker, error)

NewLocker creates a Locker

func (*Locker) Lock

func (l *Locker) Lock()

Lock will block until the client is the holder of the Lease resource

func (*Locker) LockContext added in v0.2.0

func (l *Locker) LockContext(ctx context.Context) error

LockContext will block until the client is the holder of the Lease resource

func (*Locker) Unlock

func (l *Locker) Unlock()

Unlock will remove the client as the holder of the Lease resource

func (*Locker) UnlockContext added in v0.2.0

func (l *Locker) UnlockContext(ctx context.Context) error

UnlockContext will remove the client as the holder of the Lease resource

Jump to

Keyboard shortcuts

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