Problema: Estou executando o WikiJS no Kubernetes (GKE) e estou encontrando problemas de permissão. O aplicativo não consegue criar o diretório de cache, gerando: "EACCES: permissão negada, mkdir '/wiki/data/cache'"
Ambiente:
- Kubernetes: GKE
- Versão do WikiJS: 2.5
- Volume: PVC
Configuração atual:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-wikijs
namespace: test
labels:
app: test-wikijs
spec:
replicas: 1
selector:
matchLabels:
app: test-wikijs
template:
metadata:
labels:
app: test-wikijs
spec:
containers:
- name: test-wikijs
image: requarks/wiki:2.5
ports:
- containerPort: 3000
env:
- name: DB_TYPE
valueFrom:
configMapKeyRef:
name: test-wikjs-config
key: DB_TYPE
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: test-wikjs-config
key: DB_HOST
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: test-wikjs-config
key: DB_PORT
- name: DB_NAME
valueFrom:
secretKeyRef:
name: sql-secret
key: POSTGRES_DB
- name: DB_USER
valueFrom:
secretKeyRef:
name: sql-secret
key: POSTGRES_USER
- name: DB_PASS
valueFrom:
secretKeyRef:
name: sql-secret
key: POSTGRES_PASSWORD
volumeMounts:
- name: wikijs-data
mountPath: /wiki/data
volumes:
- name: wikijs-data
persistentVolumeClaim:
claimName: wikijs-data-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wikijs-data-pvc
namespace: test
labels:
app: test-wikijs
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 50Gi
Retorno do console
# PVC detail list
kubectl get pvc -n $env:NAMESPACE -o wide
# PVC description
kubectl describe pvc wikijs-data-pvc -n $env:NAMESPACE
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE VOLUMEMODE
postgres-data-pvc Bound pvc-9906e095-5341-451f-a2ff-ffbd8d8991e3 20Gi RWO standard <unset> 3h29m Filesystem
wikijs-data-pvc Bound pvc-30553c23-75aa-429e-9464-7a567103b320 50Gi RWO standard <unset> 3h29m Filesystem
Name: wikijs-data-pvc
Namespace: test
StorageClass: standard
Status: Bound
Volume: pvc-30553c23-75aa-429e-9464-7a567103b320
Labels: app=test-wikijs
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
volume.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 50Gi
Access Modes: RWO
VolumeMode: Filesystem
Used By: test-wikijs-5458d966c9-h97w8
Events: <none>
# detail PV list
kubectl get pv -o wide
# Description d'un PV spécifique
kubectl describe pv wikijs-data-pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE VOLUMEMODE
pvc-30553c23-75aa-429e-9464-7a567103b320 50Gi RWO Delete Bound test/wikijs-data-pvc standard <unset> 3h32m Filesystem
pvc-9906e095-5341-451f-a2ff-ffbd8d8991e3 20Gi RWO Delete Bound test/postgres-data-pvc standard <unset> 3h32m Filesystem
kubectl describe pv pvc-30553c23-75aa-429e-9464-7a567103b320
Name: pvc-30553c23-75aa-429e-9464-7a567103b320
Labels: topology.kubernetes.io/region=europe-west1
topology.kubernetes.io/zone=europe-west1-b
Annotations: pv.kubernetes.io/migrated-to: pd.csi.storage.gke.io
pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd
volume.kubernetes.io/provisioner-deletion-secret-name:
volume.kubernetes.io/provisioner-deletion-secret-namespace:
Finalizers: [kubernetes.io/pv-protection external-attacher/pd-csi-storage-gke-io]
StorageClass: standard
Status: Bound
Claim: test/wikijs-data-pvc
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 50Gi
Node Affinity:
Required Terms:
Term 0: topology.kubernetes.io/zone in [europe-west1-b]
topology.kubernetes.io/region in [europe-west1]
Message:
Source:
Type: GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)
PDName: pvc-30553c23-75aa-429e-9464-7a567103b320
FSType: ext4
Partition: 0
ReadOnly: false
Events: <none>
kubectl exec -it $env:POD_NAME -n $env:NAMESPACE -- ls -la /wiki/data
total 28
drwxr-xr-x 4 root root 4096 Jan 20 13:19 .
drwxr-xr-x 1 node node 4096 Oct 12 09:00 ..
drwxr-xr-x 2 node node 4096 Oct 12 08:55 content
drwx------ 2 root root 16384 Jan 20 13:05 lost+found
Pergunta : Como posso configurar corretamente as permissões para o pod WikiJS gravar em seu diretório de dados? O volume está montado, mas o aplicativo não consegue criar os diretórios necessários.
Para garantir que as permissões do diretório estejam definidas corretamente para que o aplicativo WikiJS tenha acesso de gravação ao volume montado, você pode tentar usar o initcontainers .
Você pode modificar seu YAML de implantação para incluir um initContainer para definir as permissões corretas:
InitContainers roda antes do contêiner principal do WikiJS. O
chmod -R 777 /wiki/data
comando : para garantir que todos os usuários tenham permissões de leitura, gravação e execução no diretório /wiki/data e seu conteúdo. Ochown -R 1000:1000 /wiki/data
comando : ajuda a alterar o proprietário do diretório /wiki/data e seu conteúdo para o usuário com UID 1000 e GID 1000. Já que o UID 1000 é comumente o usuário usado pelo contêiner WikiJS (nó).Após aplicar a implantação atualizada, você pode verificar se as permissões estão definidas corretamente verificando o diretório /wiki/data dentro do pod em execução.
Verifique as permissões: Após aplicar as alterações, verifique se as permissões estão definidas corretamente usando o comando abaixo
Verifique também este documento Instalar e configurar o Wiki.js no cluster Kubernetes, escrito por Klinsmann Öteyo, que pode ajudar a resolver o problema.