在 Minikube 上使用 NGINX Ingress Controller 設定 Ingress
Ingress 是一個 API 物件,定義規則以允許外部存取叢集中的服務。Ingress 控制器 實現 Ingress 中設定的規則。
本頁說明如何設定一個簡單的 Ingress,根據 HTTP URI 將請求路由到服務 'web' 或 'web2'。
開始之前
本教學課程假設您使用 minikube
執行本機 Kubernetes 叢集。請造訪安裝工具以了解如何安裝 minikube
。
注意
本教學課程使用一個需要 AMD64 架構的容器。如果您在具有不同 CPU 架構的電腦上使用 minikube,您可以嘗試搭配可以使用 AMD64 模擬器的驅動程式使用 minikube。例如,Docker Desktop 驅動程式可以做到這一點。您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個非充當控制平面主機的節點的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用這些 Kubernetes 實驗環境之一
您的 Kubernetes 伺服器必須是 1.19 或更新版本。若要檢查版本,請輸入kubectl version
。如果您使用的是較舊的 Kubernetes 版本,請切換到該版本的文件。建立 minikube 叢集
如果您尚未在本機設定叢集,請執行 minikube start
以建立叢集。
啟用 Ingress 控制器
若要啟用 NGINX Ingress 控制器,請執行以下命令
minikube addons enable ingress
驗證 NGINX Ingress 控制器是否正在執行
kubectl get pods -n ingress-nginx
注意
可能需要一分鐘的時間,您才會看到這些 Pod 執行正常。輸出類似於
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 應用程式
使用以下命令建立部署
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
公開部署
kubectl expose deployment web --type=NodePort --port=8080
輸出應為
service/web exposed
驗證服務已建立且可在節點連接埠上使用
kubectl get service web
輸出類似於
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
透過 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
將流量傳送到您的服務。
從以下檔案建立
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
執行以下命令以建立 Ingress 物件
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
輸出應為
ingress.networking.k8s.io/example-ingress created
驗證 IP 位址已設定
kubectl get ingress
注意
這可能需要幾分鐘的時間。您應該在
ADDRESS
欄中看到 IPv4 位址;例如NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress nginx hello-world.example 172.17.0.15 80 38s
透過遵循您平台的指示,驗證 Ingress 控制器是否正在導引流量
注意
如果在 MacOS (Darwin) 上使用 Docker 驅動程式,網路會受到限制,且節點 IP 無法直接連線。若要讓 ingress 運作,您需要開啟一個新的終端機並執行minikube tunnel
。sudo
權限是必要的,因此在提示時提供密碼。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
或者,您也可以從瀏覽器造訪
hello-world.example
。在電腦上的
/etc/hosts
檔案底部新增一行 (您將需要管理員存取權限)查詢 minikube 報告的外部 IP 位址
minikube ip
172.17.0.15 hello-world.example
注意
變更 IP 位址以符合minikube ip
的輸出。127.0.0.1 hello-world.example
在您進行此變更之後,您的網頁瀏覽器會將
hello-world.example
URL 的請求傳送到 Minikube。
建立第二個部署
使用以下命令建立另一個部署
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
公開第二個部署
kubectl expose deployment web2 --port=8080 --type=NodePort
輸出應為
service/web2 exposed
編輯現有的 Ingress
編輯現有的
example-ingress.yaml
清單檔,並在末尾新增以下行- path: /v2 pathType: Prefix backend: service: name: web2 port: number: 8080
套用變更
kubectl apply -f example-ingress.yaml
您應該看到
ingress.networking/example-ingress configured
測試您的 Ingress
存取 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
存取 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
注意
如果您執行了更新/etc/hosts
的選用步驟,您也可以從瀏覽器造訪hello-world.example
和hello-world.example/v2
。
下一步
- 閱讀更多關於 Ingress 的資訊
- 閱讀更多關於 Ingress 控制器
- 閱讀更多關於 服務