Deploy MetalLB with Argo CD

This commit is contained in:
2026-10-18 14:29:48 +02:00
parent 1c14dcf6a8
commit 1ab65c60cf
7 changed files with 110 additions and 0 deletions
+2
View File
@@ -8,6 +8,8 @@ container images and then commits the selected image tag here; it never receives
- `apps/immich-sync/` is the desired Kubernetes state for Immich Share Sync.
- `apps/immichframe/` wraps the reusable ImmichFrame chart with this cluster's
hostname, album selection, resources, and encrypted API credential.
- `apps/metallb/` pins the upstream native MetalLB installation and owns this
cluster's L2 address pool.
- `bootstrap/` contains Argo CD projects and Applications, including the
upstream Sealed Secrets controller.
- `scripts/update-immich-sync-image.sh` is the single image-promotion interface used by CI.
+5
View File
@@ -0,0 +1,5 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://raw.githubusercontent.com/metallb/metallb/v0.16.0/config/manifests/metallb-native.yaml
- resources.yaml
+18
View File
@@ -0,0 +1,18 @@
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
annotations:
argocd.argoproj.io/sync-wave: "1"
spec:
addresses:
- 192.168.0.10-192.168.0.49
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2
namespace: metallb-system
annotations:
argocd.argoproj.io/sync-wave: "1"
+6
View File
@@ -29,3 +29,9 @@ kubectl --namespace argocd wait application/immichframe \
kubectl --namespace argocd wait application/immichframe \
--for=jsonpath='{.status.health.status}'=Healthy \
--timeout=5m
kubectl --namespace argocd wait application/metallb \
--for=jsonpath='{.status.sync.status}'=Synced \
--timeout=5m
kubectl --namespace argocd wait application/metallb \
--for=jsonpath='{.status.health.status}'=Healthy \
--timeout=5m
+2
View File
@@ -6,3 +6,5 @@ resources:
- sealed-secrets.yaml
- immich-sync.yaml
- immichframe.yaml
- metallb-project.yaml
- metallb.yaml
+44
View File
@@ -0,0 +1,44 @@
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: metallb
namespace: argocd
spec:
description: MetalLB controller and site-specific L2 configuration
sourceRepos:
- https://code.brunner.ninja/feedc0de/homelab-gitops.git
destinations:
- namespace: metallb-system
server: https://kubernetes.default.svc
clusterResourceWhitelist:
- group: ""
kind: Namespace
- group: admissionregistration.k8s.io
kind: ValidatingWebhookConfiguration
- group: apiextensions.k8s.io
kind: CustomResourceDefinition
- group: rbac.authorization.k8s.io
kind: ClusterRole
- group: rbac.authorization.k8s.io
kind: ClusterRoleBinding
namespaceResourceWhitelist:
- group: ""
kind: ConfigMap
- group: ""
kind: Secret
- group: ""
kind: Service
- group: ""
kind: ServiceAccount
- group: apps
kind: DaemonSet
- group: apps
kind: Deployment
- group: metallb.io
kind: IPAddressPool
- group: metallb.io
kind: L2Advertisement
- group: rbac.authorization.k8s.io
kind: Role
- group: rbac.authorization.k8s.io
kind: RoleBinding
+33
View File
@@ -0,0 +1,33 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: metallb
namespace: argocd
spec:
project: metallb
source:
repoURL: https://code.brunner.ninja/feedc0de/homelab-gitops.git
targetRevision: main
path: apps/metallb
destination:
server: https://kubernetes.default.svc
namespace: metallb-system
ignoreDifferences:
- group: ""
kind: Secret
name: metallb-webhook-cert
namespace: metallb-system
jsonPointers:
- /data
- group: admissionregistration.k8s.io
kind: ValidatingWebhookConfiguration
name: metallb-webhook-configuration
jqPathExpressions:
- .webhooks[]?.clientConfig.caBundle
syncPolicy:
automated:
enabled: true
prune: false
selfHeal: true
syncOptions:
- RespectIgnoreDifferences=true