Minikube上でNGINX Ingressコントローラーを使用してIngressをセットアップする

Ingressとは、クラスター内のServiceに外部からのアクセスを許可するルールを定義するAPIオブジェクトです。IngressコントローラーはIngress内に設定されたルールを満たすように動作します。

このページでは、簡単なIngressをセットアップして、HTTPのURIに応じてwebまたはweb2というServiceにリクエストをルーティングする方法を説明します。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

バージョンを確認するには次のコマンドを実行してください: kubectl version.

Minikubeクラスターを作成する

  1. Launch Terminalをクリックします。

  2. (オプション) Minikubeをローカル環境にインストールした場合は、次のコマンドを実行します。

    minikube start
    

Ingressコントローラーを有効化する

  1. NGINX Ingressコントローラーを有効にするために、次のコマンドを実行します。

    minikube addons enable ingress
    
  2. NGINX Ingressコントローラーが起動したことを確認します。

    kubectl get pods -n kube-system
    
    備考: このコマンドの実行には数分かかる場合があります。

    出力は次のようになります。

    NAME                                        READY     STATUS    RESTARTS   AGE
    default-http-backend-59868b7dd6-xb8tq       1/1       Running   0          1m
    kube-addon-manager-minikube                 1/1       Running   0          3m
    kube-dns-6dcb57bcc8-n4xd4                   3/3       Running   0          2m
    kubernetes-dashboard-5498ccf677-b8p5h       1/1       Running   0          2m
    nginx-ingress-controller-5984b97644-rnkrg   1/1       Running   0          1m
    storage-provisioner                         1/1       Running   0          2m
    

Hello Worldアプリをデプロイする

  1. 次のコマンドを実行して、Deploymentを作成します。

    kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
    

    出力は次のようになります。

    deployment.apps/web created
    
  2. Deploymentを公開します。

    kubectl expose deployment web --type=NodePort --port=8080
    

    出力は次のようになります。

    service/web exposed
    
  3. Serviceが作成され、NodePort上で利用できるようになったことを確認します。

    kubectl get service web
    

    出力は次のようになります。

    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.104.133.249   <none>        8080:31637/TCP   12m
    
  4. NodePort経由でServiceを訪問します。

    minikube service web --url
    

    出力は次のようになります。

    http://172.17.0.15:31637
    
    備考: Katacoda環境の場合のみ: 上部のterminalパネルでプラスのアイコンをクリックして、Select port to view on Host 1(Host 1を表示するポートを選択)をクリックします。NodePort(上の例では31637)を入力して、Display Port(ポートを表示)をクリックしてください。

    出力は次のようになります。

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

    これで、MinikubeのIPアドレスとNodePort経由で、サンプルアプリにアクセスできるようになりました。次のステップでは、Ingressリソースを使用してアプリにアクセスできるように設定します。

Ingressリソースを作成する

以下に示すファイルは、hello-world.info経由で送られたトラフィックをServiceに送信するIngressリソースです。

  1. 以下の内容でexample-ingress.yamlを作成します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
      rules:
        - host: hello-world.info
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web
                    port:
                      number: 8080
  2. 次のコマンドを実行して、Ingressリソースを作成します。

    kubectl apply -f https://kubernetes.io/examples/service/networking/example-ingress.yaml
    

    出力は次のようになります。

    ingress.networking.k8s.io/example-ingress created
    
  3. 次のコマンドで、IPアドレスが設定されていることを確認します。

    kubectl get ingress
    
    備考: このコマンドの実行には数分かかる場合があります。
    NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
    example-ingress   <none>   hello-world.info   172.17.0.15    80      38s
    
  4. 次の行を/etc/hostsファイルの最後に書きます。

    備考: Minikubeをローカル環境で実行している場合、minikube ipコマンドを使用すると外部のIPが取得できます。Ingressのリスト内に表示されるIPアドレスは、内部のIPになるはずです。
    172.17.0.15 hello-world.info
    

    この設定により、リクエストがhello-world.infoからMinikubeに送信されるようになります。

  5. Ingressコントローラーがトラフィックを制御していることを確認します。

    curl hello-world.info
    

    出力は次のようになります。

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
    備考: Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoにアクセスできます。

2番目のDeploymentを作成する

  1. 次のコマンドを実行して、v2のDeploymentを作成します。

    kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
    

    出力は次のようになります。

    deployment.apps/web2 created
    
  2. Deploymentを公開します。

    kubectl expose deployment web2 --port=8080 --type=NodePort
    

    出力は次のようになります。

    service/web2 exposed
    

Ingressを編集する

  1. 既存のexample-ingress.yamlを編集して、以下の行を追加します。

          - path: /v2
            pathType: Prefix
            backend:
              service:
                name: web2
                port:
                  number: 8080
    
  2. 次のコマンドで変更を適用します。

    kubectl apply -f example-ingress.yaml
    

    出力は次のようになります。

    ingress.networking/example-ingress configured
    

Ingressを試す

  1. Hello Worldアプリの1番目のバージョンにアクセスします。

    curl hello-world.info
    

    出力は次のようになります。

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  2. Hello Worldアプリの2番目のバージョンにアクセスします。

    curl hello-world.info/v2
    

    出力は次のようになります。

    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    
    備考: Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoおよびhello-world.info/v2にアクセスできます。

次の項目