在 Day 10 中,我們學到了預設的 ClusterIP 只能在集群內部互相溝通。但如果我們做的是面向大眾的 Web 網站或公開 API,外部的使用者該如何連進來?
Kubernetes 提供了兩種直接的 Service 型態來開門迎客:
| 模式 | 核心概念 | 適用場景 |
|---|---|---|
| NodePort | 在每個節點開一扇門(30000~32767 Port),直連任一 Node IP | 本地測試、Demo、自建機房 |
| LoadBalancer | 串接雲端平台的負載平衡器(配發獨立公網 IP) | 雲端生產環境(AWS / GCP / Azure) |
任意節點的 IP:指定 NodePort,流量就會被 kube-proxy 自動轉發到後端的 Pod。type: LoadBalancer 的 Service 時,Kubernetes 會主動向雲端平台申請一台專屬的硬體/軟體負載平衡器(例如 AWS Network Load Balancer)。建立 nginx-nodeport.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport-service
spec:
type: NodePort
selector:
app: nginx-app
ports:
- protocol: TCP
port: 80 # Service 內部的 Port
targetPort: 80 # Pod 容器的 Port
nodePort: 30080 # 指定在 Node 上開放的 Port (30000-32767)
套用配置:
kubectl apply -f nginx-nodeport.yaml
檢查 Service 狀態:
kubectl get svc nginx-nodeport-service
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-nodeport-service NodePort 10.108.85.12 <none> 80:30080/TCP 10s
在 Minikube 環境中,快速取得可連線的外部 URL:
minikube service nginx-nodeport-service --url
複製終端機輸出的網址(例如 http://127.0.0.1:54321 或 http://192.168.49.2:30080)貼到瀏覽器,就能直接看到 Nginx 畫面!
建立 nginx-loadbalancer.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-lb-service
spec:
type: LoadBalancer
selector:
app: nginx-app
ports:
- protocol: TCP
port: 80
targetPort: 80
套用配置:
kubectl apply -f nginx-loadbalancer.yaml
注意:如果在本地 Minikube,EXTERNAL-IP 會一直卡在 <pending>,因為本地沒有 AWS 或 GCP 的負載平衡器驅動。
要在 Minikube 模擬雲端 LoadBalancer,只需另開一個終端機執行:
minikube tunnel
執行後回到原視窗再次查詢 kubectl get svc nginx-lb-service,你會發現 EXTERNAL-IP 成功分到了 127.0.0.1!直接在瀏覽器打開 http://localhost 即可存取。
雖然這兩種方式成功讓外部連進來了,但在大型系統中仍有瓶頸:
:30080),極不人性化。我們能不能只用一個公網 IP(Port 80/443),透過不同的網域名稱(Domain)或路徑(Path),自動把流量分派給不同的後端 Service 呢?
今天我們掌握了將 Kubernetes 服務對外公開的兩種方式:
為了解決多個微服務共用單一流量入口與網域路由的需求,明天 Day 12,我們將學習七層網路的流量總管:「流量總管:Ingress 與 Ingress Controller 網域路由設定」!