Dockerに統合されたkubernetesでローカル開発用のMySQLを運用する
DockerCon EU 2017でDockerにKubernetesが統合されるとアナウンスされていましたが、早くもDocker CE for MacのEdgeリリースでk8sがローカル環境で使えるようになってました。これまでローカルのk8s環境はminikubeをインストールしていたのですが、この機会にDockerで完結させるように移行してみました。
Docker上のkubernetesセットアップ
まず、既にMac上にHomebrewでkubectlを入れている場合は削除しておきます(Dockerであらためてkubectlがインストールされるので)。
$ brew uninstall kubectl |
Kubernetesが統合されたDocker CE for Macをダウンロードし(執筆時点ではEdgeリリースのみが対象)、インストールすると設定画面に「Kubernetes」メニューが出来ているので、「Enable Kubernetes」にチェックを入れるとk8sがインストールされます。
これでkubectlコマンドが使えるようになります。私の場合はminikubeも入れたままにしているので、以下のようにcontextをDocker側に切り替えます。
$ kubectl config use-context docker-for-desktop |
nodesを確認してみると、docker-for-desktopという名前でノードが起動していました。
$ kubectl get nodes |
dashboadは現時点では手動でインストールする必要があるので、以下のようにdashboad用のPodを作成します。
$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
ブラウザからアクセスできるようにServiceのtypeをClusterIPからNodePortに変更します。あわせて外部アクセス用ポート番号も確認しておきます。
$ kubectl -n kube-system edit service kubernetes-dashboard |
apiVersion: v1 |
この設定例の場合は、ブラウザからhttps://localhost:32744でアクセスできます。
MySQLのコンテナーを導入
これまでローカル開発用のMySQLはMAMPを使って運用していました。ローカルのMySQLでは複数のデータベースを構築することが多いので、Dockerで運用するにしても1つのDBインスタンスで複数のアプリから参照されるような構成にしたいと思っていました。そのため、以下のような構築方針としました。
- MySQLのコンテナーは単独で起動する
- データベースは別アプリ向けに複数作成する
- データは永続化し、ローカルのファイルシステムから参照できるようにする
- MySQLWorkbench等からアクセスできるようにホストOSへポートを公開する
kubenetesでMySQLを運用するには、ボリュームを永続化するためPersistentVolumes(以下PV)を作成します。ホストとなるMacのファイルシステムで参照できるように以下のような構成でPVを作成します。
local-volumes.yml
apiVersion: v1 |
以下のコマンドでPVを作成します。
$ kubectl create -f local-volumes.yml |
MySQLのDeploymentに設定するボリュームには直接PVを紐付けず、PersistentVolumeClaims(以下PVC)を作成してPVCを経由するようにさせた方が良いようです。なお、PVCとPVはstorageClassNameの名前でバインドさせます。
apiVersion: v1 |
$ kubectl create -f mysql-pv-claim.yml |
MySQLのコンテナーを作成する前に、MySQLパスワードSecretをkubernetes上にセットしておきます。そうすることで、MySQL自体のマニフェストファイルにはパスワードを記述しなくて良くなり、環境毎にもパスワードを変更できるようになります。
$ kubectl create secret generic mysql-pass --from-literal=password={YOUR_PASSWORD} |
MySQLのDeploymentとServiceを作成するマニフェストは以下のように作成しました。Deploymentでは、mysqlの公式イメージをバージョン指定タグを使って取得しています。Serviceの設定では、NodePortを利用してポートをホストマシンに公開するようにしています。
apiVersion: apps/v1beta2 |
以下を実行して、数分待つとMuySQLのPodが起動しているはずです。
$ kubectl create -f mysql.yml |
Serviceの内容を確認してホストマシンからMySQLにアクセスするためのPortを確認します。
$ kubectl get svc mysql |
上記例では外部向けのPortが30319であることがわかるので、MySQLWorkbenchでは以下のように設定すると接続できるはずです。
これで、今後はDocker for Macを起動すれば、自動的にkubernetes上のMySQLがいつでも使える状態の環境になりました。ちなみに個人的にはクラウド上ではPaaSのMySQLしか使わない方針なので、ここで紹介した方法はあくまでもローカル開発用に特化した構築方法です。運用環境用のMySQLをkubernetesで構築するには他にも考慮事項が出てくると思いますのでご注意下さい。