mkdir: cannot create directory '/bitnami/mysql/data': Permission denied

greenTea·2025년 2월 22일
post-thumbnail

helm mysql 디렉토리 권한 문제

helm으로 mysql을 설치하는 도중 아래와 같은 에러가 발생하였습니다.

문제 발생 명령어

helm install mydb bitnami/mysql

쿠버네티스 로그

❯ kubectl logs mydb-mysql-0 -c mysql

mysql 10:37:40.41 INFO  ==> 
mysql 10:37:40.41 INFO  ==> Welcome to the Bitnami mysql container
mysql 10:37:40.41 INFO  ==> Subscribe to project updates by watching https://github.com/bitnami/containers
mysql 10:37:40.41 INFO  ==> Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami/ for more information.
mysql 10:37:40.41 INFO  ==> 
mysql 10:37:40.42 INFO  ==> ** Starting MySQL setup **
mysql 10:37:40.42 INFO  ==> Validating settings in MYSQL_*/MARIADB_* env vars
mysql 10:37:40.42 INFO  ==> Initializing mysql database
mkdir: cannot create directory '/bitnami/mysql/data': Permission denied

디렉토리에 대한 권한이 없어서 발생한 문제 pvc로 마운트 된 디렉토리와 실제 디렉토리간에 권한 불일치로 발생한 문제로 보여집니다.

분석

현재 저는 minikube를 사용하고 있는데 minikube를 사용하게 되면 자동으로 hostpath로 설정된 storageClass가 있어 자동으로 pv를 만들어서 연결해주게 됩니다.

kubectl describe pv를 통해 보면 아래와 같이 hostpath로 연결된 것을 볼 수 있습니다.

Source:
    Type:          HostPath (bare host directory volume)
    Path:          /tmp/hostpath-provisioner/default/data-mydb-mysql-0
    HostPathType:  
Events:            <none>

minikube ssh를 이용하여 접근해서 해당 경로를 확인해본 결과 아래와 같이 root권한으로 되어 있는 것을 확인 할 수 있었습니다.

docker@minikube:/tmp/hostpath-provisioner/default$ ls -la
total 48
drwxr-xr-x 12 root root 4096 Feb 22 10:35 .
drwxr-xr-x  3 root root 4096 Jan  5 14:24 ..
drwxrwxrwx  2 root root 4096 Feb 22 10:35 data-mydb-mysql-0

helm으로 실행하게 되는 경우 1001의 아이디를 가지는 유저로 실행하게 됨으로 쓰기 과정에서 문제가 발생하게 됩니다.

❯ kubectl exec -it mydb-mysql-0 -- id

Defaulted container "mysql" out of: mysql, preserve-logs-symlinks (init), volume-permissions (init)
uid=1001 gid=1001 groups=1001

문제 해결

helm install mydb bitnami/mysql --set volumePermissions.enabled=true를 설정해 주어 문제를 해결 할 수 있었습니다.

위 설정을 해주게 되면 init-container를 만들어 해당 디렉토리의 권한을 수정해주게 되는데 실제 실행을 하고 나서 로그를 확인해 보면 권한을 수정하는 명령어를 실행하는 init-container가 만들어지는 것을 확인 할 수 있습니다.

    Command:
      /bin/bash
      -ec
      mkdir -p "/bitnami/mysql"
      chown "1001:1001" "/bitnami/mysql"
      find "/bitnami/mysql" -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R "1001:1001"
      

이후에 mysql 컨테이너를 생성하며 문제가 해결되게 됩니다.

  Normal  Created    10m   kubelet            Created container volume-permissions
  Normal  Started    10m   kubelet            Started container volume-permissions
  Normal  Pulled     10m   kubelet            Container image "docker.io/bitnami/mysql:8.4.4-debian-12-r4" already present on machine
  Normal  Created    10m   kubelet            Created container mysql
  Normal  Started    10m   kubelet            Started container mysql

로그를 보면 volume-permissions라는 컨테이너를 통해 권한을 수정해주고 나서 mysql 컨테이너를 만들어 실행하는 것을 볼 수 있습니다.

결과

NAME               READY   STATUS    RESTARTS   AGE
pod/mydb-mysql-0   1/1     Running   0          7m51s

NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP    46d
service/mydb-mysql            ClusterIP   10.102.62.244   <none>        3306/TCP   7m51s
service/mydb-mysql-headless   ClusterIP   None            <none>        3306/TCP   7m51s

NAME                          READY   AGE
statefulset.apps/mydb-mysql   1/1     7m51s

정상적으로 파드가 동작하는 것을 확인 할 수 있습니다.

profile
greenTea입니다.

0개의 댓글