Amazon EKSでNGINX Ingress Controllerを利用する

# はじめに
Amazon EKSで[NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx)を利用する方法をまとめます。
Mac環境を想定しています。
NGINX Ingress Controllerは、NGINXをリバース プロキシおよびロード バランサーとして使用する Kubernetes 用のイングレス コントローラーです。
NGINX Ingress Controllerを利用するとCLBが構築されます。

# 実行環境の準備
1.  AWS CLIの設定
[AWS CloudFormationを動かすためのAWS CLIの設定](https://qiita.com/miyabiz/items/fed11796f0ea2b7608f4)を参考にしてください。

1.  EKSクラスタの構築
[Macでeksctlを利用してAmazon EKSのクラスターを構築する](https://qiita.com/miyabiz/items/75f83237795b0b7d52bd)を参考にしてください。

1.  EKSのコンテキストの設定
[MacにてAmazon EKSの設定をする](https://qiita.com/miyabiz/items/b98d145cedb35dab9524)を参考にしてください。

1.  Helmの設定
[Amazon EKSでHelmを利用する](https://qiita.com/miyabiz/items/453361e6af64b324443c)を参考にしてください。


# 環境設定
1.  NGINX Ingress ControllerのチャートをHelmでインストールする
    ※事前にKubernetesクラスターのコンテキストの設定をします。

    ```sh
    # ingress-nginx　チャートリポジトリを追加する
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

    # リポジトリを更新する
    helm repo update

    # NGINX Ingress Controller のチャートをインストールする
    helm install nginx-ingress-controller ingress-nginx/ingress-nginx \
      -n nginx-ingress-controller \
      --create-namespace

    # NGINX Ingress Controller がインストールされたことを確認する
    helm list -n nginx-ingress-controller
    ```

# [サンプル] guestbookのマニフェスト
[guestbook](https://github.com/argoproj/argocd-example-apps/tree/master/guestbook)を構築する。

1.  guestbook をクラスターに適用する

    ```sh:
    kubectl apply -f https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/guestbook/guestbook-ui-deployment.yaml
    ```

1.  `ingress.yaml` を作成する

    ```yaml:ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
      name: guestbook-ui
      namespace: default
    spec:
      rules:
      - http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: guestbook-ui
                port:
                  number: 3000
    ```

1.  `service.yaml` を作成する
    ※[guestbook-ui-svc.yaml](https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/guestbook/guestbook-ui-svc.yaml) を参考にする

    ```yaml:service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
      labels:
        app: guestbook-ui
      name: guestbook-ui
      namespace: default
    spec:
      ports:
      - port: 3000
        protocol: TCP
        targetPort: 80
      selector:
        app: guestbook-ui
      type: NodePort
    ```

1.  クラスターに適用する

    ```sh
    kubectl apply -f ingress.yaml
    kubectl apply -f service.yaml
    ```

1.  guestbook にアクセスする
    ※ELBが構築されるまで、数分アクセスできないことがあります。

    ```sh
    open "http://$(kubectl get svc -n nginx-ingress-controller nginx-ingress-controller-ingress-nginx-controller | awk '{ print $4 }' | tail -1)"
    ```

# クリーンアップ

1.  クラスターから削除する

    ```sh
    kubectl delete -f ingress.yaml
    kubectl delete -f service.yaml
    ```

1.  guestbook をクラスターから削除する

    ```sh:
    kubectl delete -f https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/guestbook/guestbook-ui-deployment.yaml
    ```

1.  NGINX Ingress ControllerをHelmで削除する

    ```sh
    helm delete nginx-ingress-controller -n nginx-ingress-controller
    ```

1.  Namespaceを削除する

    ```sh
    kubectl delete ns nginx-ingress-controller
    ```