Add Headlamp Kubernetes dashboard deployment
- Deploy Headlamp v0.27.0 in dedicated namespace - Configure OIDC authentication with Pocket ID - Grant cluster-admin access via service account - Expose via Traefik ingress at headlamp.basicstack.de - Seal OIDC client credentials - Enable access for andreas.leinen@basicstack.de and admin@basicstack.de Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
parent
0e12e443b7
commit
e640db0880
7 changed files with 192 additions and 0 deletions
17
apps/app-headlamp.yaml
Normal file
17
apps/app-headlamp.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: headlamp
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: default
|
||||
source:
|
||||
repoURL: git@forgejo.forgejo.svc.cluster.local:basicstack/stack.basicstack.de.git
|
||||
targetRevision: main
|
||||
path: apps/headlamp
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: headlamp
|
||||
syncPolicy:
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
42
apps/headlamp/README.md
Normal file
42
apps/headlamp/README.md
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
# Headlamp - Kubernetes Dashboard
|
||||
|
||||
Headlamp is a modern, web-based Kubernetes dashboard that provides a user-friendly interface for managing and monitoring Kubernetes clusters.
|
||||
|
||||
## Deployment
|
||||
|
||||
This deployment includes:
|
||||
|
||||
- **Namespace**: `headlamp`
|
||||
- **Service Account**: `headlamp-admin` with `cluster-admin` ClusterRoleBinding for full cluster access
|
||||
- **OIDC Authentication**: Integrated with Pocket ID (https://auth.basicstack.de)
|
||||
- **Ingress**: Accessible at https://headlamp.basicstack.de
|
||||
|
||||
## OIDC Configuration
|
||||
|
||||
The deployment is configured to authenticate users via Pocket ID using OpenID Connect (OIDC):
|
||||
|
||||
- **Issuer URL**: https://auth.basicstack.de
|
||||
- **Client ID**: Stored in sealed secret `headlamp-oidc`
|
||||
- **Client Secret**: Stored in sealed secret `headlamp-oidc`
|
||||
- **Scopes**: openid, profile, email
|
||||
|
||||
### Authorized Users
|
||||
|
||||
The following users have access to Headlamp through Pocket ID:
|
||||
- andreas.leinen@basicstack.de (admin)
|
||||
- admin@basicstack.de (admin)
|
||||
|
||||
Users authenticate through the Pocket ID SSO and receive cluster-admin permissions via the service account.
|
||||
|
||||
## Resources
|
||||
|
||||
- **Official Documentation**: https://headlamp.dev/docs/
|
||||
- **OIDC Setup Guide**: https://headlamp.dev/docs/latest/installation/in-cluster/oidc
|
||||
- **Source Repository**: https://github.com/headlamp-k8s/headlamp
|
||||
|
||||
## Access
|
||||
|
||||
After deployment via ArgoCD, access the dashboard at:
|
||||
https://headlamp.basicstack.de
|
||||
|
||||
Users will be redirected to Pocket ID for authentication before accessing the cluster dashboard.
|
||||
57
apps/headlamp/deployment.yaml
Normal file
57
apps/headlamp/deployment.yaml
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: headlamp
|
||||
namespace: headlamp
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: headlamp
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: headlamp
|
||||
spec:
|
||||
serviceAccountName: headlamp-admin
|
||||
containers:
|
||||
- name: headlamp
|
||||
image: ghcr.io/headlamp-k8s/headlamp:v0.27.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- "-in-cluster"
|
||||
- "-plugins-dir=/headlamp/plugins"
|
||||
ports:
|
||||
- containerPort: 4466
|
||||
name: http
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: HEADLAMP_CONFIG_BASE_URL
|
||||
value: ""
|
||||
- name: HEADLAMP_CONFIG_OIDC_IDPISSUERURL
|
||||
value: https://auth.basicstack.de
|
||||
- name: HEADLAMP_CONFIG_OIDC_CLIENTID
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: headlamp-oidc
|
||||
key: client-id
|
||||
- name: HEADLAMP_CONFIG_OIDC_CLIENTSECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: headlamp-oidc
|
||||
key: client-secret
|
||||
- name: HEADLAMP_CONFIG_OIDC_SCOPES
|
||||
value: "openid,profile,email"
|
||||
volumeMounts:
|
||||
- name: headlamp-config
|
||||
mountPath: /headlamp/config
|
||||
resources:
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 128Mi
|
||||
volumes:
|
||||
- name: headlamp-config
|
||||
emptyDir: {}
|
||||
19
apps/headlamp/headlamp-oidc-sealed.yaml
Normal file
19
apps/headlamp/headlamp-oidc-sealed.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: headlamp-oidc
|
||||
namespace: headlamp
|
||||
spec:
|
||||
encryptedData:
|
||||
client-id: AgBBqPROu10YqtK7CtUZrJSoQrDA9zt/vExGvr3LUzofqlk3UQdJ2Ifmes8HxtMCIhad43GW1E6Q/Csv6smFhtb4XCV2bqXVzqdJgd0L1JIR8d5VVCPlb+nKAnK7L8y2wNQJSYimGDXvoU1ti0oEP11QfETItxapLyAg1qEmZQJ4YyqaCoFnIl3dmmZep8iBGg4+Xkjvmc/J+oaD4qMk1dCunqrbL7n5vVpt9emSYYwEfWmXG1v/2BSZt7Wib4o0eiK30bnT6vOAAgwv99N/Ze7/OD3LkwUQ0uMykVFFtiO7ihq8+LrgHLfA/Ok1sa/eta7Nh93x1exqjhABiwolCLjJDSDjzdkT6Xx9YIsdnNCr5YPxRm1uoiLNoGf+Jb+lDRQFVkVPOA47CjaLdUvvXhMHjcf6SLERNGeSz+G2DU08qP9n0x3fH0+u1m18tgiZFp0s4J/SS+eCZHQRMxv/j5oDJkXyvI7j1oQINJXnk+JsEFVAjqbkshJRkVOH+P5CKYLUeuLoBNVOhvpRMoWYeyLDCMf874A+2P77FQpmDFoOaaiPrFMN7EvHVE98FYno4DanJqZC0xcHDY0tSwcPXPw0fSBMMO3ANWVlz+sCokR5UBAWZ0/DOPKpYXPFjQ169E5QNnYJ9LQZX6No0PqorFmflgHxNAZlvu+FWtY42jexPltC58nV+bjtSLQjF9LfA4TbCPl9Hb6A/FPsRSehI7+dQYYfaREmS4hRPmgCamRyduDpBTQ=
|
||||
client-secret: AgAouP9gSFtNqKvuh03tDjclwZcUEkxhsXHR9h9YzW5gjizhcuW2RMagBCRyJmKMz/+YqPoPJqJBTr1wl8ZH7oLrwNlaBCfhO3pGt69DQAEk3/plDeBir3zVGMZHAYSUaLtTWHfD6wF6lrGJtiyXtqkT74aw4O3zizl92WVzPPs0FkaqidQ9bLBOPW8cJX53J8Q4VK+8COI+eHmRVlrsSLM+jGzeqBIPdKtmYk5Nf8dNC4fp/WZ3Tkg0p7X9myOgWbgfzip7pPVyyy3+mphEN1IoBnqRyTW5uPJiDvxNy0uNipMqdSus5Qzx++yzHsk0mzhBeIVn5tdqgynU8RbjWY2dB4PhglO9Ae75cLAAhRylhuEF7oa4e+iMOGidNcTzO2bwVvwpUSS359qtXSVRYZLIVFQmHhCEYN904IHYxSJR4NHZlVVsxs1MueG12kPGXLMLTRv3tOTp7xa5E1NvX6ynfnzfiRHCBBE4HQ4xqFJQj3BAC//5aOI50xYK1tUE+0ThU8L+wIaEJvsH6o2d/sZvo/9V2Fu0SEGVjTtQ61w7VDEFswO9X4DH2Sn2QPByz5fKHlN3txRsrRiFTj8exymL63E3EelrIWNylJlqWU/IIgZl/2IVEugBXgoliNPTnwHHVxt8SHNI255sWtOjKiCIWZv/Qj1gVD4RQNBvhD31z6NwqyoVf4qqL08UMVNce+nC4WbB30pDnD9qFvTqLjLIg2dr/gBSJDp0iWi8t0nrPg==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: headlamp-oidc
|
||||
namespace: headlamp
|
||||
annotations:
|
||||
argocd.argoproj.io/compare-options: IgnoreExtraneous
|
||||
type: Opaque
|
||||
25
apps/headlamp/ingress.yaml
Normal file
25
apps/headlamp/ingress.yaml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: headlamp
|
||||
namespace: headlamp
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: headlamp.basicstack.de
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: headlamp
|
||||
port:
|
||||
number: 4466
|
||||
tls:
|
||||
- hosts:
|
||||
- headlamp.basicstack.de
|
||||
secretName: headlamp-tls
|
||||
18
apps/headlamp/service-account.yaml
Normal file
18
apps/headlamp/service-account.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: headlamp-admin
|
||||
namespace: headlamp
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: headlamp-admin
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-admin
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: headlamp-admin
|
||||
namespace: headlamp
|
||||
14
apps/headlamp/service.yaml
Normal file
14
apps/headlamp/service.yaml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: headlamp
|
||||
namespace: headlamp
|
||||
spec:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- port: 4466
|
||||
targetPort: 4466
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
app: headlamp
|
||||
Loading…
Add table
Reference in a new issue