📚
kubernetsでMysqlの機密情報をvolumeを使って設定する
環境変数に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