Add Longhorn and hydra-1 and hydra-2 nodes

This commit is contained in:
Daniel Cosme
2026-04-25 18:15:23 -04:00
parent 3062b79fcb
commit c3ef84d4a9
11 changed files with 170 additions and 2 deletions

View File

@@ -48,5 +48,4 @@ Object Storage from NAS
Block Storage from NAS
Distributed Storage from:
- RookFS
- Longhorn

View File

@@ -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(),
}

16
helmrelease.yaml Normal file
View File

@@ -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

View File

@@ -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: {}

View File

@@ -0,0 +1,6 @@
apiVersion: v1
kind: Namespace
metadata:
name: longhorn-system
spec: {}
status: {}

View File

@@ -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: {}

View File

@@ -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)

71
pkg/longhorn/longhorn.go Normal file
View File

@@ -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)}
}

View File

@@ -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",
}
)

View File

@@ -17,3 +17,4 @@ var Linkding = Service{
}
var Monitoring = "monitoring"
var Longhorn = "longhorn"

14
scripts/install_k3s_worker.sh Executable file
View File

@@ -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