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

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

[Ingress](/ja/docs/concepts/services-networking/ingress/)とは、クラスター内のServiceに外部からのアクセスを許可するルールを定義するAPIオブジェクトです。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)はIngress内に設定されたルールを満たすように動作します。

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



## 始める前に


<p>Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。
このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。
まだクラスターがない場合、<a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a>を使って作成するか、
以下のいずれかのKubernetesプレイグラウンドも使用できます:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
  <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>




<!-- steps -->

## Minikubeクラスターを作成する

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

    
    


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

    ```shell
    minikube start
    ```

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

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

    ```shell
    minikube addons enable ingress
    ```

1. NGINX Ingressコントローラーが起動したことを確認します。

    ```shell
    kubectl get pods -n kube-system
    ```

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><pre><code>このコマンドの実行には数分かかる場合があります。
</code></pre>
</div>


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

    ```shell
    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を作成します。

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

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

    ```shell
    deployment.apps/web created
    ```

1. Deploymentを公開します。

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

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

    ```shell
    service/web exposed
    ```

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

    ```shell
    kubectl get service web
    ```

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

    ```shell
    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.104.133.249   <none>        8080:31637/TCP   12m
    ```

1. NodePort経由でServiceを訪問します。

    ```shell
    minikube service web --url
    ```

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

    ```shell
    http://172.17.0.15:31637
    ```

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

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

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

## Ingressリソースを作成する

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

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

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="highlight code-sample">
        <div class="copy-code-icon">
        <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/ja/examples/service/networking/example-ingress.yaml" download="service/networking/example-ingress.yaml"><code>service/networking/example-ingress.yaml</code>
        </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('service-networking-example-ingress-yaml')" title="service/networking/example-ingress.yamlをクリップボードにコピー"></img></div>
        <div class="includecode" id="service-networking-example-ingress-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">networking.k8s.io/v1</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Ingress</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">example-ingress</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ingressClassName</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">rules</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">hello-world.info</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">http</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">paths</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">pathType</span><span class="p">:</span><span class="w"> </span><span class="l">Prefix</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">backend</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">service</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">web</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">port</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">                  </span><span class="nt">number</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span></span></span></code></pre></div></div>
    </div>

1. 次のコマンドを実行して、Ingressリソースを作成します。

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

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

    ```shell
    ingress.networking.k8s.io/example-ingress created
    ```

1. 次のコマンドで、IPアドレスが設定されていることを確認します。

    ```shell
    kubectl get ingress
    ```

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><pre><code>このコマンドの実行には数分かかる場合があります。
</code></pre>
</div>


    ```shell
    NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
    example-ingress   <none>   hello-world.info   172.17.0.15    80      38s
    ```

1. 次の行を`/etc/hosts`ファイルの最後に書きます。

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><pre><code>Minikubeをローカル環境で実行している場合、`minikube ip`コマンドを使用すると外部のIPが取得できます。Ingressのリスト内に表示されるIPアドレスは、内部のIPになるはずです。
</code></pre>
</div>


    ```
    172.17.0.15 hello-world.info
    ```

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

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

    ```shell
    curl hello-world.info
    ```

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

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

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><pre><code>Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoにアクセスできます。
</code></pre>
</div>


## 2番目のDeploymentを作成する

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

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

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

    ```shell
    deployment.apps/web2 created
    ```

1. Deploymentを公開します。

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

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

    ```shell
    service/web2 exposed
    ```

## Ingressを編集する

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

    ```yaml
          - path: /v2
            pathType: Prefix
            backend:
              service:
                name: web2
                port:
                  number: 8080
    ```

1. 次のコマンドで変更を適用します。

    ```shell
    kubectl apply -f example-ingress.yaml
    ```

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

    ```shell
    ingress.networking/example-ingress configured
    ```

## Ingressを試す

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

    ```shell
    curl hello-world.info
    ```

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

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

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

    ```shell
    curl hello-world.info/v2
    ```

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

    ```shell
    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    ```

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><pre><code>Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoおよびhello-world.info/v2にアクセスできます。
</code></pre>
</div>





## 次の項目

* [Ingress](/ja/docs/concepts/services-networking/ingress/)についてさらに学ぶ。
* [Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)についてさらに学ぶ。
* [Service](/ja/docs/concepts/services-networking/service/)についてさらに学ぶ。
