How to mount a configMap as a volume mount in a Stateful Set
Asked Answered
S

2

8

I don't see an option to mount a configMap as volume in the statefulset , as per https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#statefulset-v1-apps only PVC can be associated with "StatefulSet" . But PVC does not have option for configMaps.

Sematic answered 14/2, 2020 at 16:7 Comment(0)
C
17

Here is a minimal example:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example
spec:
  selector:
    matchLabels:
      app: example
  serviceName: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
        - name: example
          image: nginx:stable-alpine
          volumeMounts:
            - mountPath: /config
              name: example-config
      volumes:
        - name: example-config
          configMap:
            name: example-configmap
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap
data:
  a: "1"
  b: "2"

In the container, you can find the files a and b under /config, with the contents 1 and 2, respectively.

Some explanation: You do not need a PVC to mount the configmap as a volume to your pods. PersistentVolumeClaims are persistent drives, which you can read from/write to. An example for their usage is a database, such as Postgres.

ConfigMaps on the other hand are read-only key-value structures that are stored inside Kubernetes (in its etcd store), which are to store the configuration for your application. Their values can be mounted as environment variables or as files, either individually or altogether.

Cruces answered 14/2, 2020 at 16:28 Comment(0)
C
1

I have done it in this way.

apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-configmap
  namespace: default
data:
  enabled_plugins: |
    [rabbitmq_management,rabbitmq_shovel,rabbitmq_shovel_management].
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rabbitmq
  labels:
    component: rabbitmq
spec:
  serviceName: "rabbitmq"
  replicas: 1
  selector:
    matchLabels:
     component: rabbitmq
  template:
    metadata:
      labels:
        component: rabbitmq
    spec:
      initContainers:
      - name: "rabbitmq-config"
        image: busybox:1.32.0
        volumeMounts:
        - name: rabbitmq-config
          mountPath: /tmp/rabbitmq
        - name: rabbitmq-config-rw
          mountPath: /etc/rabbitmq
        command:
        - sh
        - -c
        - cp /tmp/rabbitmq/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf && echo '' >> /etc/rabbitmq/rabbitmq.conf;
          cp /tmp/rabbitmq/enabled_plugins /etc/rabbitmq/enabled_plugins
      volumes:
      - name: rabbitmq-config
        configMap:
          name: rabbitmq-configmap
          optional: false
          items:
          - key: enabled_plugins
            path: "enabled_plugins"
      - name: rabbitmq-config-rw
        emptyDir: {}
      containers:
        - name: rabbitmq
          image: rabbitmq:3.8.5-management
          env:
          - name: RABBITMQ_DEFAULT_USER
            value: "username"
          - name: RABBITMQ_DEFAULT_PASS
            value: "password"
          - name: RABBITMQ_DEFAULT_VHOST
            value: "vhost"
          ports:
          - containerPort: 15672
            name: ui
          - containerPort: 5672
            name: api
          volumeMounts:
            - name: rabbitmq-data-pvc
              mountPath: /var/lib/rabbitmq/mnesia
  volumeClaimTemplates:
  - metadata:
      name: rabbitmq-data-pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
spec:
  selector:
    component: rabbitmq
  ports:
    - protocol: TCP
      port: 15672
      targetPort: 15672
      name: ui
    - protocol: TCP
      port: 5672
      targetPort: 5672
      name: api
  type: ClusterIP
Coley answered 10/6, 2022 at 15:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.