diff --git a/README.md b/README.md index 622b36e..557fabf 100644 --- a/README.md +++ b/README.md @@ -48,5 +48,4 @@ Object Storage from NAS Block Storage from NAS Distributed Storage from: - - RookFS - Longhorn diff --git a/cmd/apps/main.go b/cmd/apps/main.go index 0146785..a8099a5 100644 --- a/cmd/apps/main.go +++ b/cmd/apps/main.go @@ -7,6 +7,7 @@ import ( "danicos.dev/daniel/go-kube/pkg/stack" "danicos.dev/daniel/homelab/pkg/flux" "danicos.dev/daniel/homelab/pkg/linkding" + "danicos.dev/daniel/homelab/pkg/longhorn" "danicos.dev/daniel/homelab/pkg/monitoring" "danicos.dev/daniel/homelab/pkg/root" /* @@ -24,11 +25,20 @@ func main() { "controllers": monitoring.Controllers(), } for name, s := range hydra_monitoring { - fmt.Printf("STACK: %s\n", name) + fmt.Printf("Monitoring STACK: %s\n", name) err = s.MarshalYaml(root.FLUX_INFRA_HYDRA_PATH + "/monitoring") assertNoErr(err) } + hydra_longhorn := map[string]stack.Stack{ + "controllers": longhorn.Controllers(), + } + for name, s := range hydra_longhorn { + fmt.Printf("Longhorn STACK: %s\n", name) + err = s.MarshalYaml(root.FLUX_INFRA_HYDRA_PATH + "/longhorn") + assertNoErr(err) + } + hydra_apps := map[string]stack.Stack{ "linkding": linkding.Stack(), } diff --git a/helmrelease.yaml b/helmrelease.yaml new file mode 100644 index 0000000..661a4db --- /dev/null +++ b/helmrelease.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: longhorn-release + namespace: longhorn-system +spec: + chart: + spec: + chart: longhorn + reconcileStrategy: ChartVersion + sourceRef: + kind: HelmRepository + name: longhorn-repo + version: v1.11.1 + interval: 1m0s diff --git a/infrastructure/hydra/longhorn/controllers/longhorn-stack.yaml b/infrastructure/hydra/longhorn/controllers/longhorn-stack.yaml new file mode 100644 index 0000000..365f25f --- /dev/null +++ b/infrastructure/hydra/longhorn/controllers/longhorn-stack.yaml @@ -0,0 +1,9 @@ +apiVersion: source.toolkit.fluxcd.io/v1 +kind: HelmRepository +metadata: + name: longhorn + namespace: longhorn-system +spec: + interval: 24h0m0s + url: https://charts.longhorn.io +status: {} diff --git a/infrastructure/hydra/longhorn/controllers/namespace.yaml b/infrastructure/hydra/longhorn/controllers/namespace.yaml new file mode 100644 index 0000000..63a2220 --- /dev/null +++ b/infrastructure/hydra/longhorn/controllers/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: longhorn-system +spec: {} +status: {} diff --git a/infrastructure/hydra/longhorn/controllers/release.yaml b/infrastructure/hydra/longhorn/controllers/release.yaml new file mode 100644 index 0000000..b648463 --- /dev/null +++ b/infrastructure/hydra/longhorn/controllers/release.yaml @@ -0,0 +1,21 @@ +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: longhorn + namespace: longhorn-system +spec: + chart: + spec: + chart: longhorn + interval: 12h0m0s + sourceRef: + kind: HelmRepository + name: longhorn + namespace: longhorn-system + version: 1.11.1 + install: + crds: Create + interval: 30m0s + upgrade: + crds: CreateReplace +status: {} diff --git a/magefiles/magefile.go b/magefiles/magefile.go index d3fc39d..ed541b4 100644 --- a/magefiles/magefile.go +++ b/magefiles/magefile.go @@ -48,6 +48,20 @@ func InstallK3S() error { return r.RunV("Install k3s", t) } +func InstallK3S_worker() error { + for _, host := range root.HYDRA_WORKERS { + Env := map[string]string{ + "LINUX_ADMIN": "arch", + "CLUSTER_HOST": root.HYDRA_HOSTNAME, + "HYDRA_WORKER": host, + } + r = target.NewRunner(Env, nil) + t := target.New("./scripts/install_k3s_worker.sh") + r.RunV("Install worker k3s", t) + } + return nil +} + func GetKubeconfig() error { t := target.New("./scripts/get_kubeconfig.sh") return r.RunV("Get Kubeconfig", t) diff --git a/pkg/longhorn/longhorn.go b/pkg/longhorn/longhorn.go new file mode 100644 index 0000000..f97d0a9 --- /dev/null +++ b/pkg/longhorn/longhorn.go @@ -0,0 +1,71 @@ +package longhorn + +import ( + "time" + + "danicos.dev/daniel/go-kube/pkg/kube" + "danicos.dev/daniel/go-kube/pkg/stack" + "danicos.dev/daniel/homelab/pkg/root" + helm "github.com/fluxcd/helm-controller/api/v2" + source "github.com/fluxcd/source-controller/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var meta kube.Metadata +var Namespace = kube.Namespace(root.Longhorn + "-system") + +func init() { + meta = kube.NewMetadata(root.Longhorn, Namespace) +} + +func Controllers() stack.Stack { + s := stack.NewStack("controllers", map[string]any{ + "namespace": Namespace, + "longhorn-stack": LonghornHelmSource(), + "release": LonghornHelmRelease(), + }) + + return s +} + +func LonghornHelmSource() source.HelmRepository { + spec := source.HelmRepositorySpec{ + Interval: durHour(root.FLUX_HELM_MONITORING_INTERVAL), + URL: root.HELM_LONGHORN_URL, + } + return kube.NewFluxHelmRepositorySource(meta, spec) +} + +func LonghornHelmRelease() helm.HelmRelease { + interval := durHour(12) + spec := helm.HelmReleaseSpec{ + Interval: durMin(30), + Chart: &helm.HelmChartTemplate{ + Spec: helm.HelmChartTemplateSpec{ + Chart: root.HELM_LONGHORN_CHART, + Version: root.HELM_LONGHORN_CHART_VERSION, + Interval: &interval, + SourceRef: helm.CrossNamespaceObjectReference{ + Kind: kube.FluxHelmRepositoryMeta.Kind, + Name: meta.Meta().Name, + Namespace: Namespace.Name, + }, + }, + }, + Install: &helm.Install{ + CRDs: helm.Create, + }, + Upgrade: &helm.Upgrade{ + CRDs: helm.CreateReplace, + }, + } + return kube.NewFluxHelmRelease(meta, spec) +} + +func durHour(d int64) metav1.Duration { + return metav1.Duration{Duration: (time.Duration(d) * time.Hour)} +} + +func durMin(d int64) metav1.Duration { + return metav1.Duration{Duration: (time.Duration(d) * time.Minute)} +} diff --git a/pkg/root/root.go b/pkg/root/root.go index 60f7807..53321a8 100644 --- a/pkg/root/root.go +++ b/pkg/root/root.go @@ -28,10 +28,17 @@ const ( HELM_PROMETHEUS_URL = "https://prometheus-community.github.io/helm-charts" HELM_PROMETHEUS_CHART = "kube-prometheus-stack" HELM_PROMETHEUS_CHART_VERSION = "66.x" + HELM_LONGHORN_URL = "https://charts.longhorn.io" + HELM_LONGHORN_CHART = "longhorn" + HELM_LONGHORN_CHART_VERSION = "1.11.1" ) var ( ContainerSecurityContext = &core.SecurityContext{ AllowPrivilegeEscalation: new(false), } + HYDRA_WORKERS = []string{ + "hydra-1", + "hydra-2", + } ) diff --git a/pkg/root/services.go b/pkg/root/services.go index a704316..ce44796 100644 --- a/pkg/root/services.go +++ b/pkg/root/services.go @@ -17,3 +17,4 @@ var Linkding = Service{ } var Monitoring = "monitoring" +var Longhorn = "longhorn" diff --git a/scripts/install_k3s_worker.sh b/scripts/install_k3s_worker.sh new file mode 100755 index 0000000..7efa290 --- /dev/null +++ b/scripts/install_k3s_worker.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -eu + +echo HOST: $CLUSTER_HOST +echo USER: $LINUX_ADMIN +echo WORKER: $HYDRA_WORKER + +NODE_TOKEN=$(ssh $LINUX_ADMIN@$CLUSTER_HOST "sudo cat /var/lib/rancher/k3s/server/node-token") +echo $NODE_TOKEN +# curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="agent --server https://k3s.example.com --token mypassword" sh -s - +# curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="agent" K3S_TOKEN="mypassword" sh -s - --server https://k3s.example.com +# curl -sfL https://get.k3s.io | K3S_URL=https://k3s.example.com sh -s - agent --token mypassword +# curl -sfL https://get.k3s.io | K3S_URL=https://k3s.example.com K3S_TOKEN=mypassword sh -s - # agent is assumed because of K3S_URL