#python #docker #kubernetes #kubernetes-helm #minikube
#python #docker #kubernetes #kubernetes-рулевой #мини-куб
Вопрос:
Я использую helm charts
для развертывания своего приложения kubernetes в локальном кластере minikube
. Я смог смонтировать /home/$USER/log
каталог и проверил, создав и изменив файл в смонтированном каталоге с помощью команды оболочки.
#touch /log/a
# ls
a delete.cpp dm
Но когда я использую python для создания символической ссылки, она терпит неудачу.
>>> import os
>>> os.symlink("delete.cpp", "b")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
PermissionError: [Errno 1] Operation not permitted: 'delete.cpp' -> 'b'
Есть идеи, почему symlink не работает.
Я могу использовать один и тот же код в другом каталоге
Для монтирования каталога хоста в minikube я использую
minikube mount ~/log:/log
Мой сценарий развертывания выглядит следующим образом
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
metadata:
labels:
app: my-app
spec:
volumes:
- name: log-dir
hostPath:
path: /log
containers:
- name: my-app
image: my-image
imagePullPolicy: never #It's local image
volumeMounts:
- name: log-dir
mountPath: /log
command: [ "/bin/bash", "-ce", "./my_app_executing_symlink" ]
Ответ №1:
EPERM The filesystem containing linkpath does not support the
creation of symbolic links.
В случае minikube
монтирования это, безусловно, кажется возможным.
Комментарии:
1. Есть ли какой-либо способ предоставить необходимые разрешения при монтировании каталога
minikube
, за которым следует контейнер2. Я никогда не использовал Minikube, но, вероятно, все зависит от того, какой драйвер монтирования вы используете; см. minikube.sigs.k8s.io/docs/handbook/mount может быть?
Ответ №2:
Если вы используете minikube, вы можете использовать hostpath
постоянный том, который поддерживает путь к хосту, для разработки и тестирования в кластере с одним узлом.
Пример использования:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/log"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-volume
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
---
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
volumes:
- name: pv0001
persistentVolumeClaim:
claimName: example-volume
containers:
- name: my-app
image: alpine
command: [ "/bin/sh", "-c", "sleep 10000" ]
volumeMounts:
- name: pv0001
mountPath: /log
После успешного развертывания вы сможете создавать символические ссылки в /log
каталоге:
$ kubectl exec -it my-app -- /bin/sh
/log # touch a
/log # ln -s a pd
-rw-r--r-- 1 root root 0 Nov 25 17:49 a
lrwxrwxrwx 1 root root 1 Nov 25 17:49 pd -> a
И, как указано в документации:
minikube настроен на сохранение файлов, хранящихся в следующих каталогах, которые создаются в виртуальной машине Minikube (или на вашем локальном хостинге, если он работает на голом металле). Вы можете потерять данные из других каталогов при перезагрузке.
- /данные
- /var/lib/minikube
- /var/lib/docker
- /tmp/hostpath_pv
- /tmp/hostpath-поставщик