NGINX Ingress Controllerで簡易的なNginxコンテナの起動

# 目的
NGINX Ingress Controllerを触っておきたい！

# 環境

macOS
Docker for Mac

# 参照

[Installation Guide - NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/)

# NGINX Ingress Controllerとは？

NGINX Ingress Controllerは、OSSのIngressコントローラーです。

> Ingressリソースが機能するためには、クラスターでIngressコントローラーが実行されている必要があります。
[Ingress Controllers | Kubernetes](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)

1. DeploymentやService等のリソースを準備
2. NGINX Ingress Controllerをインストール
3. Ingressリソースを準備
3. Ingressリソースをローカルにdeploy

# 準備

[Ingress Controllers | Kubernetes](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)
👆よく読む

## 作業スペース確保

```sh
$ mkdir practice
$ cd practice
```

## Deploymentの編集

```sh
$ vi nginx-deployment.yml
```

```yml:nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-sample
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nginx-sample
    spec:
      containers:
      - name: nginx-deployment
        image: nginx:latest
        ports:
        - containerPort: 80
```

### Deploymentの作成

```sh
$ kubectl apply -f nginx-deployment.yml
```

## Serviceの編集

```sh
$ vi nginx-service.yml
```

```yml:nginx-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - port: 9999
      targetPort: 80
  selector:
    app: nginx-sample
```

### Serviceの作成

```sh
$ kubectl apply -f nginx-service.yml
```


## NGINX Ingress Controllerのインストール

参照: [Installation Guide - NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/)

Docker for Macの場合👇

```sh
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
```

インストールできたか確認

```sh
$ kubectl get pods -n ingress-nginx \
  -l app.kubernetes.io/name=ingress-nginx --watch
```

## Ingressの編集

```yml:nginx-ingress.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  backend:
    serviceName: nginx-service
    servicePort: 9999
```

### Ingressの作成

```sh
$ kubectl apply -f nginx-ingress.yml
```


# アクセスしてみる

http://127.0.0.1/

<img width="906" alt="スクリーンショット 2020-06-27 19.31.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/c70eecea-126e-f0c3-0f9d-7f8252c6ee69.png">

# いろいろ見てみる

## 作成したリソースの操作

#### リソース名の省略形

たぶん触っていると沢山書くことになるので、省略形を覚えておくと便利です。

項目 | 省略
--------- | ---------
deployment | deploy
service | svc
ingress | ing

### PodのNAMEやレプリカ数などを取得

```sh
$ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/1     1            0           109m
```

### リソース名とオブジェクト名を指定してPodの詳細を表示

```sh
$ kubectl describe deploy nginx-deployment
```

### ファイル名を指定してリソースの削除

```sh
$ kubectl delete -f nginx-deployment.yml
```

`deploy` 部分を、 `svc` や `ing` などに置き換えて使用します。

# それぞれのリソースにおけるportの関係

Ingressで、service名とserviceのポートを指定します。
- `spec.backend.serviceName`
- `spec.backend.servicePort`

Serviceで、`targetPort`を指定します。
Deploymentで、`containerPort`にて待ち受けます。

![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/1f83b3b0-1f51-2db9-3849-49e6ee383482.png)