はじめに
入社2年目のエンジニアです。
最近、SEカレッジでKubernetesの講座を見る機会がありました。「コンテナをいい感じに管理してくれる」くらいの理解でしたが、なんとなく便利そうで気になりました。
でも動画を見ただけだと全然ピンとこなかったので、実際に手を動かしてWordpressを作ってみることにしました。
この記事は、その時に試したことと気づいたことをまとめたものです。
Kubernetesって何?
複数のコンテナをいい感じに管理してくれるツールです。
Dockerとの違い
Docker = 1つのコンテナを動かすツール
bash
docker run nginx# Nginxを1つ起動
docker run mysql# MySQLを1つ起動
- 1つずつ手動で起動・停止
- コンテナが止まったら手動で再起動
- 複数のサーバーでは使いにくい
Kubernetes = たくさんのコンテナを管理するツール
- Nginxを3台、MySQLを1台みたいに複数管理
- コンテナが止まったら自動で再起動
- 複数のサーバーをまとめて管理
例え話
Docker:
お弁当を1つずつ作る調理器具。
「Nginx弁当作って」「MySQL弁当作って」って1つずつ頼む感じ。
Kubernetes:
お弁当屋さんの店長。
「Nginx弁当を常に3個、MySQL弁当を常に1個用意しといて」って言うと、売り切れたら自動で補充してくれる。
実際にやってみた
作ったもの
ブラウザ (localhost:8080)
↓
Kubernetes
├── Wordpress(Webサイト部分)
└── MySQL(データベース部分)
WordpressとMySQLを別々のコンテナで動かして、つなげる感じです。
手順
1. MySQL用のファイルを作る
mysql-deployment.yml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
role: database
template:
metadata:
labels:
app: wordpress
role: database
spec:
containers:
- name: mysql
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: password
- name: MYSQL_DATABASE
value: wordpress
ports:
- containerPort: 3306
mysql-service.yml
:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: wordpress
role: database
2. WordPress用のファイルを作る
wordpress-deployment.yml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
role: web
template:
metadata:
labels:
app: wordpress
role: web
spec:
containers:
- name: wordpress
image: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: password
3. 実際に動かす
# MySQL起動
kubectl create -f mysql-deployment.yml
kubectl create -f mysql-service.yml
# WordPress起動
kubectl create -f wordpress-deployment.yml
# 確認
kubectl get pods
# ブラウザからアクセスできるようにする
kubectl port-forward [wordpress-pod名] 8080:80
http://localhost:8080 にアクセスして、WordPressの画面が出たら成功です。
やってみて気づいたこと
名前で接続できるのが便利
WordPressの設定:
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306 # IPアドレスじゃなくて名前
MySQLのIPアドレスを調べなくても、mysql
って名前で接続できるんです。
Kubernetesが自動で「mysql という名前は○○のIPアドレス」って変換してくれます。
勝手に復旧してくれる
試しにMySQLのコンテナを削除してみました:
kubectl delete pod [mysql-pod名]
そしたら数秒後に新しいコンテナが勝手に起動してました。
「あるべき状態」(MySQLが1台動いてる)を維持してくれます。
つまずいたところ
Serviceが分からなかった
最初、WordPressからMySQLに接続できませんでした。
原因:mysql-service.yml を作ってなかった
Serviceっていうのはコンテナ同士をつなげる仕組み。これがないと、WordPressがMySQLを見つけられない。
Podの名前が毎回変わる
kubectl port-forward wordpress-57b5674fd4-9fzlb 8080:80
# ↑この部分が毎回違う
コンテナを作り直すたびに名前が変わるので、毎回 kubectl get pods
で確認する必要がありました。
今度試してみたいこと
データが消えないようにしたい
今回、Podを削除するとWordPressのデータも消えてしまいました。
記事を書いても、コンテナを作り直すとリセットされる状態です。
「PersistentVolume」っていう仕組みで解決できるらしいので、次回試してみたいと思います。
パスワードを安全に管理したい
env:
- name: MYSQL_PASSWORD
value: password # これはダメ
パスワードをファイルに直接書くのは良くないと思います。。
「Secret」という仕組みで暗号化して管理できるらしいので、勉強してみます。
今回やってみて思ったこと
SEカレッジの動画を見ただけの時は「なんか便利そうだけど難しそう」でした。
でも実際に手を動かしてみると:
- WordPressを部品に分けて作る考え方
- 設定をファイルで管理する便利さ
- 自動で復旧してくれる安心感
を体験できました。
まだまだ分からないことだらけですが、「使えるツール」になった感じがします。
これから本格的に勉強して、実際のプロジェクトでも使えるようになりたいと思います。
おわりに
「難しそう」と思ってたKubernetesでしたが、とりあえずWordPressを動かすことはできました。
まずは手を動かしてみることが大事だなと改めて思いました。