Minikube & Kubernetes: использование подключенного диска Windows в качестве постоянного тома в контейнере Postgres
ПРИМЕЧАНИЕ. После дальнейшего устранения неполадок я считаю, что это проблема с креплением minikube. Большая часть приведенного ниже описания может не относиться к конкретной проблеме. Смотрите мои комментарии для дополнительной информации. Удерживая вопрос как заданный.
Я пытаюсь использовать локальную SDCard в качестве точки монтирования в мини-кубе, создать постоянный том в точке монтирования, создать соответствующее постоянное утверждение тома, а затем использовать его в качестве монтирования тома в контейнере, в котором размещен экземпляр postgres. Сначала я опишу, как я создавал до PVC, а затем углублюсь в определение pod.
1. Я использую команду minikube для запуска виртуальной машины minikube (Hyper-V) с точкой монтирования:
запуск мини-куба --vm-driver="hyperv" --hyperv-virtual-switch="Мой виртуальный коммутатор" --mount --mount-string="D:\data:/data"
После запуска этого я использовал minikube ssh
определить, что каталог смонтирован правильно и имеет владельца / группу root.
2. Создайте постоянный том:
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-data-pv
labels:
type: local
application: postgres
spec:
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/data/gather-client/postgres/data"
3. Создайте PersistentVolumeClaim:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-data-pvc
annotations:
volume.beta.kubernetes.io/storage-class: ""
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
4. Создание контейнера и контейнера Моя первая попытка создания пакета была простым, хорошо документированным подходом:
kind: Pod
apiVersion: v1
metadata:
name: gather-client
spec:
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: postgres-data-pvc
containers:
- name: metadata-db
image: postgres:9.6.5
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
В этот момент я получаю CrashLoopBackoff и после проверки журнала контейнера нахожу ошибку:
chown: смена владельца '/var/lib/postgresql/data/pgdata': ошибка ввода / вывода
Я считаю, что здесь происходит то, что в контейнере есть пользователь postgres, который выполняет команду initdb, а каталог принадлежит root? Опять же, я не чувствую, что я получил бы ошибку ввода / вывода в этом случае.
Во всяком случае, я попробовал два дополнительных подхода:
1. Использование securityContext с fsGroup, совпадающей с UID/GID пользователя postgres (999)
Здесь я просто добавил этот фрагмент вверху спецификации в надежде, что том будет создан с учетом контекста пользователя postgres (я не слишком уверен, что именно так это работает...):
securityContext:
fsGroup: 999
Я получаю ту же ошибку и быстро перехожу к следующему подходу...
2. Использование initContainer для выполнения команды chown. Это где я провел большую часть своего времени. Я добавил немного команд отладки, чтобы лучше понять, что здесь происходит.
initContainers:
- name: metadata-db-init
image: postgres:9.6.5
command: ["sh"]
args: ["-c", "whoami; ls -l /var/lib/postgresql; ls -l /var/lib/postgresql/data; chown postgres /var/lib/postgresql/data; chown postgres /var/lib/postgresql/data/pgdata"]
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
После этого я получаю статус модуля Init:CrashLoopBackOff. Вот что я получаю в журнале внутри initContainer:
корень
всего 0 drwxrwxrwx 1 корневой корень 0 янв 1 1970 данные
всего 1 drwxrwxrwx 1 корневой корень 0 1 января 1970 г. pgdata -rw-rw-rw- 1 корневой корень 5 января 1 1970 тест
chown: смена владельца '/ var / lib / postgresql / data': ошибка ввода / вывода
chown: смена владельца '/var/lib/postgresql/data/pgdata': ошибка ввода / вывода
Я также написал простой тестовый файл из сценария оболочки в каталог pgdata и обнаружил, что он существует на моей SDCard. Из этого я предположил, что ошибка ввода / вывода не связана с разрешениями. Кроме того, возможность записи в каталог как root означает, что файловая система находится в рабочем состоянии. Я просто не могу поесть (как root). Как это могло произойти?