Skip to content

Commit 859dddb

Browse files
authored
key manager poc (#19)
Signed-off-by: Brent Salisbury <bsalisbu@redhat.com>
1 parent c5e5f11 commit 859dddb

18 files changed

+1656
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
apiVersion: v1
3+
kind: Namespace
4+
metadata:
5+
name: platform-services
6+
labels:
7+
istio-injection: disabled
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
---
2+
apiVersion: v1
3+
kind: ServiceAccount
4+
metadata:
5+
name: key-manager
6+
namespace: platform-services
7+
---
8+
apiVersion: rbac.authorization.k8s.io/v1
9+
kind: Role
10+
metadata:
11+
name: key-manager-secrets
12+
namespace: llm
13+
rules:
14+
- apiGroups: [""]
15+
resources: ["secrets"]
16+
verbs: ["get","list","create","delete","watch"]
17+
---
18+
apiVersion: rbac.authorization.k8s.io/v1
19+
kind: RoleBinding
20+
metadata:
21+
name: key-manager-secrets
22+
namespace: llm
23+
subjects:
24+
- kind: ServiceAccount
25+
name: key-manager
26+
namespace: platform-services
27+
roleRef:
28+
apiGroup: rbac.authorization.k8s.io
29+
kind: Role
30+
name: key-manager-secrets
31+
---
32+
# Optional: Allow key-manager to read HTTPRoutes for discovery endpoint
33+
apiVersion: rbac.authorization.k8s.io/v1
34+
kind: Role
35+
metadata:
36+
name: key-manager-httproutes
37+
namespace: llm
38+
rules:
39+
- apiGroups: ["gateway.networking.k8s.io"]
40+
resources: ["httproutes"]
41+
verbs: ["get","list","watch"]
42+
---
43+
apiVersion: rbac.authorization.k8s.io/v1
44+
kind: RoleBinding
45+
metadata:
46+
name: key-manager-httproutes
47+
namespace: llm
48+
subjects:
49+
- kind: ServiceAccount
50+
name: key-manager
51+
namespace: platform-services
52+
roleRef:
53+
apiGroup: rbac.authorization.k8s.io
54+
kind: Role
55+
name: key-manager-httproutes
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: key-manager
6+
namespace: platform-services
7+
labels:
8+
app: key-manager
9+
version: v1
10+
spec:
11+
replicas: 1
12+
selector:
13+
matchLabels:
14+
app: key-manager
15+
template:
16+
metadata:
17+
labels:
18+
app: key-manager
19+
version: v1
20+
annotations:
21+
sidecar.istio.io/inject: "false"
22+
spec:
23+
serviceAccountName: key-manager
24+
securityContext:
25+
runAsNonRoot: true
26+
containers:
27+
- name: api
28+
image: ghcr.io/nerdalert/maas-key-manager:latest
29+
imagePullPolicy: Always
30+
ports:
31+
- containerPort: 8080
32+
name: http
33+
protocol: TCP
34+
env:
35+
- name: KEY_NAMESPACE
36+
value: llm
37+
- name: SECRET_SELECTOR_LABEL
38+
value: kuadrant.io/apikeys-by
39+
- name: SECRET_SELECTOR_VALUE
40+
value: rhcl-keys
41+
- name: DISCOVERY_ROUTE
42+
value: inference-route
43+
- name: PORT
44+
value: "8080"
45+
- name: ADMIN_API_KEY
46+
valueFrom:
47+
secretKeyRef:
48+
name: key-manager-admin
49+
key: admin-key
50+
livenessProbe:
51+
httpGet:
52+
path: /health
53+
port: http
54+
initialDelaySeconds: 30
55+
periodSeconds: 10
56+
timeoutSeconds: 5
57+
failureThreshold: 3
58+
readinessProbe:
59+
httpGet:
60+
path: /health
61+
port: http
62+
initialDelaySeconds: 5
63+
periodSeconds: 5
64+
timeoutSeconds: 3
65+
failureThreshold: 3
66+
resources:
67+
requests:
68+
memory: "64Mi"
69+
cpu: "250m"
70+
limits:
71+
memory: "128Mi"
72+
cpu: "500m"
73+
securityContext:
74+
allowPrivilegeEscalation: false
75+
capabilities:
76+
drop:
77+
- ALL
78+
readOnlyRootFilesystem: true
79+
runAsNonRoot: true
80+
---
81+
apiVersion: v1
82+
kind: Service
83+
metadata:
84+
name: key-manager
85+
namespace: platform-services
86+
labels:
87+
app: key-manager
88+
spec:
89+
selector:
90+
app: key-manager
91+
ports:
92+
- name: http
93+
port: 80
94+
targetPort: 8080
95+
protocol: TCP
96+
type: ClusterIP
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
apiVersion: kuadrant.io/v1
3+
kind: AuthPolicy
4+
metadata:
5+
name: gateway-auth-policy
6+
namespace: llm
7+
spec:
8+
targetRef:
9+
group: gateway.networking.k8s.io
10+
kind: Gateway
11+
name: inference-gateway
12+
rules:
13+
authentication:
14+
api-key-users-apikey:
15+
apiKey:
16+
allNamespaces: true
17+
selector:
18+
matchLabels:
19+
kuadrant.io/apikeys-by: rhcl-keys
20+
credentials:
21+
authorizationHeader:
22+
prefix: APIKEY
23+
api-key-users-bearer:
24+
apiKey:
25+
allNamespaces: true
26+
selector:
27+
matchLabels:
28+
kuadrant.io/apikeys-by: rhcl-keys
29+
credentials:
30+
authorizationHeader:
31+
prefix: Bearer
32+
response:
33+
success:
34+
filters:
35+
identity:
36+
json:
37+
properties:
38+
userid:
39+
selector: auth.identity.metadata.labels.maas/user-id
40+
groups:
41+
selector: auth.identity.metadata.labels.maas/user-id
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Gateway-level Token Rate Limiting Policy for key-manager integration
2+
# Automatically tracks tokens from response bodies (usage.total_tokens)
3+
# Uses user groups from secret annotations set by key-manager
4+
---
5+
apiVersion: kuadrant.io/v1alpha1
6+
kind: TokenRateLimitPolicy
7+
metadata:
8+
name: gateway-token-rate-limits
9+
namespace: llm
10+
spec:
11+
targetRef:
12+
group: gateway.networking.k8s.io
13+
kind: Gateway
14+
name: inference-gateway
15+
limits:
16+
all-users-tokens:
17+
rates:
18+
- limit: 10000
19+
window: 1m
20+
counters:
21+
- expression: auth.identity.userid
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Optional: External access for remote key management
2+
# Choose ONE of the options below based on your cluster setup TODO: pick one
3+
4+
# Option 1: OpenShift Route (for OpenShift clusters)
5+
---
6+
apiVersion: route.openshift.io/v1
7+
kind: Route
8+
metadata:
9+
name: key-manager-route
10+
namespace: platform-services
11+
spec:
12+
to:
13+
kind: Service
14+
name: key-manager
15+
port:
16+
targetPort: http
17+
tls:
18+
termination: edge
19+
insecureEdgeTerminationPolicy: Redirect
20+
21+
# Option 2: Kubernetes Ingress (for other clusters)
22+
---
23+
apiVersion: networking.k8s.io/v1
24+
kind: Ingress
25+
metadata:
26+
name: key-manager-ingress
27+
namespace: platform-services
28+
annotations:
29+
nginx.ingress.kubernetes.io/ssl-redirect: "true"
30+
spec:
31+
tls:
32+
- hosts:
33+
- key-manager.your-domain.com
34+
secretName: key-manager-tls
35+
rules:
36+
- host: key-manager.your-domain.com
37+
http:
38+
paths:
39+
- path: /
40+
pathType: Prefix
41+
backend:
42+
service:
43+
name: key-manager
44+
port:
45+
number: 80
46+
47+
# Option 3: LoadBalancer Service (for cloud providers)
48+
---
49+
apiVersion: v1
50+
kind: Service
51+
metadata:
52+
name: key-manager-external
53+
namespace: platform-services
54+
spec:
55+
type: LoadBalancer
56+
selector:
57+
app: key-manager
58+
ports:
59+
- name: http
60+
port: 80
61+
targetPort: 8080
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Admin API key secret for key-manager authentication
2+
# Generate a secure admin key and replace the placeholder
3+
---
4+
apiVersion: v1
5+
kind: Secret
6+
metadata:
7+
name: key-manager-admin
8+
namespace: platform-services
9+
type: Opaque
10+
stringData:
11+
admin-key: "<INSERT-ADMIN-KEY>"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# HTTPRoute for Key Manager Service
2+
# Provides external access via domain-based routing
3+
---
4+
apiVersion: gateway.networking.k8s.io/v1
5+
kind: HTTPRoute
6+
metadata:
7+
name: key-manager-domain-route
8+
namespace: llm
9+
labels:
10+
kuadrant.io/gateway: inference-gateway
11+
spec:
12+
parentRefs:
13+
- name: inference-gateway
14+
namespace: llm
15+
hostnames:
16+
- "key-manager.apps.summit-gpu.octo-emerging.redhataicoe.com"
17+
rules:
18+
- matches:
19+
- path:
20+
type: PathPrefix
21+
value: /
22+
backendRefs:
23+
- name: key-manager
24+
namespace: platform-services
25+
port: 80
26+
weight: 100
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# ReferenceGrant to allow HTTPRoute in llm namespace to reference
2+
# key-manager service in platform-services namespace
3+
---
4+
apiVersion: gateway.networking.k8s.io/v1beta1
5+
kind: ReferenceGrant
6+
metadata:
7+
name: key-manager-access
8+
namespace: platform-services
9+
spec:
10+
from:
11+
- group: gateway.networking.k8s.io
12+
kind: HTTPRoute
13+
namespace: llm
14+
to:
15+
- group: ""
16+
kind: Service
17+
name: key-manager
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# OpenShift Route for Key Manager Service
2+
# Directs traffic from OpenShift router to Istio gateway
3+
---
4+
apiVersion: route.openshift.io/v1
5+
kind: Route
6+
metadata:
7+
name: key-manager-route
8+
namespace: llm
9+
labels:
10+
app: maas-gateway
11+
spec:
12+
host: key-manager.apps.summit-gpu.octo-emerging.redhataicoe.com
13+
port:
14+
targetPort: 80
15+
to:
16+
kind: Service
17+
name: inference-gateway-istio
18+
weight: 100
19+
wildcardPolicy: None

0 commit comments

Comments
 (0)