Kubernetes(minikube)にNginxをデプロイし、Hello Worldを表示させる

# 概要
本書ではUbuntu上に作成したminikubeにNginxをデプロイします。その後、「Hello World」のHTMLファイルをデプロイしたNginx上で表示できるようにConfigMapの設定をします。

## 前提条件
Ubuntu上にminikubeを立ち上げてください。minikubeのインストール方法につきましては著者が執筆しました下記の記事をご参考ください。
[Ubuntu20.04.1 LTSにminikubeをインストールする](https://qiita.com/yuichi1992_west/items/571016084c110d15320e)

### 1. NginxのYAMLファイルを作成する

NginxのYAMLファイルを作成します。`vi nginx.yaml`でViエディターを立ち上げ、下記のYAMLファイルを作成します。

```
apiVersion: v1 # 使用するKubernetes APIバージョンを定義
kind: Service # PodのネットワークであるServiceリソースを定義
metadata: # 名前やラベルを指定
  labels:
    app: nginx-app
    name: nginx
  name: nginx-service
spec: # spec内にリソースの仕様を記述する
  selector: # 同一のラベルを定義しているリソースを参照
    app: nginx-app
    name: nginx
  type: NodePort # Kubenetes外からアクセスできるようにNodePortを指定(ホストOSからNginxの画面が確認できるようにする)
  ports:
  - name: nginx-port #ポート番号を指定
    port: 80
    protocol: TCP
    targetPort: nginx-port
---
apiVersion: apps/v1
kind: Deployment # Podの自己修復機能を持つDeploymentリソースを定義
metadata:
  labels:
    app: nginx-app
    name: nginx
  name: nginx
spec:
  replicas: 1 # 作成するPod数を定義
  selector:
    matchLabels:
      app: nginx-app
      name: nginx
  template:
    metadata:
      labels:
        app: nginx-app
        name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest # NginxのDockerHubに記載されているDockerImageの名称とバージョンを指定
        ports:
        - containerPort: 80 # Podから解放するポート番号を定義
          name: nginx-port
          protocol: TCP
```

### ２．Nginxをデプロイ

1. 下記のコマンドを実行し、作成したYAMLファイルをデプロイします。

    ```
    $ kubectl apply -f nginx.yaml
    ```

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

    ```
    $ kubectl get pod | grep nginx
    nginx-669bffdf57-hnmph       1/1     Running   1          25m
    $ kubectl get service | grep nginx
    nginx-service                NodePort    10.108.1.208    <none>        80:30348/TCP   25m
    ```

3. 下記のコマンドを実行し、ホストOS(Ubuntu)からNginxの画面が表示できるIPアドレスを払い出します。

    ```
    $ minikube service nginx-service
    |-----------|---------------|---------------|---------------------------|
    | NAMESPACE |     NAME      |  TARGET PORT  |            URL            |
    |-----------|---------------|---------------|---------------------------|
    | default   | nginx-service | nginx-port/80 | http://192.168.49.2:30348 |
    |-----------|---------------|---------------|---------------------------|
    * Opening service default/nginx-service in default browser...
    ```

4.  ブラウザにて払い出されたIPアドレスに移動し、Nginxのデフォルト画面が表示できることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/1affb866-ee91-5786-db66-7d3dfe38cc47.png)

### ３．index.htmlをConfigmapリソースに保存

ConfigMapとは設定ファイルをリソース内に保存し、保存した設定ファイルをPodにマウントする際に使用されます。
[Kubernetes公式のConfigMap概要](https://kubernetes.io/ja/docs/concepts/configuration/configmap/)

`vi nginx-configmap.yaml`にてViエディターを立ち上げConfigMapのYAMLファイルを作成します。

```
apiVersion: v1
kind: ConfigMap # Podに設定ファイルを渡すことができるリソース
metadata:
  labels:
    app: nginx-app
    name: nginx
  name: nginx-html
data: # 下記にPodに渡したい設定ファイルを定義
  index.html: | # ファイル名を定義
    <html> # 設定ファイルの中身を記載
      <head>
        <title>
        Kubernetes Hello World
        </title>
      <body>
        <h1>
        Kubernetes Hello World
        </h1>
        <h2>
        Kubernetes Nignx ConfigMap
        </h2>
      </body>
    </html>
```

YAMLファイルの作成後、`kubectl apply -f nginx-configmap.yaml`を実行しConfigMapリソースを作成します。ConfigMapリソースが作成されたか確認する際は`kubectl get configmap`を実行します。

```
$ kubectl get configmap | grep nginx
nginx-html         1      9m26s
```

### ４．NginxのPod上からindex.htmlが見えるようにする

先程作成したConfigMapリソースをPod上にマウントするため、１章で作成したnginx.yamlを修正します。

```
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-app
    name: nginx
  name: nginx-service
spec:
  selector:
    app: nginx-app
    name: nginx
  type: NodePort
  ports:
  - name: nginx-port
    port: 80
    protocol: TCP
    targetPort: nginx-port
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-app
    name: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
      name: nginx
  template:
    metadata:
      labels:
        app: nginx-app
        name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
        volumeMounts: # Pod上にマウントするファイルを定義
        - name: nginx-html-file # マウントしたいvolumeを指定
          mountPath: /usr/share/nginx/html/index.html # 配置するパスを指定(Nginxのデフォルトの公開ディレクトリは/usr/share/nginx/html)
          subPath: index.html # マウントするファイル名を指定
          readOnly: true
      volumes: # マウントしたいリソースを定義
        - name: nginx-html-file # Podにマウントするvolumeを定義
          configMap:
            name: nginx-html # 使用するConfigMapリソースを指定
            items: # ConfigMapリソースで定義した、どのファイルを使用するか指定する
            - key: "index.html"
              path: "index.html"
```

YAMLファイル修正後、`kubectl apply -f nginx.yaml`を実行し修正した内容を適用します。その後、ブラウザを確認しindex.htmlの中身が表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/3f14bb0e-354a-d8cd-3d9c-6e89b78a0ecb.png)

## 最後に
本書ではConfigMapを使用してNginxにindex.htmlを表示することができました。Kubernetes(minikube)内のConfigMapとNginxを組み合わせることでHTMLの勉強や動作確認などに使用できます。