📚

kubernetsでMysqlの機密情報をvolumeを使って設定する

2024/04/20に公開

環境変数にMysqlのパスワードを設定する

mysql_root_password、mysql_user_passwordというファイルを用意し、それぞれにパスワードを記載する。
下記コマンドで環境変数にセットする。

MYSQL_ROOT_PASSWORD=$(cat ~/mysql_root_password)
MYSQL_USER_PASSWORD=$(cat ~/mysql_user_password)

// 確認用
echo $MYSQL_ROOT_PASSWORD
echo $MYSQL_USER_PASSWORD

secretを作成する

mysqlという名前のSecretを作成する。
このSecretには、root_passwordとuser_passwordという2つのキーが含まれており、上記で環境変数で定義したルートパスワードとユーザーパスワードを設定。

kubectl create secret generic mysql --from- literal=root_password=$MYSQL_ROOT_PASSWORD --from-literal=user_password=$MYSQL_USER_PASSWORD

// 確認用
kubectl get secrets

作成したmysql secret用のvolumeを作成する

kebernetsの定義ファイルにて下記volumeを作成。

volumes:
- name: mysql-secrets
  secret:
    secretName: mysql

作成したvolumeを/var/run/secrets/mysqlというパスでマウントする

このボリュームが、MySQLコンテナに/var/run/secrets/mysqlというパスでマウントされる。

volumeMounts:
- name: mysql-secrets
  mountPath: /var/run/secrets/mysql
  readOnly: true

envでマウントしたsecretを設定する

MySQLコンテナの環境変数MYSQL_ROOT_PASSWORD_FILEとMYSQL_PASSWORD_FILEは、マウントされたボリューム内のファイルのパスに設定される。

MySQLサーバーが起動すると、これらのファイルからルートパスワードとユーザーパスワードを読み取る。

env:
- name: MYSQL_ROOT_PASSWORD_FILE
  value: /var/run/secrets/mysql/root_password
- name: MYSQL_PASSWORD_FILE
  value: /var/run/secrets/mysql/user_password

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysql
        image: ghcr.io/gihyodocker/taskapp-mysql:v.1.0.0
        env:
        - name: MYSQL_ROOT_PASSWORD_FILE
          value: /var/run/secrets/mysql/root_password
        - name: MYSQL_DATABASE
          value: taskapp
        - name: MYSQL_USER
          value: taskapp_user
        - name: MYSQL_PASSWORD_FILE
          value: /var/run/secrets/mysql/user_password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-secrets
          mountPath: /var/run/secrets/mysql
          readOnly: true
      volumes:
        - name: mysql-secrets
          secret:
            secretName: mysql

Discussion