Ubuntu20.04にminikube(Kubernetes実行環境)をインストールし、WordPress開発環境をデプロイする【簡単なKuberntesの技術紹介あり】

# 概要

本書はUbuntu20.04にminikube(Kubernetes実行環境)をインストールし、Kubernetes上にWordPress開発環境を構築します。また本書の0章では様々なITインフラ環境と比較しながらKubernetesの利点を考えていきます。

## ０．Kubernetesとは (ご存じの方は次章からご覧ください)

### 簡単なKubernetesの特徴
- インフラをコード化することで全く同じ環境を再現できる。
- Kubernetes上にあるアプリケーションへのリソース割り当て(ネットワークやストレージなど)をコード化して管理できる。
- アプリケーションの起動停止が容易である。(コマンド1つで起動停止できる)
- 複数ノードのDocker環境を用意できるので障害に強い。(Dockerについては後述)
- ただしYAMLファイル(Kubernetesに展開するアプリケーションやネットワークなどの指示書)の書式やKubernetesのコマンドを理解する必要がある。

### 様々なインフラとKubernetesとの比較

本章では実際にKubernetes上でWordPressを構築する前に様々な様々なインフラITインフラをおさらいします。『物理PC』～『クラウド上のKubernetes』にWordPress開発環境(インターネット上に公開する前にレイアウトを作成する用途)を構築するパターンを想定して考えていきます。

### 0-1. 物理PC

