Ця сторінка показує, як налаштувати Pod для використання тому для зберігання.
Файлова система контейнера існує лише поки існує сам контейнер. Отже, коли контейнер завершує роботу та перезавантажується, зміни в файловій системі втрачаються. Для більш стійкого зберігання, яке не залежить від контейнера, ви можете використовувати том. Це особливо важливо для застосунків, що зберігають стан, таких як бази даних і сховища ключ-значення (наприклад, Redis).
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Для перевірки версії введіть kubectl version.
У цьому завданні ви створюєте Pod, який запускає один контейнер. У цьому Podʼі є том типу emptyDir, який існує протягом усього життєвого циклу Podʼа, навіть якщо контейнер завершиться та перезапуститься. Ось конфігураційний файл для Podʼа:
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/storage/redis.yaml
Перевірте, що контейнер Podʼа працює, а потім спостерігайте за змінами в Podʼі:
kubectl get pod redis --watch
Вивід буде подібний до цього:
NAME READY STATUS RESTARTS AGE
redis 1/1 Running 0 13s
В іншому терміналі отримайте доступ до оболонки запущеного контейнера:
kubectl exec -it redis -- /bin/bash
У вашій оболонці перейдіть до /data/redis, а потім створіть файл:
root@redis:/data# cd /data/redis/
root@redis:/data/redis# echo Hello > test-file
У вашій оболонці виведіть список запущених процесів:
root@redis:/data/redis# apt-get update
root@redis:/data/redis# apt-get install procps
root@redis:/data/redis# ps aux
Вивід буде схожий на це:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
redis 1 0.1 0.1 33308 3828 ? Ssl 00:46 0:00 redis-server *:6379
root 12 0.0 0.0 20228 3020 ? Ss 00:47 0:00 /bin/bash
root 15 0.0 0.0 17500 2072 ? R+ 00:48 0:00 ps aux
У вашій оболонці завершіть процес Redis:
root@redis:/data/redis# kill <pid>
де <pid> — це ідентифікатор процесу Redis (PID).
У вашому початковому терміналі спостерігайте за змінами в Podʼі Redis. В кінцевому результаті ви побачите щось подібне:
NAME READY STATUS RESTARTS AGE
redis 1/1 Running 0 13s
redis 0/1 Completed 0 6m
redis 1/1 Running 1 6m
На цьому етапі контейнер завершився та перезапустився. Це тому, що Pod Redis має restartPolicy Always.
Отримайте доступ до оболонки в перезапущеному контейнері:
kubectl exec -it redis -- /bin/bash
У вашій оболонці перейдіть до /data/redis та перевірте, що test-file все ще там.
root@redis:/data/redis# cd /data/redis/
root@redis:/data/redis# ls
test-file
Видаліть Pod, який ви створили для цього завдання:
kubectl delete pod redis
Дивіться Volume.
Дивіться Pod.
Крім локального сховища на диску, яке надає emptyDir, Kubernetes підтримує багато різних рішень для мережевого сховища, включаючи PD на GCE та EBS на EC2, які бажані для критичних даних та будуть обробляти деталі, такі як монтування та розмонтування пристроїв на вузлах. Дивіться Volumes для отримання додаткової інформації.