
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
정상적으로 파드가 동작하는 것을 확인 할 수 있습니다.