emptyDir

Обычно используется для:

  • Размещения кеш файлов.
  • Данных, которые необходимо сохранить при сбое в работе контейнера.
  • Обмена файлами между несколькими контейнерами в под.

Создается с подом. Удаляется при удалении пода.

При сбое в работе пода и его дальнейшего самовосстановления (перезапуска), данные из этого volume не удаляются. Если под был удален администратором и затем был автоматически перезапущен, данные из volume будут удалены.

Можно разместить в RAM (используется tmpfs). Но надо учитывать, что оперативная память, выделяемая под диск, учитывается в общем зачете выделяемой памяти для пода. И при превышении лимита, приходит OOM Killer.

Ссылка на API.

Возможные параметры:

  • Medium – значение по умолчанию «». Если volume необходимо разместить в RAM, указывают значение Memory.
  • sizeLimit – Общий объем локального хранилища, необходимый для тома emptyDir.

Пример определения volume типа emptyDir:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: openresty
  namespace: volumes-sample
  labels:
    app: openresty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openresty
  template:
    metadata:
      labels:
        app: openresty
    spec:
      containers:
      - name: openresty
        image: openresty/openresty:centos-rpm
        env:
        - name: NGINX_HOST
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        volumeMounts:
          - name: empty-volume
            mountPath: /empty
      volumes:
        - name: empty-volume
          emptyDir: {}

Если не указываются дополнительные параметры, пишем {}. Иначе явно указываем параметры:

volumes:
— name: empty-volume
  emptyDir:
    medium: «Memory»
     sizeLimit: 100m

При инициализации создаётся пустой volume. Если в нём необходимо предварительно создать структуру файлов и директорий, можно воспользоваться init контейнером.

В следующем примере в поде определяется init контейнер, который запускается перед запуском основного контейнера и создает в volume «empty-volume» файл «init-file». После завершения работы init контейнера, запускается основной контейнер в файловой системе которого уже доступен файл «init-file».

apiVersion: apps/v1
kind: Deployment
metadata:
  name: openresty
  namespace: volumes-sample
  labels:
    app: openresty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openresty
  template:
    metadata:
      labels:
        app: openresty
    spec:
      initContainers:
        - name: busybox-init
          image: busybox:1.32.0
          command: ['sh', '-c', 'touch /empty/init-file']
          volumeMounts:
            - name: empty-volume
              mountPath: /empty
      containers:
      - name: openresty
        image: openresty/openresty:centos-rpm
        env:
        - name: NGINX_HOST
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        volumeMounts:
          - name: empty-volume
            mountPath: /empty
      volumes:
        - name: empty-volume
          emptyDir:
            medium: "Memory"

Похожим образом можно подключить один и тот же volume к двум обычным контейнерам внутри пода.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: openresty
  namespace: volumes-sample
  labels:
    app: openresty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openresty
  template:
    metadata:
      labels:
        app: openresty
    spec:
      containers:
      - name: openresty
        image: openresty/openresty:centos-rpm
        env:
        - name: NGINX_HOST
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        volumeMounts:
          - name: empty-volume
            mountPath: /empty
      - name: centos
        image: centos:centos8
        command: ['bash']
        args: ['-c','sleep 50000']
        volumeMounts:
          - name: empty-volume
            mountPath: /empty
      volumes:
        - name: empty-volume
          emptyDir:
            medium: "Memory"