homelab/services/ha-sync/internal/kube/client.go
Dan V 26db771279 ha-sync: add internal/kube package with CronJob/Lease management
- internal/kube/client.go: NewClient() with in-cluster + kubeconfig fallback
- internal/kube/cronjob.go: JobSpec, ApplyCronJob, DeleteCronJob, TriggerJob,
  GetLockStatus, SuspendCronJob, ListCronJobs, ImportFromCronJob
- Makefile/Dockerfile: add ha-sync-ctl build target
- rbac.yaml: add batch/cronjobs+jobs permissions and watch verb on leases

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-08 23:38:32 +02:00

33 lines
843 B
Go

package kube
import (
"fmt"
"os"
"path/filepath"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// NewClient builds a Kubernetes clientset. It tries in-cluster config first
// (running inside a pod), then falls back to ~/.kube/config for local use.
func NewClient() (*kubernetes.Clientset, error) {
cfg, err := rest.InClusterConfig()
if err != nil {
home, _ := os.UserHomeDir()
kubeconfig := filepath.Join(home, ".kube", "config")
if kc := os.Getenv("KUBECONFIG"); kc != "" {
kubeconfig = kc
}
cfg, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, fmt.Errorf("kube: build config: %w", err)
}
}
client, err := kubernetes.NewForConfig(cfg)
if err != nil {
return nil, fmt.Errorf("kube: new client: %w", err)
}
return client, nil
}