====== volumes: emptyDir ======
Обычно используется для:
* Размещения кеш файлов.
* Данных, которые необходимо сохранить при сбое в работе контейнера.
* Обмена файлами между несколькими контейнерами в под.
Создается с подом. Удаляется при удалении пода.
При сбое в работе пода и его дальнейшего самовосстановления (перезапуска), данные из этого volume не удаляются. Если под был удален администратором и затем был автоматически перезапущен, данные из volume будут удалены.
Можно разместить в RAM (используется tmpfs). Но надо учитывать, что оперативная память, выделяемая под диск, учитывается в общем зачете выделяемой памяти для пода. И при превышении лимита, приходит OOM Killer.
[[https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#emptydirvolumesource-v1-core|Ссылка на 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"