From 0f2c3ab52e04ea1bd7b0eb3303c6224c7de6a68c Mon Sep 17 00:00:00 2001 From: Arvind Prabhakar Date: Sat, 5 Sep 2026 23:29:50 +0000 Subject: [PATCH] Add shared MySQL platform service --- .../platform-services/platform-mysql.yaml | 18 +++++ charts/platform-mysql/Chart.yaml | 6 ++ charts/platform-mysql/templates/service.yaml | 13 ++++ .../platform-mysql/templates/statefulset.yaml | 53 ++++++++++++++ charts/platform-mysql/values.yaml | 18 +++++ .../platform-services/mysql-ingress.yaml | 17 +++++ rendered/platform-mysql/platform-mysql.yaml | 70 +++++++++++++++++++ 7 files changed, 195 insertions(+) create mode 100644 argocd-apps/applications/platform-services/platform-mysql.yaml create mode 100644 charts/platform-mysql/Chart.yaml create mode 100644 charts/platform-mysql/templates/service.yaml create mode 100644 charts/platform-mysql/templates/statefulset.yaml create mode 100644 charts/platform-mysql/values.yaml create mode 100644 infrastructure/network-policies/platform-services/mysql-ingress.yaml create mode 100644 rendered/platform-mysql/platform-mysql.yaml diff --git a/argocd-apps/applications/platform-services/platform-mysql.yaml b/argocd-apps/applications/platform-services/platform-mysql.yaml new file mode 100644 index 0000000..2e2a664 --- /dev/null +++ b/argocd-apps/applications/platform-services/platform-mysql.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: platform-mysql + namespace: argocd +spec: + project: platform + source: + repoURL: http://forgejo.forgejo.svc.cluster.local:3000/symcrest/k8s-platform.git + targetRevision: main + path: rendered/platform-mysql + destination: + server: https://kubernetes.default.svc + namespace: platform-services + syncPolicy: + automated: + prune: false + selfHeal: true diff --git a/charts/platform-mysql/Chart.yaml b/charts/platform-mysql/Chart.yaml new file mode 100644 index 0000000..6420a95 --- /dev/null +++ b/charts/platform-mysql/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: platform-mysql +description: Symcrest shared MySQL database service +type: application +version: 0.1.0 +appVersion: "8.4" diff --git a/charts/platform-mysql/templates/service.yaml b/charts/platform-mysql/templates/service.yaml new file mode 100644 index 0000000..2f6e2d5 --- /dev/null +++ b/charts/platform-mysql/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.name }} + namespace: {{ .Values.namespace }} +spec: + clusterIP: None + selector: + app: {{ .Values.name }} + ports: + - name: mysql + port: 3306 + targetPort: mysql diff --git a/charts/platform-mysql/templates/statefulset.yaml b/charts/platform-mysql/templates/statefulset.yaml new file mode 100644 index 0000000..8812dda --- /dev/null +++ b/charts/platform-mysql/templates/statefulset.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.name }} + namespace: {{ .Values.namespace }} +spec: + serviceName: {{ .Values.name }} + replicas: 1 + + selector: + matchLabels: + app: {{ .Values.name }} + + template: + metadata: + labels: + app: {{ .Values.name }} + + spec: + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} + + containers: + - name: mysql + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: IfNotPresent + + ports: + - name: mysql + containerPort: 3306 + protocol: TCP + + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.auth.secret }} + key: password + + volumeMounts: + - name: data + mountPath: /var/lib/mysql + + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.storage.className }} + resources: + requests: + storage: {{ .Values.storage.size }} diff --git a/charts/platform-mysql/values.yaml b/charts/platform-mysql/values.yaml new file mode 100644 index 0000000..af6d686 --- /dev/null +++ b/charts/platform-mysql/values.yaml @@ -0,0 +1,18 @@ +name: platform-mysql +namespace: platform-services + +image: + repository: mysql + tag: "8.4" + +auth: + database: mysql + username: root + secret: platform-mysql-secret + +storage: + className: longhorn + size: 20Gi + +nodeSelector: + workload: app diff --git a/infrastructure/network-policies/platform-services/mysql-ingress.yaml b/infrastructure/network-policies/platform-services/mysql-ingress.yaml new file mode 100644 index 0000000..9671fa8 --- /dev/null +++ b/infrastructure/network-policies/platform-services/mysql-ingress.yaml @@ -0,0 +1,17 @@ +apiVersion: cilium.io/v2 +kind: CiliumNetworkPolicy +metadata: + name: platform-mysql-ingress + namespace: platform-services +spec: + endpointSelector: + matchLabels: + app: platform-mysql + ingress: + - fromEndpoints: + - matchLabels: + k8s:io.kubernetes.pod.namespace: leantime-poc + toPorts: + - ports: + - port: "3306" + protocol: TCP diff --git a/rendered/platform-mysql/platform-mysql.yaml b/rendered/platform-mysql/platform-mysql.yaml new file mode 100644 index 0000000..1383aeb --- /dev/null +++ b/rendered/platform-mysql/platform-mysql.yaml @@ -0,0 +1,70 @@ +--- +# Source: platform-mysql/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: platform-mysql + namespace: platform-services +spec: + clusterIP: None + selector: + app: platform-mysql + ports: + - name: mysql + port: 3306 + targetPort: mysql +--- +# Source: platform-mysql/templates/statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: platform-mysql + namespace: platform-services +spec: + serviceName: platform-mysql + replicas: 1 + + selector: + matchLabels: + app: platform-mysql + + template: + metadata: + labels: + app: platform-mysql + + spec: + nodeSelector: + workload: app + + containers: + - name: mysql + image: "mysql:8.4" + imagePullPolicy: IfNotPresent + + ports: + - name: mysql + containerPort: 3306 + protocol: TCP + + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: platform-mysql-secret + key: password + + volumeMounts: + - name: data + mountPath: /var/lib/mysql + + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 20Gi