############################################################################## # M3DB Node — Headless Service (for StatefulSet DNS) ############################################################################## apiVersion: v1 kind: Service metadata: name: m3dbnode namespace: m3db labels: app.kubernetes.io/name: m3dbnode app.kubernetes.io/part-of: m3db spec: clusterIP: None ports: - name: client port: 9000 targetPort: 9000 - name: cluster port: 9001 targetPort: 9001 - name: http-node port: 9002 targetPort: 9002 - name: http-cluster port: 9003 targetPort: 9003 - name: debug port: 9004 targetPort: 9004 - name: coordinator port: 7201 targetPort: 7201 selector: app.kubernetes.io/name: m3dbnode --- ############################################################################## # M3DB Node StatefulSet # 3 replicas — one per availability zone / node for HA ############################################################################## apiVersion: apps/v1 kind: StatefulSet metadata: name: m3dbnode namespace: m3db labels: app.kubernetes.io/name: m3dbnode app.kubernetes.io/part-of: m3db spec: serviceName: m3dbnode replicas: 3 podManagementPolicy: Parallel selector: matchLabels: app.kubernetes.io/name: m3dbnode template: metadata: labels: app.kubernetes.io/name: m3dbnode app.kubernetes.io/part-of: m3db annotations: prometheus.io/scrape: "true" prometheus.io/port: "7203" spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app.kubernetes.io/name operator: In values: - m3dbnode topologyKey: kubernetes.io/hostname securityContext: fsGroup: 65534 terminationGracePeriodSeconds: 120 containers: - name: m3dbnode image: quay.io/m3db/m3dbnode:v1.5.0 imagePullPolicy: IfNotPresent args: - "-f" - "/etc/m3db/m3dbnode.yml" ports: - containerPort: 9000 name: client - containerPort: 9001 name: cluster - containerPort: 9002 name: http-node - containerPort: 9003 name: http-cluster - containerPort: 9004 name: debug - containerPort: 7201 name: coordinator - containerPort: 7203 name: metrics volumeMounts: - name: m3db-data mountPath: /var/lib/m3db - name: m3db-config mountPath: /etc/m3db - name: cache-dir mountPath: /var/lib/m3kv resources: requests: cpu: "1" memory: 4Gi limits: cpu: "2" memory: 8Gi livenessProbe: httpGet: path: /health port: 9002 initialDelaySeconds: 60 periodSeconds: 15 timeoutSeconds: 5 failureThreshold: 5 readinessProbe: httpGet: path: /health port: 9002 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 lifecycle: preStop: exec: command: - /bin/sh - -c - "sleep 30" # allow in-flight writes to drain volumes: - name: m3db-config configMap: name: m3db-config - name: cache-dir emptyDir: {} volumeClaimTemplates: - metadata: name: m3db-data spec: storageClassName: vultr-block-storage-m3db accessModes: ["ReadWriteOnce"] resources: requests: storage: 100Gi # Adjust based on retention & cardinality