Обычно используется для:
- Размещения кеш файлов.
- Данных, которые необходимо сохранить при сбое в работе контейнера.
- Обмена файлами между несколькими контейнерами в под.
Создается с подом. Удаляется при удалении пода.
При сбое в работе пода и его дальнейшего самовосстановления (перезапуска), данные из этого volume не удаляются. Если под был удален администратором и затем был автоматически перезапущен, данные из volume будут удалены.
Можно разместить в RAM (используется tmpfs). Но надо учитывать, что оперативная память, выделяемая под диск, учитывается в общем зачете выделяемой памяти для пода. И при превышении лимита, приходит OOM Killer.
Возможные параметры:
- 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"
<- Оглавление