ここではWindowsのノートパソコンやデスクトップパソコンにそのままWordPress開発環境をインストールする想定で記載します。
物理PCにWordPress開発環境を入れる際は事前に[XAMPP(Apache,MySQL,PHPを一括でインストールするパッケージ)](https://www.apachefriends.org/jp/index.html)をインストールし、[WordPress公式サイト](https://ja.wordpress.org/support/article/how-to-install-wordpress/)に記載されているインストール方法を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/35ab5412-a276-3cf1-88aa-7ff873cb04db.png)

#### メリット：

- 手元にPC1台あればすぐに開発環境の構築に取り掛かれます。
- 本パターンが最も参考書やQiita記事が多いので開発環境構築や構築時のトラブル解決がしやすいと思います。

#### デメリット：

- PCに入れているアプリケーションとの依存性問題でWordPressのインストールや起動、想定している動作が実現できない可能性があります。
- WordPress開発環境を誤った操作で壊してしまった場合、再度環境を構築する手間が発生します。

### 0-2. 仮想マシン

ここではWindows10の物理PCにHyper-VやVMware Workstation Playerなどの仮想化ソフトをインストールする想定で記載します。
あらかじめ物理PCに仮想化ソフトをセットアップします。その後、仮想化ソフトを利用してWindows OS上に仮想OS(今回は無料で使用できるOS[Ubuntu](https://jp.ubuntu.com/download)を使用)をインストールします。その後、WordPress公式サイトに記載されている[動作要件やインストール](https://ja.wordpress.org/download/#download-install)を確認し環境を構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/017c5e01-d786-b36c-0705-e574bc13a032.png)

#### メリット：

- 新規に真っ白な状態のOSを仮想化ソフトにインストールするので、アプリケーションの依存性問題を考えずにWordPress環境構築ができます。
- スナップショットが取得できる仮想化ソフトであれば、万が一にWordPress開発環境を壊しても元の状態に戻せます。

#### デメリット：
- 物理PC(仮想化ソフトのインストール元)にOSを動かすので、物理PCの処理能力が高くないと効果が発揮されません。
- 複数のWordPress開発環境を何台も同時に稼働させる場合は仮想ソフト上にOSを複数台動かすため、物理PCに潤沢な処理能力がない限りリソース不足が発生する可能性があります。

### 0-3. Docker

ここではLinux(UbuntuやCentOS)向けのdocker-ceをインストールした想定で記載します。また本パターンでは説明の都合上、ホストOSをLinux(Ubuntu)として考えます。

#### コンテナとは

Dockerの用語にコンテナという言葉があります。簡略化して説明しますと、コンテナはホストOS(UbuntuやCentOS)のカーネルのLinuxカーネルを利用して動いている仮想環境です。仮想化ソフトの上には実物のOSが動いていますが、コンテナはプロセスとして動いています。下記に簡略化して記載しましたWordPressとDockerの構成図を添付します。Dockerの詳しい動き方については[Docker公式サイト](https://docs.docker.com/get-started/overview/)をご確認ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/d41c439b-6fdd-eb8b-61c0-3ce82cf9af86.png)

Dockerを利用したWordPress環境構築については本書の著者が以前作成したQiita記事を是非ご覧ください。
[DockerでWordpressコンテナを立ち上げる](https://qiita.com/yuichi1992_west/items/7c400499ddee9f3c9654)

#### メリット：

- プロセスとしてWordPressやMySQLが起動するので、実際のOSを起動している仮想化ソフトより軽量化されます。またWordpressコンテナを複数台起動させてもリソース不足は発生しにくいです。
- Docker Imageと呼ばれる概念があり、アプリケーションを動かすための引数やファイルなどが入った作業イメージを保管することができます。これを配布しDockerが使用できる環境で起動することで、どの環境でも同一の動きを再現することができます。
- 特にチームで開発するときに利点があり、カスタマイズしたDocker Imageを1つ保存しておきチーム間で共有すればどのPCでも同じ動きが再現できます。前パターンのような各個人でそれぞれ環境を用意するよりも手間が掛からず、「このPCではWordPressが動かない」のような環境の違いによるエラーが発生しにくくなります。
- Docker公式や有志が作成したDocker Imageを配布している[Docker Hub](https://hub.docker.com/)からダウンロードすることができ、WordPressだけでなくnginxやtomcatなど様々な製品を試すことができます。
- [Docker Compose](https://docs.docker.jp/compose/overview.html)と言われるツールを利用することでITインフラをコード化することができます。これによりOSインストールからミドルウェア導入まで手動で行っていたことをDocker内で自動化することができます。

#### デメリット：

- Dockerは基本的にコマンドラインの操作が必須となります。GUIでOSを設定していた方やコマンドラインに不慣れな方は抵抗感があると思いますが、Dockerに慣れるとすぐにWordPressだけでなくnginxやtomcatなどの様々な開発環境をすぐに用意できるので学習することをお勧めします。
- dockerコマンドと呼ばれるDockerを操作するための専用コマンドを学習することが必須となります。

### 0-4. Kubernetes (本記事で取り扱います)

ここではKubernetes環境構築ツールである[minikube](https://kubernetes.io/ja/docs/setup/learning-environment/minikube/)をホストOS(Ubuntu)にインストールした想定で記載します。

#### メリット(Dockerと比較)：

- コンテナオーケストレーションツール(コンテナを自動的に起動させるツール)としてのメリットがあります。Kubernetesでは基本的にマニュフェスト(YAMLファイル)と呼ばれる、アプリケーションやネットワークなどの構成を記述したテキストファイルを作成します。その後、作成したマニュフェストを実行すると自動的に記述したアプリケーションやネットワークなどがKubernetes上に構成されます。
- Pod(簡略化して説明するとDockerのコンテナに相当)を自己修復する機能があります。Dockerでは1度削除したコンテナは自動で復旧しませんが、Kubernetesの機能であるDeploymentを利用することでPodを削除しても自動でPodを立ち上げ直します。例えばPod内で不具合が発生して勝手にPodが落ちても、Deploymentが記述されていることマニュフェストに記述された元のPodを立ち上げ直します。
- 次章ではKubenetesの学習用途のKubernetes環境である[minikube](https://minikube.sigs.k8s.io/docs/start/)を利用して実際にWordPressを起動します。(minikubeは1つのノードしかないため、本番用途では後述します「クラウド上のKubernetes」を利用することをお勧めします。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/8b8597ca-7d58-4eb3-6afd-1ab6236b1687.png)

#### デメリット：

- 複数ノードでKubernetesを試したい際は構築難易度やハードウェア調達の観点で後述します「クラウド上にKubenetes」環境を利用することをお勧めします。
- トラブルシューティングに関する文献(主に[KubenetesのGitHub](https://github.com/kubernetes/kubernetes)や[stackoverfow](https://stackoverflow.com/search?q=kubenetes)は日本語よりも英語が多いです。またKubernetesは早いペースでバージョンアップされますが、バージョンアップ情報も英語がほとんどです。

### 0-5. クラウド上の仮想マシン

ここではクラウド運営事業者であるAmazon Web Services(AWS)やMicrosoft Azureなどが提供している仮想マシン(AWSではAmazon EC2、AzureではAzure Virtual Machines)を利用してWordPress開発環境を構築する想定で考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/be31c532-a88e-1aee-ca18-5bd80e2946ed.png)

#### メリット(物理PCと比較)：

- 数分で仮想マシンを用意することができるため、すぐに構築に取り掛かることができます。
- ハードウェアの管理は全てクラウド事業者のデータセンターに任せるので、ハードウェア障害を気にせずにWordPress開発環境構築やWordPressの学習に集中できます。
- 特にクラウド上に作成した仮想マシンにDockerをインストールすることで、ホストOS(物理PC)に負荷をかけずにWordPressや様々な製品(nginxやtomcatなど)の学習を進めることができます。

#### デメリット：

- クラウド上の仮想マシンを利用すると1分ごとに課金が発生しますのでコスト管理を気にする必要があります。
- 例えば[Azure料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/)からB2S(Dockerを安定稼働できるメモリ4GBを搭載したUbuntu)を選択すると39.76ドル(約4,333円)の月額料金が発生すると表示されます。
- 企業でクラウドを使用する場合はサーバの電気代削減や災害対策費用削減([AWSは311発生時も東京のデータセンターが止まらなかった](https://japan.zdnet.com/article/35000414/))などコスト面でのメリットはあります。しかし個人利用ではクラウドのインターネット上にWordPress公開やクラウドの自己学習用途として使用する場合を除き、コスト面で考えるとクラウドの仮想マシンを利用せず物理PCに仮想OSやDockerを入れた方がお得です。
- クラウドによる突発的な障害が発生することがあります。障害発生時間帯は仮想マシンが使用できなくなる可能性があります。[Azureでの過去の障害履歴](https://status.azure.com/ja-jp/status/history/)

##### これから初めてクラウドを利用する方へ

クラウドを利用する際は複雑なパスワードや二段階認証、ユーザー権限管理を設定してから仮想マシン構築することを強くお勧めします。

仮にシャットダウンし忘れて上記のB2Sを1か月間起動し続けても4,333円程度で済みますが、第三者にクラウドのアカウントを乗っ取られると莫大な金額を請求される可能性があります。最悪なケースとして第三者が勝手に仮想通貨のマイニング用途に高額な仮想マシン(NC24rs V3 : GPUが搭載されたメモリ448GBの仮想マシン)を使用されてしまうと1時間で18.5ドル(約2016円)、1か月も放置してしまうと13,471ドル(約1,468,188円)を請求されてしまいます。その為、必ずセキュリティ対策を設定してから仮想マシンを構築してください。

### 0-6.クラウド上のKubernetes

ここではAWSが提供しているKubernetesサービスであるAmazon Elastic Kubernetes ServiceやAzureが提供しているKubernetesサービスであるAzure Kubernetes Serviceを利用した想定で記載します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/b089c482-cd8b-4415-5d4d-0cde56062942.png)

#### メリット(ホストOS上のKubernetesと比較)：

- 複数ノードが用意されたKubernetesを利用できます。前述しましたminikubeは１つのノードしか持たず、自分で複数ノードの環境を作成しようとすると潤沢なスペックを備えた複数のホストOSを準備すること、構築難易度が高いため簡単に用意することができません。しかしクラウド上のKubernetesを利用すれば数分程度で用意することができます。
- クラウド上のKubernetesで複数ノードを用意することで自動的にリソースが開いているノードにPodを配置します。これによりminikubeのようにリソース不足になりません。また障害でノード1つ壊れても、自動的に残っているノードにPodを割り振ります。そのため個人利用ではメリットを実感できませんが、企業が利用すれば可用性の面(障害が起きても事業を継続できる)でメリットを得ることができます。

#### デメリット：

- クラウド上のKubernetesも課金対象です。Azure料金計算ツールで最安プランである「B2S」で1ノードにつき月額39.71ドル(約4,327円)が発生します。
- 複数ノードを用意すると高額になります。最低限のノード数を計算してからクラウド上のKubernetesを利用することをお勧めします。

## １．minikubeの構築

本章からは下図のようにminikube上にWordPressアプリケーションを展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/6ab0b41b-a01f-0204-2fe9-11a620421cb0.png)


1. 本書の著者が執筆致しました「[Ubuntu20.04.1 LTSにminikubeをインストールする](https://qiita.com/yuichi1992_west/items/571016084c110d15320e)」をご覧頂き、minikubeのインストールを実施します。

2. 下記のコマンドを実行し、minikubeのノードが作成されたことを確認します。

    ```
    $ kubectl get node
    NAME       STATUS   ROLES                  AGE   VERSION
    minikube   Ready    control-plane,master   96s   v1.20.2
    ```
3. 下記のコマンドを実行し、初期状態では何もPodがないことを確認します。

    ````
    $ kubectl get pods
    No resources found in default namespace.
    ```

## ２．MySQLのデプロイ(MySQLアプリケーションを展開)

本章ではKubenetes(minikube)上にMySQLをデプロイします。

1. 下記のコマンドを実行し、viエディターを立ち上げMySQLのYAMLファイルを作成します。

    ```
    $ vi mysql.yaml
    ```

2. 下記のYAMLファイルを立ち上げたviエディターに書き込み保存します。

    ```
    apiVersion: v1 # 使用するKubernetes APIバージョンを定義
    kind: Service # PodのネットワークであるServiceリソースを定義
    metadata: # Podの名前やラベルを指定
      labels:
        app: wordpress-app
        name: mysql
      name: mysql-service
    spec: # spec内にリソースの仕様を記述する
      selector: # 同一のラベルを定義しているリソースを参照
        app: wordpress-app
        name: mysql
    type: ClusterIP # Kubenetesクラスター内のみアクセス可能な仮想IPを付与
    ports:
    - name: mysql-port
        port: 3306
        protocol: TCP
        targetPort: mysql-port
    ---
    apiVersion: v1
    kind: PersistentVolume # 永続ボリューム(ストレージ)を作成するPersistentVolumeを定義
    metadata:
      name: pv-mysql-data
      labels:
        app: wordpress-app
        name: mysql
    spec:
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: pv-mysql
      hostPath:
        path: "/data/pv-mysql-file"
        type: DirectoryOrCreate
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim # 永続ボリュームの利用を要求するPersistentVolumeClaimリソースを定義
    metadata:
      name: pvc-mysql
      labels:
        app: wordpress-app
        name: mysql
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: pv-mysql
      resources:
        requests:
        storage: 1Gi
    ---
    apiVersion: apps/v1
    kind: Deployment # Podの自己修復機能を持つDeploymentリソースを定義
    metadata:
      labels:
        app: wordpress-app
        name: mysql
      name: mysql
    spec:
    replicas: 1 # 作成するPod数を定義
      selector:
        matchLabels:
        app: wordpress-app
        name: mysql
      template:
        metadata:
          labels:
            app: wordpress-app
            name: mysql
        spec:
          containers:
          - name: mysql-app
            image: mysql:5.7 # MySQLのDockerHubに記載されているDockerImageの名称とバージョンを指定
            env: # MySQLのDockerHubに記載されている引数を記述
              - name: MYSQL_ROOT_PASSWORD
                value: "wordpressroot2021"
              - name: MYSQL_DATABASE
                value: "wordpress"
              - name: MYSQL_USER
                value: "wordpressdb"
              - name: MYSQL_PASSWORD
                value: "wordpress2021"
            ports:
            - containerPort: 3306
            name: mysql-port
            protocol: TCP
            volumeMounts:
            - name: volume-data
                mountPath: "/var/lib/mysql"
        volumes:
        - name: volume-data
            persistentVolumeClaim:
              claimName: pvc-mysql
    ```

3. 下記のコマンドを実行し、MySQLをデプロイします。

    ```
    $ kubectl apply -f mysql.yaml
    service/mysql-service created
    persistentvolume/pv-mysql-data created
    persistentvolumeclaim/pvc-mysql created
    deployment.apps/mysql created
    ```

4. 下記のコマンドを実行し、PodやYAMLファイルに記述したリソースがKubenetes上に展開されていることを確認します。

    ```
    $ kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    mysql-6984bd6c59-2vmqx   1/1     Running   0          49s
    
    $ kubectl get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    mysql   1/1     1            1           57s
    
    $ kubectl get service
    NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP    6h58m
    mysql-service   ClusterIP   10.105.191.82   <none>        3306/TCP   63s

    $ kubectl get persistentvolume
    NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
    pv-mysql-data   1Gi        RWO            Delete           Bound    default/pvc-mysql   pv-mysql                101s
    
    $ kubectl get persistentvolumeclaim
    NAME        STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-mysql   Bound    pv-mysql-data   1Gi        RWO            pv-mysql       115s
    ```

## ３．WordPressのデプロイ

本章ではKubenetes(minikube)上にWordPressをデプロイします。

1. 下記のコマンドを実行し、viエディターを立ち上げWordPressのYAMLファイルを作成します。

    ```
    $ vi wordpress.yaml
    ```

2. 下記のYAMLファイルを立ち上げたviエディターに書き込み保存します。

    ```
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: wordpress-app
        name: wordpress
      name: wordpress-external-service
    spec:
      selector:
        app: wordpress-app
        name: wordpress
      type: NodePort # Kubenetes外からアクセスできるようにNodePortを指定(ホストOSからWordPress画面が確認できるようにする)
      ports:
        - name: wordpress-external-ip
        port: 80
        nodePort: 30180
      selector:
        app: wordpress-app
        name: wordpress
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-wordpress-data
      labels:
        app: wordpress-app
        name: wordpress
    spec:
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: pv-wordpress
      hostPath:
        path: "/data/pv-wordpress-file"
        type: DirectoryOrCreate
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-wordpress
      labels:
        app: wordpress-app
        name: wordpress
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: pv-wordpress
      resources:
        requests:
        storage: 1Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: wordpress-app
        name: wordpress
      name: wordpress
    spec:
      replicas: 1
      selector:
        matchLabels:
        app: wordpress-app
        name: wordpress
      template:
        metadata:
        labels:
            app: wordpress-app
            name: wordpress
        spec:
        containers:
        - name: wordpress
            image: wordpress:latest
            env:
              - name: WORDPRESS_DB_HOST
                value: "mysql-service:3306"
              - name: WORDPRESS_DB_USER
                value: "wordpressdb"
              - name: WORDPRESS_DB_PASSWORD
                value: "wordpress2021"
              - name: WORDPRESS_DB_NAME
                value: "wordpress"
            ports:
            - containerPort: 80
            name: wordpress-port
            protocol: TCP
            volumeMounts:
            - name: volume-data
                mountPath: "/var/www/html"
        volumes:
        - name: volume-data
            persistentVolumeClaim:
              claimName: pvc-wordpress
    ```

3. 下記のコマンドを実行し、WordPressをデプロイします。

    ```
    $ kubectl apply -f wordpress.yaml
    service/wordpress-external-service created
    persistentvolume/pv-wordpress-data created
    persistentvolumeclaim/pvc-wordpress created
    deployment.apps/wordpress created
    ```

4. 下記のコマンドを実行し、PodやYAMLファイルに記述したリソースがKubenetes上に展開されていることを確認します。

    ```
    $ kubectl get pods
    NAME                         READY   STATUS    RESTARTS   AGE
    mysql-6984bd6c59-2vmqx       1/1     Running   0          2m47s
    wordpress-75588f7598-xvv9n   1/1     Running   0          22s

    $ kubectl get deployments
    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    mysql       1/1     1            1           2m52s
    wordpress   1/1     1            1           27s

    $ kubectl get service
    NAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    kubernetes                   ClusterIP   10.96.0.1       <none>        443/TCP        7h
    mysql-service                ClusterIP   10.105.191.82   <none>        3306/TCP       2m57s
    wordpress-external-service   NodePort    10.97.224.226   <none>        80:30180/TCP   32s

    $ kubectl get persistentvolume
    NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
    pv-mysql-data       1Gi        RWO            Delete           Bound    default/pvc-mysql       pv-mysql                3m7s
    pv-wordpress-data   1Gi        RWO            Delete           Bound    default/pvc-wordpress   pv-wordpress            42s

    $ kubectl get persistentvolumeclaim
    NAME            STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-mysql       Bound    pv-mysql-data       1Gi        RWO            pv-mysql       3m14s
    pvc-wordpress   Bound    pv-wordpress-data   1Gi        RWO            pv-wordpress   49s
    ```

5. 下記のコマンドを実行し、ホストOS(Ubuntu)からKubernetes内にあるWordPressに接続できるURLを出力します。

    ```
    $ minikube service --url wordpress-external-service
    http://192.168.49.2:30180
    ```

6. ホストOS内にあるブラウザから先程出力されたURLに移動し、WordPressの言語設定画面が表示されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/0acca65c-1901-e9e7-f947-26e5deefcb82.png)

7. 「日本語」を選択し「続ける」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/8c8a4ddf-9b8b-6f62-e51f-528738bafcba.png)

8. 「サイトのタイトル」「ユーザー名」「パスワード」「メールアドレス」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/edc89d8b-5056-9578-a89b-0cd03c42ff22.png)

9. 「WordPressをインストール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/fb7cf80c-82f6-5d83-f5bb-37a216d7bcb2.png)

10. インストール完了画面が表示されます。その後、「ログイン」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/93fd14cf-0da1-2993-fc8a-f7a69618a1fa.png)

11. ユーザー名とパスワードを入力しログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/0e292061-298d-6fc0-9369-2eb9217f7938.png)

12. ダッシュボードが表示されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/b904240c-b537-6ffb-dd4a-9f69c33667eb.png)

13. 簡単にWordPressを編集し動作確認を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/ee5da818-9e59-f94d-0a0b-4cc342b09741.png)

## ４．後片づけ

本章ではPodの再起動や停止を実施します。

・Podの再起動

```
(YAMLファイル上でDeploymentリソースを定義したPodに対して)
$ kubectl delete pod (pod名)

例：
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mysql-6984bd6c59-2vmqx       1/1     Running   3          42d
nginx-7dfd8f6dcc-hchlp       1/1     Running   0          7s
wordpress-75588f7598-xvv9n   1/1     Running   3          42d
$
$ kubectl delete pod nginx-7dfd8f6dcc-hchlp
pod "nginx-7dfd8f6dcc-hchlp" deleted
$
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mysql-6984bd6c59-2vmqx       1/1     Running   3          42d
nginx-7dfd8f6dcc-sfjt5       1/1     Running   0          6s  (Pod名が自動的に変わる)
wordpress-75588f7598-xvv9n   1/1     Running   3          42d
$
```

・Podを停止する

```
(YAMLファイル上でDeploymentリソースを定義したPodに対して)
$ kubectl delete (Deployment名)

例：
$ kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
mysql       1/1     1            1           42d
nginx       1/1     1            1           20d
wordpress   1/1     1            1           42d
$
$ kubectl delete deployment nginx
deployment.apps "nginx" deleted
$
$ kubectl get pods
NAME                         READY   STATUS        RESTARTS   AGE
mysql-6984bd6c59-2vmqx       1/1     Running       3          42d
nginx-7dfd8f6dcc-lm7nt       0/1     Terminating   0          5m31s
wordpress-75588f7598-xvv9n   1/1     Running       3          42d
$
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mysql-6984bd6c59-2vmqx       1/1     Running   3          42d
wordpress-75588f7598-xvv9n   1/1     Running   3          42d  (nginxのpodが再起動されない)
$
```

・ネットワーク(Service)を削除する

```
$ kubectl delete service (Service名)

例：
$ kubectl get service
NAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes                   ClusterIP   10.96.0.1       <none>        443/TCP        42d
mysql-service                ClusterIP   10.105.191.82   <none>        3306/TCP       42d
nginx-service                NodePort    10.109.139.11   <none>        80:32408/TCP   20d
wordpress-external-service   NodePort    10.97.224.226   <none>        80:30180/TCP   42d
$
$ kubectl delete service nginx-service
service "nginx-service" deleted
$
$ kubectl get service
NAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes                   ClusterIP   10.96.0.1       <none>        443/TCP        42d
mysql-service                ClusterIP   10.105.191.82   <none>        3306/TCP       42d
wordpress-external-service   NodePort    10.97.224.226   <none>        80:30180/TCP   42d
$
```

・YAMLファイルに記載されているリソース全てを削除する

```
$ kubectl delete -f (YAMLファイル)

例：
$ kubectl apply -f nginx/nginx.yaml
service/nginx-service created
deployment.apps/nginx unchanged
$
$ kubectl get pods | grep nginx
nginx-7dfd8f6dcc-sfjt5       1/1     Running   0          9m20s
$
$ kubectl get service | grep nginx
nginx-service                NodePort    10.109.144.112   <none>        80:31519/TCP   49s
$
$ kubectl delete -f nginx/nginx.yaml
service "nginx-service" deleted
deployment.apps "nginx" deleted
$
$ kubectl get pods | grep nginx
nginx-7dfd8f6dcc-sfjt5       0/1     Terminating   0          12m
$
$ kubectl get service | grep nginx
$
```


## 最後に
0章では『物理PC』～『クラウド上のKubernetes』を比較しKubernetesの利点を考えました。また1～3章では実際にKubernetes上にWordPress開発環境を作成しました。実演を通してKubernetesを利用することでコード(YAMLファイル)があればすぐにアプリケーションを展開でき、手動によるアプリケーションインストールの手間がなくなることを実感できたと思います。有効な利用用途しては、例えばチームで様々な検証環境を用意する場合(WordPressだけでなくnginxやtomcatも準備する必要がある場合)はKubernetesを使用することでコードがあればすぐに環境を整備でき、手動によるインストールの手間や依存性問題によるトラブルシューティングの時間を削減しアプリケーション開発に集中できると思います。