3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KubernetesでWordpress動かしてみた話

Posted at

はじめに

入社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を動かすことはできました。

まずは手を動かしてみることが大事だなと改めて思いました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?