pulumi / pulumi-kubernetesx

Kubernetes for Everyone
Apache License 2.0
135 stars 16 forks source link

general Volume class for multiple mounts and VolumeClaimTemplates #77

Closed protometa closed 5 months ago

protometa commented 1 year ago

Proposed general Volume class to represent and manage other pod volume types. It can be mounted in multiple containers in a pod and will only show up once in the pod spec volumes. It can also be used to create mounted volumeClaimTemplates for StatefulSets.

For example the following contrived code:

const kafkaCerts = new kx.Volume({
  name: 'kafka-certs',
  emptyDir: {}
})

const kafkaData = new kx.Volume({
  name: 'kafka-data',
  // persistentVolumeClaim not specified when used as VolumeClaimTemplate below
})

const kafkaPB = new kx.PodBuilder({
  initContainers: [{
    name: 'init',
    image: "bitnami/kafka:3.2",
    command: ["/init.sh"],
    volumeMounts: [
      kafkaCerts.mount('/opt/bitnami/kafka/config/certs')
    ]
  }],
  containers: [{
    name: 'kafka',
    image: "bitnami/kafka:3.2",
    volumeMounts: [
      kafkaCerts.mount('/opt/bitnami/kafka/config/certs'),
      kafkaData.mount('/bitnami/kafka')
    ]
  }]
})

new kx.StatefulSet('kafka', {
  spec: kafkaPB.asStatefulSetSpec({
    replicas: 3,
    volumeClaimTemplates: [kafkaData.asVolumeClaimTemplate({
      spec: {
        storageClassName: 'local-storage',
        accessModes: ['ReadWriteOnce'],
        resources: { requests: { storage: '10Gi' }},
      }
    })]
  })
}, { provider: k3s })

Will produce the following simplified StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka-0961cc46
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kafka
  serviceName: kafka-service
  template:
    metadata:
      labels:
        app: kafka
    spec:
      initContainers:
      - image: bitnami/kafka:3.2
        name: init
        command:
        - /init.sh
        volumeMounts:
        - mountPath: /opt/bitnami/kafka/config/certs
          name: kafka-certs
      containers:
      - image: bitnami/kafka:3.2
        name: kafka
        volumeMounts:
        - mountPath: /opt/bitnami/kafka/config/certs
          name: kafka-certs
        - mountPath: /bitnami/kafka
          name: kafka-data
      volumes:
      - name: kafka-certs
        emptyDir: {}

  volumeClaimTemplates:
  - metadata:
      name: kafka-data
    spec:
      storageClassName: local-storage
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
protometa commented 1 year ago

Also fixes #69

mjeffryes commented 5 months ago

Due to lack of tests in this repo and the age, we're not in a good position to move this PR forward so closing for now.