oneuptime
oneuptime copied to clipboard
Enhancement: Migrate ingress from nginx+loadbalancer service to true ingress
Is your feature request related to a problem? Please describe. Having nginx with a hardcoded config in a custom docker file is normally not a very kubernetes way of doing things.
Describe the solution you'd like In the charts, create the ingress configuration to match various paths.
Describe alternatives you've considered I've started working on this a bit and got it working as far as I can tell.
A configmap to hold the header configs:
custom-headers-configmap
---
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-headers-configmap
namespace: oneuptime
data:
X-Real-IP: "$remote_addr"
X-Forwarded-For: "$proxy_add_x_forwarded_for"
X-Forwarded-Proto: "$scheme"
Host: "$host"
Upgrade: "$http_upgrade"
Connection: "upgrade"
The main ingress that does no url rewrites (nginx-ingress requires different ingresses if you have different rewrite-targets):
main-ingress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oneuptime-main-no-rewrites
annotations:
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
nginx.ingress.kubernetes.io/proxy-set-headers: "custom-headers-configmap"
nginx.ingress.kubernetes.io/enable-websocket: "true"
cert-manager.io/cluster-issuer: letsencrypt-production
external-dns.alpha.kubernetes.io/hostname: oneuptime.example.com.
spec:
ingressClassName: nginx
tls:
- hosts:
- "oneuptime.example.com"
secretName: tls-oneuptime
rules:
- host: "oneuptime.example.com"
http:
paths:
- path: /
pathType: Exact
backend:
service:
name: oneuptime-status-page
port:
number: 3105
- path: /status-page
pathType: Prefix
backend:
service:
name: oneuptime-status-page
port:
number: 3105
- path: /accounts
pathType: Prefix
backend:
service:
name: oneuptime-accounts
port:
number: 3003
- path: /otel-collector
pathType: Prefix
backend:
service:
name: oneuptime-otel-collector
port:
number: 4317
- path: /ingestor
pathType: Prefix
backend:
service:
name: oneuptime-ingestor
port:
number: 3400
- path: /dashboard
pathType: Prefix
backend:
service:
name: oneuptime-dashboard
port:
number: 3009
- path: /admin
pathType: Prefix
backend:
service:
name: oneuptime-admin-dashboard
port:
number: 3158
- path: /identity
pathType: Prefix
backend:
service:
name: oneuptime-identity
port:
number: 3087
- path: /reference/
pathType: Prefix
backend:
service:
name: oneuptime-api-reference
port:
number: 1445
- path: /file
pathType: Prefix
backend:
service:
name: oneuptime-file
port:
number: 3125
- path: /api
pathType: Prefix
backend:
service:
name: oneuptime-dashboard-api
port:
number: 3002
- path: /realtime
pathType: Prefix
backend:
service:
name: oneuptime-dashboard-api
port:
number: 3002
- path: /analytics-api
pathType: Prefix
backend:
service:
name: oneuptime-dashboard-api
port:
number: 3002
- path: /workflow
pathType: Prefix
backend:
service:
name: oneuptime-workflow
port:
number: 3099
- path: /l/
pathType: Prefix
backend:
service:
name: oneuptime-link-shortener
port:
number: 3521
- path: /workers
pathType: Prefix
backend:
service:
name: oneuptime-workers
port:
number: 3452
And then 4 different ingresses for the different rewrite-targets we have:
status-page-api-ingress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oneuptime-status-page-api
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/status-page/
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
nginx.ingress.kubernetes.io/proxy-set-headers: "custom-headers-configmap"
nginx.ingress.kubernetes.io/enable-websocket: "true"
cert-manager.io/cluster-issuer: letsencrypt-production
external-dns.alpha.kubernetes.io/hostname: oneuptime.example.com.
spec:
ingressClassName: nginx
tls:
- hosts:
- "oneuptime.example.com"
secretName: tls-oneuptime
rules:
- host: "oneuptime.example.com"
http:
paths:
- path: /status-page-api/
pathType: Prefix
backend:
service:
name: oneuptime-dashboard-api
port:
number: 3002
status-page-sso-ingress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oneuptime-status-page-sso
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /status-page-sso/
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
nginx.ingress.kubernetes.io/proxy-set-headers: "custom-headers-configmap"
nginx.ingress.kubernetes.io/enable-websocket: "true"
cert-manager.io/cluster-issuer: letsencrypt-production
external-dns.alpha.kubernetes.io/hostname: oneuptime.example.com.
spec:
ingressClassName: nginx
tls:
- hosts:
- "oneuptime.example.com"
secretName: tls-oneuptime
rules:
- host: "oneuptime.example.com"
http:
paths:
- path: /status-page-sso-api/
pathType: Prefix
backend:
service:
name: oneuptime-identity
port:
number: 3087
status-page-identity
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oneuptime-status-page-identity
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /status-page/
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
nginx.ingress.kubernetes.io/proxy-set-headers: "custom-headers-configmap"
nginx.ingress.kubernetes.io/enable-websocket: "true"
cert-manager.io/cluster-issuer: letsencrypt-production
external-dns.alpha.kubernetes.io/hostname: oneuptime.example.com.
spec:
ingressClassName: nginx
tls:
- hosts:
- "oneuptime.example.com"
secretName: tls-oneuptime
rules:
- host: "oneuptime.example.com"
http:
paths:
- path: /status-page-identity-api/
pathType: Prefix
backend:
service:
name: oneuptime-identity
port:
number: 3087
ingestor
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oneuptime-ingestor
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /incoming-request/
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
nginx.ingress.kubernetes.io/proxy-set-headers: "custom-headers-configmap"
nginx.ingress.kubernetes.io/enable-websocket: "true"
cert-manager.io/cluster-issuer: letsencrypt-production
external-dns.alpha.kubernetes.io/hostname: oneuptime.example.com.
spec:
ingressClassName: nginx
tls:
- hosts:
- "oneuptime.example.com"
secretName: tls-oneuptime
rules:
- host: "oneuptime.example.com"
http:
paths:
- path: /heartbeat
pathType: Prefix
backend:
service:
name: oneuptime-ingestor
port:
number: 3400
Additional context I'd do the PR but I'm not sure where to put this in the charts and I'd rather ask first since maybe I'm missing some paths. All the buttons in the web UI work and the experience is butter-smooth as far as I can tell.