Ошибка разрешения: [Ошибка № 1] Операция не разрешена: ‘file.txt ‘ -> ‘symlink.txt ‘ при использовании os.symlink

#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:

Согласно справочной странице Linux on symlink(2) , вы получите эту ошибку, когда файловая система не поддерживает символические ссылки.

    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-поставщик