Skip to content

Commit 54d8880

Browse files
committed
feat: add Helm chart scaffolding and core templates
Add initial Helm chart under dist/chart/ with core templates that produce the same resources as the kustomize deployment: - Chart.yaml, values.yaml, .helmignore - CRD (crds/mcp.x-k8s.io_mcpservers.yaml) - ServiceAccount (conditional via serviceAccount.create) - RBAC: manager ClusterRole/Binding, leader-election Role/Binding, metrics-auth ClusterRole/Binding, metrics-reader ClusterRole (conditional via rbac.create) - Controller manager Deployment with configurable image, resources, nodeSelector, tolerations, affinity, podAnnotations, podLabels - Metrics Service (port 8443) - NOTES.txt with post-install instructions - _helpers.tpl with standard naming/labeling helpers Part of #132 Signed-off-by: Venkatesh1505 <venkyravi97@gmail.com>
1 parent 644f7f1 commit 54d8880

16 files changed

Lines changed: 2169 additions & 0 deletions

dist/chart/.helmignore

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Patterns to ignore when building packages.
2+
# This supports shell glob matching, relative path matching, and
3+
# negation (prefixed with !). Only one pattern per line.
4+
.DS_Store
5+
# Common VCS dirs
6+
.git/
7+
.gitignore
8+
.bzr/
9+
.bzrignore
10+
.hg/
11+
.hgignore
12+
.svn/
13+
# Common backup files
14+
*.swp
15+
*.bak
16+
*.tmp
17+
*.orig
18+
*~
19+
# Various IDEs
20+
.project
21+
.idea/
22+
*.tmproj
23+
.vscode/

dist/chart/Chart.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: v2
2+
name: mcp-lifecycle-operator
3+
description: A Kubernetes operator that provides a declarative API to deploy, manage, and safely roll out MCP Servers
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
7+
kubeVersion: ">= 1.28.0"
8+
home: https://github.com/kubernetes-sigs/mcp-lifecycle-operator
9+
sources:
10+
- https://github.com/kubernetes-sigs/mcp-lifecycle-operator
11+
keywords:
12+
- kubernetes
13+
- operator
14+
- mcp
15+
- model-context-protocol
16+
maintainers:
17+
- name: mcp-lifecycle-operator maintainers
18+
url: https://github.com/kubernetes-sigs/mcp-lifecycle-operator

dist/chart/crds/mcp.x-k8s.io_mcpservers.yaml

Lines changed: 1648 additions & 0 deletions
Large diffs are not rendered by default.

dist/chart/templates/NOTES.txt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{{ .Chart.Name }} {{ .Chart.AppVersion }} has been deployed successfully!
2+
3+
1. Verify the operator is running:
4+
5+
kubectl get deployment -n {{ .Release.Namespace }} {{ include "mcp-lifecycle-operator.fullname" . }}-controller-manager
6+
7+
2. Create an MCPServer resource:
8+
9+
kubectl apply -f - <<EOF
10+
apiVersion: mcp.x-k8s.io/v1alpha1
11+
kind: MCPServer
12+
metadata:
13+
name: test-server
14+
spec:
15+
source:
16+
type: ContainerImage
17+
containerImage:
18+
ref: quay.io/containers/kubernetes_mcp_server:latest
19+
config:
20+
port: 8080
21+
EOF
22+
23+
3. Check the MCPServer status:
24+
25+
kubectl get mcpservers
26+
27+
For more information, visit: {{ .Chart.Home }}

