Skip to content

Commit 68f4e4c

Browse files
committed
Nginx sidecar
1 parent f7c90cf commit 68f4e4c

File tree

5 files changed

+130
-2
lines changed

5 files changed

+130
-2
lines changed

charts/document-engine/templates/deployment.yaml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,34 @@ spec:
203203
lifecycle:
204204
{{- toYaml . | nindent 12 }}
205205
{{- end }}
206+
{{- if .Values.nginxSidecar.enabled }}
207+
- name: nginx-sidecar
208+
image: {{ .Values.nginxSidecar.image }}
209+
imagePullPolicy: IfNotPresent
210+
ports:
211+
- name: nginx
212+
containerPort: {{ .Values.nginxSidecar.port }}
213+
protocol: TCP
214+
resources:
215+
{{- toYaml .Values.nginxSidecar.resources | nindent 12 }}
216+
volumeMounts:
217+
- name: nginx-config
218+
mountPath: /etc/nginx/nginx.conf
219+
subPath: nginx.conf
220+
{{- end }}
206221
{{- if .Values.sidecars }}
207222
{{ toYaml .Values.sidecars | nindent 8 }}
208223
{{- end }}
209224
{{- if or .Values.extraVolumeMounts
210-
.Values.certificateTrust.digitalSignatures
211-
.Values.certificateTrust.customCertificates }}
225+
.Values.certificateTrust.digitalSignatures
226+
.Values.certificateTrust.customCertificates
227+
.Values.nginxSidecar.enabled }}
212228
volumes:
229+
{{- if .Values.nginxSidecar.enabled }}
230+
- name: nginx-config
231+
configMap:
232+
name: {{ include "document-engine.fullname" . }}-nginx-sidecar
233+
{{- end }}
213234
{{- with .Values.extraVolumes }}
214235
{{ toYaml . | nindent 8 }}
215236
{{- end }}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{{- if .Values.nginxSidecar.enabled -}}
2+
{{- $fullName := include "document-engine.fullname" . -}}
3+
apiVersion: v1
4+
kind: ConfigMap
5+
metadata:
6+
name: {{ $fullName }}-nginx-sidecar
7+
labels:
8+
{{- include "document-engine.labels" . | nindent 4 }}
9+
data:
10+
nginx.conf: |
11+
events {
12+
worker_connections 1024;
13+
}
14+
15+
http {
16+
# Extract document ID from URI
17+
map $uri $document_id {
18+
default "";
19+
~^/api/documents/([a-zA-Z0-9._~-]+) $1;
20+
~^/i/d/([a-zA-Z0-9._~-]+) $1;
21+
~^/documents/([a-zA-Z0-9._~-]+) $1;
22+
~^/dashboard/api/document/([a-zA-Z0-9._~-]+) $1;
23+
}
24+
25+
# Use hash_key for routing decision
26+
map $document_id $hash_key {
27+
default $request_id;
28+
"~." $document_id;
29+
}
30+
31+
resolver kube-dns.kube-system.svc.cluster.local valid=5s;
32+
33+
upstream document_engine_backend {
34+
# Resolve DNS to get all pod IPs from headless service
35+
server {{ $fullName }}-headless.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.service.port }} resolve;
36+
37+
# Consistent hash based on document ID
38+
hash $hash_key consistent;
39+
}
40+
41+
server {
42+
listen {{ .Values.nginxSidecar.port }};
43+
44+
location / {
45+
# Add debug headers
46+
add_header X-Hash-Key $hash_key always;
47+
add_header X-Pod-Name $hostname always;
48+
49+
# Forward to consistent backend
50+
proxy_pass http://document_engine_backend;
51+
proxy_set_header Host $host;
52+
proxy_set_header X-Real-IP $remote_addr;
53+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
54+
proxy_set_header X-Forwarded-Proto $scheme;
55+
56+
# Timeouts
57+
proxy_connect_timeout 60s;
58+
proxy_send_timeout 60s;
59+
proxy_read_timeout 60s;
60+
}
61+
}
62+
}
63+
{{- end }}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{{- if .Values.nginxSidecar.enabled -}}
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: {{ include "document-engine.fullname" . }}-headless
6+
labels:
7+
{{- include "document-engine.labels" . | nindent 4 }}
8+
spec:
9+
clusterIP: None
10+
selector:
11+
{{- include "document-engine.selectorLabels" . | nindent 4 }}
12+
ports:
13+
- port: {{ .Values.service.port }}
14+
targetPort: api
15+
protocol: TCP
16+
name: api
17+
{{- end }}

charts/document-engine/templates/service.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ spec:
1818
{{- end }}
1919
ports:
2020
- port: {{ .Values.service.port }}
21+
{{- if .Values.nginxSidecar.enabled }}
22+
targetPort: nginx
23+
{{- else }}
2124
targetPort: api
25+
{{- end }}
2226
protocol: TCP
2327
name: api
2428
{{- with .Values.observability.metrics.prometheusEndpoint }}

charts/document-engine/values.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,29 @@ extraIngresses: {}
890890
# pathType: Prefix
891891
# tls: []
892892

893+
# -- (object) Nginx sidecar for consistent hashing by document ID
894+
# @section -- C. Networking
895+
# @notationType -- reference
896+
nginxSidecar:
897+
# -- Enable nginx sidecar for consistent hashing
898+
# @section -- C. Networking
899+
enabled: false
900+
# -- Nginx sidecar image
901+
# @section -- C. Networking
902+
image: nginx:1.25-alpine
903+
# -- Port where nginx sidecar listens
904+
# @section -- C. Networking
905+
port: 8080
906+
# -- Resource limits for nginx sidecar
907+
# @section -- C. Networking
908+
resources:
909+
limits:
910+
cpu: 100m
911+
memory: 128Mi
912+
requests:
913+
cpu: 50m
914+
memory: 64Mi
915+
893916
# https://editor.networkpolicy.io/
894917
# -- (object) [Network policy](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
895918
# @section -- C. Networking

0 commit comments

Comments
 (0)