1
- # 🚀 Helm Quick-Start Guide (any Kubernetes cluster)
1
+ # 🚀 Deploying the MCP Gateway Stack with Helm
2
2
3
- This doc shows how to use Helm to install, upgrade, and remove the MCP Gateway with PostgreSQL, Redis, PgAdmin and Redis on ** any** Kubernetes cluster—local (* kind* , Docker Desktop, Minikube), on-prem (RKE, Rancher), or managed (* EKS* , * AKS* , * GKE* , * Openshift* , etc.).
3
+ This guide walks you through installing, upgrading, and removing the full ** MCP Gateway Stack** using Helm. The stack includes:
4
+
5
+ * 🧠 MCP Context Forge (the gateway)
6
+ * 🗄 PostgreSQL database
7
+ * ⚡ Redis cache
8
+ * 🧑💻 PgAdmin UI (optional)
9
+ * 🧰 Redis Commander UI (optional)
10
+
11
+ Everything is deployable via Helm on any Kubernetes cluster (Minikube, kind, EKS, AKS, GKE, OpenShift, etc.).
12
+
13
+ > 📦 Helm chart location:
14
+ > [ https://github.com/IBM/mcp-context-forge/tree/main/charts/mcp-stack ] ( https://github.com/IBM/mcp-context-forge/tree/main/charts/mcp-stack )
4
15
5
16
---
6
17
7
18
## 📋 Prerequisites
8
19
9
- | Requirement | Notes & Minimum Versions |
10
- | ----------------------------- | ---------------------------------------------------------------------------------------------- |
11
- | ** Kubernetes** | Cluster reachable by ` kubectl ` ; tested on v1.23 – v1.30 |
12
- | ** Helm 3** | [ https://helm.sh/docs/intro/install/ ] ( https://helm.sh/docs/intro/install/ ) |
13
- | ** kubectl** | ` kubectl version --short ` should return client * and* server |
14
- | ** Container registry access** | If images are private, configure ` imagePullSecrets ` or ` docker login ` on all nodes |
15
- | ** (Ingress)** | Either an Ingress controller ** or** a cloud LB Service class, depending on how you expose HTTP |
20
+ | Requirement | Notes |
21
+ | ------------------ | ------------------------------------------------------------ |
22
+ | Kubernetes ≥ 1.23 | Local (Minikube/kind) or managed (EKS, AKS, GKE, etc.) |
23
+ | Helm 3 | Used for installing and managing releases |
24
+ | kubectl | Configured to talk to your target cluster |
25
+ | Ingress Controller | NGINX, Traefik, or cloud-native (or disable via values.yaml) |
26
+ | StorageClass (RWX) | Required for PostgreSQL PVC unless persistence is disabled |
27
+
28
+ ---
29
+
30
+ ## 🧭 Architecture
31
+
32
+ ``` mermaid
33
+ flowchart TD
34
+ subgraph Ingress Layer
35
+ ingress[NGINX Ingress Controller]
36
+ end
37
+
38
+ subgraph Application Layer
39
+ mcp[MCP Context Forge]
40
+ pgadmin[PgAdmin UI<br/>optional]
41
+ rediscommander[Redis Commander UI<br/>optional]
42
+ end
43
+
44
+ subgraph Data Layer
45
+ postgres[(PostgreSQL)]
46
+ redis[(Redis)]
47
+ end
48
+
49
+ ingress --> mcp
50
+ ingress --> pgadmin
51
+ ingress --> rediscommander
52
+
53
+ mcp --> postgres
54
+ mcp --> redis
55
+
56
+ pgadmin --> postgres
57
+ rediscommander --> redis
58
+ ```
16
59
17
60
---
18
61
19
- ## 1 — Install Helm & kubectl
62
+ ## 🛠 Step 1 - Install Helm & kubectl
20
63
21
- ### macOS (Homebrew)
64
+ ### macOS
22
65
23
66
``` bash
24
67
brew install helm kubernetes-cli
@@ -27,148 +70,190 @@ brew install helm kubernetes-cli
27
70
### Linux
28
71
29
72
``` bash
73
+ # Helm
30
74
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
31
- # kubectl:
75
+
76
+ # kubectl
32
77
curl -LO " https://dl.k8s.io/release/$( curl -sSL https://dl.k8s.io/release/stable.txt) /bin/linux/amd64/kubectl"
33
- sudo install -m 0755 kubectl /usr/local/bin
78
+ chmod +x kubectl
79
+ sudo mv kubectl /usr/local/bin
34
80
```
35
81
36
- ### Windows (PowerShell + Chocolatey )
82
+ ### Windows (PowerShell)
37
83
38
84
``` powershell
39
85
choco install -y kubernetes-helm kubernetes-cli
40
86
```
41
87
42
- Verify:
88
+ Verify installation :
43
89
44
90
``` bash
45
91
helm version
46
92
kubectl version --short
47
- kubectl config get-contexts # choose your target context
93
+ kubectl config get-contexts
48
94
```
49
95
50
96
---
51
97
52
- ## 2 — Lint and (optionally) package
98
+ ## 📦 Step 2 - Clone and inspect the chart
53
99
54
100
``` bash
55
- # Static template check
56
- helm lint charts/mcp-stack
57
-
58
- # Optional: package into dist/ for CI or air-gapped clusters
59
- mkdir -p dist
60
- helm package charts/mcp-stack -d dist
101
+ git clone https://github.com/IBM/mcp-context-forge.git
102
+ cd mcp-context-forge/charts/mcp-stack
103
+ helm lint .
61
104
```
62
105
63
106
---
64
107
65
- ## 3 — Deploy / Upgrade
108
+ ## 🧾 Step 3 - Customize values
66
109
67
- ### 3-A Minimal install (namespace ` mcp ` )
110
+ Copy and modify the default ` values.yaml ` :
68
111
69
112
``` bash
70
- helm upgrade --install mcp-stack charts/mcp-stack \
71
- --namespace mcp --create-namespace \
72
- --wait # blocks until Deployments & Jobs are ready
113
+ cp values.yaml my-values.yaml
73
114
```
74
115
75
- ### 3-B With environment overrides file
116
+ Then edit fields such as:
76
117
77
- ``` bash
78
- helm upgrade --install mcp-stack charts/mcp-stack \
79
- -n mcp --create-namespace \
80
- -f envs/prod-values.yaml \
81
- --set mcpContextForge.image.tag=v1.2.3
118
+ ``` yaml
119
+ mcpContextForge :
120
+ image :
121
+ repository : ghcr.io/ibm/mcp-context-forge
122
+ tag : latest
123
+
124
+ ingress :
125
+ enabled : true
126
+ host : gateway.local
127
+ className : nginx
128
+
129
+ postgres :
130
+ credentials :
131
+ user : admin
132
+ password : test123
133
+
134
+ pgadmin :
135
+ enabled : true
136
+
137
+ redisCommander :
138
+ enabled : true
82
139
` ` `
83
140
84
- * (The chart's ` values.yaml ` documents every knob—replicas, resources, ingress host, DB credentials, persistence, …)*
141
+ ---
142
+
143
+ ## 🚀 Step 4 - Install / Upgrade the stack
144
+
145
+ ` ` ` bash
146
+ helm upgrade --install mcp-stack . \
147
+ --namespace mcp --create-namespace \
148
+ -f my-values.yaml \
149
+ --wait
150
+ ```
85
151
86
152
---
87
153
88
- ## 4 — Verify
154
+ ## ✅ Step 5 - Verify deployment
89
155
90
156
``` bash
91
- # All resources in the namespace
92
157
kubectl get all -n mcp
93
-
94
- # Release status
95
158
helm status mcp-stack -n mcp
159
+ ```
160
+
161
+ If using Ingress:
96
162
97
- # Tail logs
98
- kubectl logs -n mcp deploy/mcp-stack-app -f
163
+ ``` bash
164
+ kubectl get ingress -n mcp
165
+ curl http://gateway.local/health
99
166
```
100
167
101
- ### Ingress / Service exposure
168
+ If not using Ingress:
102
169
103
- * ** Ingress controller present** → run ` kubectl get ingress -n mcp ` .
104
- * ** No Ingress** → change ` mcpContextForge.service.type ` to ` LoadBalancer ` or ` NodePort ` .
170
+ ``` bash
171
+ kubectl port-forward svc/mcp-stack-app 8080:80 -n mcp
172
+ curl http://localhost:8080/health
173
+ ```
105
174
106
175
---
107
176
108
- ## 5 — Updates & Rollbacks
177
+ ## 🔄 Step 6 - Upgrade & Rollback
109
178
110
- ### Rolling upgrade
179
+ ### Upgrade (e.g. new image tag)
111
180
112
181
``` bash
113
- helm upgrade mcp-stack charts/mcp-stack -n mcp \
114
- --set mcpContextForge.image.tag=v1.3.0
182
+ helm upgrade mcp-stack . -n mcp \
183
+ --set mcpContextForge.image.tag=v1.2.3 \
184
+ --wait
115
185
```
116
186
117
- ### Diff before upgrade (requires plugin)
187
+ ### Preview changes (diff plugin)
118
188
119
189
``` bash
120
- helm plugin install https://github.com/databus23/helm-diff # once
121
- helm diff upgrade mcp-stack charts/mcp-stack -n mcp -f values.yaml
190
+ helm plugin install https://github.com/databus23/helm-diff
191
+ helm diff upgrade mcp-stack . -n mcp -f my- values.yaml
122
192
```
123
193
124
- ### Roll back
194
+ ### Rollback
125
195
126
196
``` bash
127
- helm rollback mcp-stack < REVISION> -n mcp
128
- # list revisions:
129
- helm history mcp-stack -n mcp
197
+ helm rollback mcp-stack 1 -n mcp
130
198
```
131
199
132
200
---
133
201
134
- ## 6 — Uninstall
202
+ ## 🧹 Step 7 - Uninstall
135
203
136
204
``` bash
137
205
helm uninstall mcp-stack -n mcp
138
- # Optional: delete namespace / PVCs
139
- kubectl delete ns mcp
206
+ kubectl delete ns mcp # optional cleanup
207
+ ```
208
+
209
+ ---
210
+
211
+ ## 🧪 CI/CD: Packaging & OCI Push
212
+
213
+ ``` bash
214
+ helm lint .
215
+ helm package . -d dist/
216
+ helm push dist/mcp-stack-* .tgz oci://ghcr.io/< your-org> /charts
140
217
```
141
218
142
- Persistent volumes created with the namespace remain until you delete the PVC/PV objects ( or the storage class policy garbage-collects them) .
219
+ Used with GitOps tools like Argo CD or Flux .
143
220
144
221
---
145
222
146
- ## 7 — Troubleshooting Cheatsheet
223
+ ## 🧯 Troubleshooting
147
224
148
- | Symptom | Quick check | |
149
- | ------------------------------------ | ----------------------------------------------------- | ------------------ ---------------------------------- |
150
- | Pods stuck in ` ImagePullBackOff ` | ` kubectl describe pod … ` → pull secret / repo access | |
151
- | ` CrashLoopBackOff ` | ` kubectl logs … ` → env vars, DB connectivity | |
152
- | Ingress 404 / no address | \` kubectl get svc -A | grep ingress \` – controller running? LB provisioned? |
153
- | Helm hook failures (Jobs) | ` kubectl get jobs -n mcp && kubectl logs job/<name> ` | |
154
- | Template error during ` helm install ` | ` helm lint charts/mcp-stack ` or run \` helm template … | yq \` |
225
+ | Symptom | Command / Fix | |
226
+ | ------------------- | -------------------------------------------------- | ---------------------------------- |
227
+ | ImagePullBackOff | Check pull secrets & image name | |
228
+ | Ingress 404 / no IP | \ ` kubectl get svc -A | grep ingress \` - controller ready? |
229
+ | CrashLoopBackOff | ` kubectl logs -n mcp deploy/mcp-stack-app ` | |
230
+ | Job fails | ` kubectl get jobs -n mcp && kubectl logs job/… ` | |
231
+ | Invalid values | ` helm lint . && helm template . -f my-values.yaml ` | |
155
232
156
233
---
157
234
158
- ## 8 — CI/CD tips
235
+ ## 🧾 values.yaml - Common Keys
236
+
237
+ | Key | Default | Purpose |
238
+ | -------------------------------------------- | ----------- | ---------------------------------- |
239
+ | ` mcpContextForge.image.tag ` | ` latest ` | Image version for the Gateway |
240
+ | ` mcpContextForge.ingress.enabled ` | ` true ` | Enables ingress |
241
+ | ` mcpContextForge.service.type ` | ` ClusterIP ` | Change to ` LoadBalancer ` if needed |
242
+ | ` postgres.persistence.enabled ` | ` true ` | Enables a persistent volume claim |
243
+ | ` pgadmin.enabled ` / ` redisCommander.enabled ` | ` false ` | Optional admin UIs |
159
244
160
- * ** Package once** → push chart (` .tgz ` ) to OCI registry (` helm push ` with ` oci:// ` URLs) or ` chartmuseum ` .
161
- * ** Values per environment** → ` values-dev.yaml ` , ` values-prod.yaml ` , etc.
162
- * ** GitOps** → use Argo CD / Flux to watch the chart + values in Git and auto-sync.
245
+ See full annotations in ` values.yaml ` .
163
246
164
247
---
165
248
166
- ## 🌐 Further reading
249
+ ## 📚 Further Reading
167
250
168
- * Helm docs – [ https://helm.sh/docs/ ] ( https://helm.sh/docs/ )
169
- * Kubernetes Ingress concepts – [ https://kubernetes.io/docs/concepts/services-networking/ingress/ ] ( https://kubernetes.io/docs/concepts/services-networking/ingress/ )
170
- * Persistent Volumes – [ https://kubernetes.io/docs/concepts/storage/persistent-volumes/ ] ( https://kubernetes.io/docs/concepts/storage/persistent-volumes/ )
251
+ * Helm: [ https://helm.sh/docs/ ] ( https://helm.sh/docs/ )
252
+ * Kubernetes Ingress: [ https://kubernetes.io/docs/concepts/services-networking/ingress/ ] ( https://kubernetes.io/docs/concepts/services-networking/ingress/ )
253
+ * Persistent Volumes: [ https://kubernetes.io/docs/concepts/storage/persistent-volumes/ ] ( https://kubernetes.io/docs/concepts/storage/persistent-volumes/ )
254
+ * Helm OCI Registry: [ https://helm.sh/docs/topics/registries/ ] ( https://helm.sh/docs/topics/registries/ )
255
+ * Argo CD: [ https://argo-cd.readthedocs.io ] ( https://argo-cd.readthedocs.io )
171
256
172
257
---
173
258
174
- Deploying with Helm turns your stack into a versioned, repeatable artefact—ideal for local dev, staging , and production alike .
259
+ ✅ You now have a production-ready Helm workflow for MCP Context Forge. It's CI-friendly, customizable , and tested across Kubernetes distributions .
0 commit comments