dist/chart/templates/_helpers.tpl

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "mcp-lifecycle-operator.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
6+
{{- end }}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
*/}}
11+
{{- define "mcp-lifecycle-operator.fullname" -}}
12+
{{- if .Values.fullnameOverride }}
13+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
14+
{{- else }}
15+
{{- $name := default .Chart.Name .Values.nameOverride }}
16+
{{- if contains $name .Release.Name }}
17+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
18+
{{- else }}
19+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
20+
{{- end }}
21+
{{- end }}
22+
{{- end }}
23+
24+
{{/*
25+
Create chart name and version as used by the chart label.
26+
*/}}
27+
{{- define "mcp-lifecycle-operator.chart" -}}
28+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
29+
{{- end }}
30+
31+
{{/*
32+
Common labels
33+
*/}}
34+
{{- define "mcp-lifecycle-operator.labels" -}}
35+
helm.sh/chart: {{ include "mcp-lifecycle-operator.chart" . }}
36+
{{ include "mcp-lifecycle-operator.selectorLabels" . }}
37+
{{- if .Chart.AppVersion }}
38+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
39+
{{- end }}
40+
app.kubernetes.io/managed-by: {{ .Release.Service }}
41+
{{- end }}
42+
43+
{{/*
44+
Selector labels
45+
*/}}
46+
{{- define "mcp-lifecycle-operator.selectorLabels" -}}
47+
app.kubernetes.io/name: {{ include "mcp-lifecycle-operator.name" . }}
48+
app.kubernetes.io/instance: {{ .Release.Name }}
49+
control-plane: controller-manager
50+
{{- end }}
51+
52+
{{/*
53+
Create the name of the service account to use.
54+
*/}}
55+
{{- define "mcp-lifecycle-operator.serviceAccountName" -}}
56+
{{- if .Values.serviceAccount.create }}
57+
{{- default (printf "%s-controller-manager" (include "mcp-lifecycle-operator.fullname" .)) .Values.serviceAccount.name }}
58+
{{- else }}
59+
{{- default "default" .Values.serviceAccount.name }}
60+
{{- end }}
61+
{{- end }}
62+
63+
{{/*
64+
Controller manager image
65+
*/}}
66+
{{- define "mcp-lifecycle-operator.image" -}}
67+
{{- printf "%s:%s" .Values.image.repository (.Values.image.tag | default .Chart.AppVersion) }}
68+
{{- end }}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-controller-manager
5+
namespace: {{ .Release.Namespace }}
6+
labels:
7+
{{- include "mcp-lifecycle-operator.labels" . | nindent 4 }}
8+
spec:
9+
replicas: {{ .Values.replicas }}
10+
selector:
11+
matchLabels:
12+
{{- include "mcp-lifecycle-operator.selectorLabels" . | nindent 6 }}
13+
template:
14+
metadata:
15+
annotations:
16+
kubectl.kubernetes.io/default-container: manager
17+
{{- with .Values.podAnnotations }}
18+
{{- toYaml . | nindent 8 }}
19+
{{- end }}
20+
labels:
21+
{{- include "mcp-lifecycle-operator.selectorLabels" . | nindent 8 }}
22+
{{- with .Values.podLabels }}
23+
{{- toYaml . | nindent 8 }}
24+
{{- end }}
25+
spec:
26+
{{- with .Values.imagePullSecrets }}
27+
imagePullSecrets:
28+
{{- toYaml . | nindent 8 }}
29+
{{- end }}
30+
containers:
31+
- name: manager
32+
image: {{ include "mcp-lifecycle-operator.image" . }}
33+
imagePullPolicy: {{ .Values.image.pullPolicy }}
34+
command:
35+
- /manager
36+
args:
37+
{{- if .Values.leaderElection.enabled }}
38+
- --leader-elect
39+
{{- end }}
40+
- --health-probe-bind-address={{ .Values.healthProbe.bindAddress }}
41+
- --metrics-bind-address={{ .Values.metrics.bindAddress }}
42+
ports:
43+
- name: metrics
44+
containerPort: {{ .Values.metrics.service.port }}
45+
protocol: TCP
46+
- name: health
47+
containerPort: 8081
48+
protocol: TCP
49+
livenessProbe:
50+
httpGet:
51+
path: /healthz
52+
port: 8081
53+
initialDelaySeconds: 15
54+
periodSeconds: 20
55+
readinessProbe:
56+
httpGet:
57+
path: /readyz
58+
port: 8081
59+
initialDelaySeconds: 5
60+
periodSeconds: 10
61+
resources:
62+
{{- toYaml .Values.resources | nindent 12 }}
63+
securityContext:
64+
allowPrivilegeEscalation: false
65+
readOnlyRootFilesystem: true
66+
runAsNonRoot: true
67+
capabilities:
68+
drop:
69+
- ALL
70+
seccompProfile:
71+
type: RuntimeDefault
72+
serviceAccountName: {{ include "mcp-lifecycle-operator.serviceAccountName" . }}
73+
terminationGracePeriodSeconds: 10
74+
{{- with .Values.nodeSelector }}
75+
nodeSelector:
76+
{{- toYaml . | nindent 8 }}
77+
{{- end }}
78+
{{- with .Values.affinity }}
79+
affinity:
80+
{{- toYaml . | nindent 8 }}
81+
{{- end }}
82+
{{- with .Values.tolerations }}
83+
tolerations:
84+
{{- toYaml . | nindent 8 }}
85+
{{- end }}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{{- if .Values.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: Role
4+
metadata:
5+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-leader-election-role
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "mcp-lifecycle-operator.labels" . | nindent 4 }}
9+
rules:
10+
- apiGroups:
11+
- ""
12+
resources:
13+
- configmaps
14+
verbs:
15+
- get
16+
- list
17+
- watch
18+
- create
19+
- update
20+
- patch
21+
- delete
22+
- apiGroups:
23+
- coordination.k8s.io
24+
resources:
25+
- leases
26+
verbs:
27+
- get
28+
- list
29+
- watch
30+
- create
31+
- update
32+
- patch
33+
- delete
34+
- apiGroups:
35+
- ""
36+
resources:
37+
- events
38+
verbs:
39+
- create
40+
- patch
41+
{{- end }}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{{- if .Values.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: RoleBinding
4+
metadata:
5+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-leader-election-rolebinding
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "mcp-lifecycle-operator.labels" . | nindent 4 }}
9+
roleRef:
10+
apiGroup: rbac.authorization.k8s.io
11+
kind: Role
12+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-leader-election-role
13+
subjects:
14+
- kind: ServiceAccount
15+
name: {{ include "mcp-lifecycle-operator.serviceAccountName" . }}
16+
namespace: {{ .Release.Namespace }}
17+
{{- end }}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{{- if .Values.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: ClusterRole
4+
metadata:
5+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-manager-role
6+
labels:
7+
{{- include "mcp-lifecycle-operator.labels" . | nindent 4 }}
8+
rules:
9+
- apiGroups:
10+
- ""
11+
resources:
12+
- configmaps
13+
- secrets
14+
verbs:
15+
- get
16+
- list
17+
- watch
18+
- apiGroups:
19+
- ""
20+
resources:
21+
- services
22+
verbs:
23+
- create
24+
- delete
25+
- get
26+
- list
27+
- patch
28+
- update
29+
- watch
30+
- apiGroups:
31+
- ""
32+
- events.k8s.io
33+
resources:
34+
- events
35+
verbs:
36+
- create
37+
- patch
38+
- apiGroups:
39+
- apps
40+
resources:
41+
- deployments
42+
verbs:
43+
- create
44+
- delete
45+
- get
46+
- list
47+
- patch
48+
- update
49+
- watch
50+
- apiGroups:
51+
- mcp.x-k8s.io
52+
resources:
53+
- mcpservers
54+
verbs:
55+
- create
56+
- delete
57+
- get
58+
- list
59+
- patch
60+
- update
61+
- watch
62+
- apiGroups:
63+
- mcp.x-k8s.io
64+
resources:
65+
- mcpservers/finalizers
66+
verbs:
67+
- update
68+
- apiGroups:
69+
- mcp.x-k8s.io
70+
resources:
71+
- mcpservers/status
72+
verbs:
73+
- get
74+
- patch
75+
- update
76+
{{- end }}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{{- if .Values.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: ClusterRoleBinding
4+
metadata:
5+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-manager-rolebinding
6+
labels:
7+
{{- include "mcp-lifecycle-operator.labels" . | nindent 4 }}
8+
roleRef:
9+
apiGroup: rbac.authorization.k8s.io
10+
kind: ClusterRole
11+
name: {{ include "mcp-lifecycle-operator.fullname" . }}-manager-role
12+
subjects:
13+
- kind: ServiceAccount
14+
name: {{ include "mcp-lifecycle-operator.serviceAccountName" . }}
15+
namespace: {{ .Release.Namespace }}
16+
{{- end }}

0 commit comments

Comments
 (0)