在 Minikube 上使用 NGINX Ingress Controller 設定 Ingress

Ingress 是一個 API 物件,定義規則以允許外部存取叢集中的服務。Ingress 控制器 實現 Ingress 中設定的規則。

本頁說明如何設定一個簡單的 Ingress,根據 HTTP URI 將請求路由到服務 'web' 或 'web2'。

開始之前

本教學課程假設您使用 minikube 執行本機 Kubernetes 叢集。請造訪安裝工具以了解如何安裝 minikube

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個非充當控制平面主機的節點的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用這些 Kubernetes 實驗環境之一

您的 Kubernetes 伺服器必須是 1.19 或更新版本。若要檢查版本,請輸入 kubectl version。如果您使用的是較舊的 Kubernetes 版本,請切換到該版本的文件。

建立 minikube 叢集

如果您尚未在本機設定叢集,請執行 minikube start 以建立叢集。

啟用 Ingress 控制器

  1. 若要啟用 NGINX Ingress 控制器,請執行以下命令

    minikube addons enable ingress
    
  2. 驗證 NGINX Ingress 控制器是否正在執行

    kubectl get pods -n ingress-nginx
    

    輸出類似於

    NAME                                        READY   STATUS      RESTARTS    AGE
    ingress-nginx-admission-create-g9g49        0/1     Completed   0          11m
    ingress-nginx-admission-patch-rqp78         0/1     Completed   1          11m
    ingress-nginx-controller-59b45fb494-26npt   1/1     Running     0          11m
    

部署 hello world 應用程式

  1. 使用以下命令建立部署

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

    輸出應為

    deployment.apps/web created
    

    驗證部署是否處於 Ready 狀態

    kubectl get deployment web 
    

    輸出應類似於

    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    web    1/1     1            1           53s
    
  2. 公開部署

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

    輸出應為

    service/web exposed
    
  3. 驗證服務已建立且可在節點連接埠上使用

    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 存取服務,使用 minikube service 命令。遵循您平台的指示

    minikube service web --url
    

    輸出類似於

    http://172.17.0.15:31637
    

    從不同的終端機,調用上一步輸出中獲得的 URL

    curl http://172.17.0.15:31637 
    

    # The command must be run in a separate terminal.
    minikube service web --url 
    

    輸出類似於

    http://127.0.0.1:62445
    ! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
    

    從不同的終端機,調用上一步輸出中獲得的 URL

    curl http://127.0.0.1:62445 
    

    輸出類似於

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

    您現在可以透過 Minikube IP 位址和 NodePort 存取範例應用程式。下一步讓您可以使用 Ingress 資源存取應用程式。

建立 Ingress

以下清單檔定義一個 Ingress,透過 hello-world.example 將流量傳送到您的服務。

  1. 從以下檔案建立 example-ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      ingressClassName: nginx
      rules:
        - host: hello-world.example
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web
                    port:
                      number: 8080
  2. 執行以下命令以建立 Ingress 物件

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

    輸出應為

    ingress.networking.k8s.io/example-ingress created
    
  3. 驗證 IP 位址已設定

    kubectl get ingress
    

    您應該在 ADDRESS 欄中看到 IPv4 位址;例如

    NAME              CLASS   HOSTS                 ADDRESS        PORTS   AGE
    example-ingress   nginx   hello-world.example   172.17.0.15    80      38s
    
  4. 透過遵循您平台的指示,驗證 Ingress 控制器是否正在導引流量

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
    

    minikube tunnel
    

    輸出類似於

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    從新的終端機內,調用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
    

    您應該看到

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  5. 或者,您也可以從瀏覽器造訪 hello-world.example

    在電腦上的 /etc/hosts 檔案底部新增一行 (您將需要管理員存取權限)

    查詢 minikube 報告的外部 IP 位址

      minikube ip 
    

      172.17.0.15 hello-world.example
    

    127.0.0.1 hello-world.example
    

    在您進行此變更之後,您的網頁瀏覽器會將 hello-world.example URL 的請求傳送到 Minikube。

建立第二個部署

  1. 使用以下命令建立另一個部署

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

    輸出應為

    deployment.apps/web2 created
    

    驗證部署是否處於 Ready 狀態

    kubectl get deployment web2 
    

    輸出應類似於

    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    web2   1/1     1            1           16s
    
  2. 公開第二個部署

    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 應用程式的第一個版本。

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
    

    minikube tunnel
    

    輸出類似於

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    從新的終端機內,調用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
    

    輸出類似於

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  2. 存取 Hello World 應用程式的第二個版本。

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example/v2
    

    minikube tunnel
    

    輸出類似於

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    從新的終端機內,調用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example/v2
    

    輸出類似於

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

下一步

上次修改於 2024年5月7日下午1:50 PST:變更 ingress 教學的主機,以降低安全性風險。(cd6148bc97)