はじめに
コンテナ化された環境に機能データベースをデプロイすることは、困難な作業になる可能性があります。その理由は、データベースの可用性、状態、および冗長性を維持する上でデータベースが存在する一連の特定の課題にあります。ただし、多くの開発者は、Kubernetesなどのプラットフォームが提供するのと同じ高速展開と自動化の原則に基づいてアプリケーションスタックとデータレイヤーを整理することを好みます。
この記事では、永続ボリュームを使用してMySQLデータベースインスタンスをKubernetesにデプロイする方法を説明します。この機能により、ステートフルアプリはK8sポッドに固有の一時性を克服できます。

前提条件
- kubectlがインストールされたKubernetesクラスター
- システムへの管理アクセス
KubernetesでのMySQLのデプロイ
MySQLインスタンスをKubernetesに正常にデプロイするには、次のKubernetesオブジェクトを定義するために使用する一連のYAMLファイルを作成します。
- データベースパスワードを保存するためのKubernetesシークレット。
- データベースにストレージスペースを割り当てるための永続ボリューム(PV)。
- 展開のPVを要求する永続ボリューム要求(PVC)。
- 展開自体。
- Kubernetesサービス。
ステップ1:Kubernetesシークレットを作成する
Nanoなどのテキストエディタを使用して、シークレットファイルを作成します。
nano mysql-secret.yaml
ファイルは秘密を定義します。ルートMySQLアカウントのパスワードをstringData
に入力します YAMLのセクション。
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
password: test1234
ファイルを保存して終了します。 kubectlを使用して、変更をクラスターに適用します。
kubectl apply -f mysql-secret.yaml
システムは、シークレットの作成が成功したことを確認します:

ステップ2:永続的なボリュームとボリュームクレームを作成する
ストレージ構成ファイルを作成します:
nano mysql-storage.yaml
このファイルは2つの部分で構成されています:
- 最初の部分は永続ボリュームを定義します。
spec.capacity.storage
で割り当てられたストレージの量をカスタマイズします 。spec.hostPath
内 ボリュームのマウントポイントを指定します。 - ファイルの2番目の部分はPVCを定義します。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
ファイルを保存して終了します。
次に、 kubectl
を使用してストレージ構成を適用します 。
kubectl apply -f mysql-storage.yaml
システムはPVとPVCの作成を確認します。

ステップ3:MySQLデプロイメントを作成する
- デプロイメントファイルを作成します。デプロイメントファイルは、MySQLデプロイメントが使用するリソースを定義します。
nano mysql-deployment.yaml
2. spec.template.spec.containers
内 セクションで、MySQLイメージを指定します:
containers:
- image: mysql:5.6
name: mysql
3. MYSQL_ROOT_PASSWORD
の値を割り当てます ステップ1からシークレットで指定したパスワードに対する環境変数 。
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
4.ステップ2からPVCを接続します 展開に。
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
5.ファイルの別のセクションで、サービス名とポートを定義します。
YAML全体は次の例のようになります:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
ファイルを保存して終了します。 kubectl
を使用してファイルを適用することにより、デプロイメントを作成します :
kubectl apply -f mysql-deployment.yaml
システムは、デプロイメントとサービスの両方が正常に作成されたことを確認します。

MySQLインスタンスにアクセスする
MySQLインスタンスにアクセスするには、デプロイメントによって作成されたポッドにアクセスします。
- ポッドを一覧表示します:
kubectl get pod
2. MySQLポッドを見つけ、それを選択して Ctrl + Shift + C を押して、その名前をコピーします。 :

3.次のコマンドを実行して、ポッドのシェルを取得します。
kubectl exec --stdin --tty mysql-694d95668d-w7lv5 -- /bin/bash
ポッドシェルがメインシェルに置き換わります:

4.次のコマンドを入力して、MySQLシェルにアクセスします。
mysql -p
5.プロンプトが表示されたら、Kubernetesシークレットで定義したパスワードを入力します。
MySQLシェルが表示されます。

MySQLデプロイメントを更新する
関連するYAMLファイルを編集して、デプロイの任意の部分を更新します。次のコマンドで変更を適用します:
kubectl apply -f [filename]
ただし、次の2つの制限に注意してください。
- この特定のデプロイメントは、単一インスタンス用です MySQLの展開。これは、デプロイメントをスケーリングできないことを意味します。つまり、1つのポッドでのみ機能します。
- この展開はローリングアップデートをサポートしていません。したがって、
spec.strategy.type
常に再作成に設定する必要があります 。
MySQLインスタンスを削除する
デプロイメント全体を削除する場合は、 kubectl
を使用します 関連する各Kubernetesオブジェクトを削除するには:
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
kubectl delete secret mysql-secret
この一連のコマンドは、展開、サービス、PV、PVC、および作成したシークレットを削除します。システムは削除が成功したことを確認します:
