適用於 Istio 服務網格附加元件部署的 Azure Kubernetes Service (AKS) 外部或內部輸入
本文示範如何針對適用於 Azure Kubernetes Service (AKS) 叢集的 Istio 服務網格附加元件部署外部或內部輸入。
注意
執行 Istio 附加元件的次要修訂升級 (部分機器翻譯) 時,將會為新的控制平面修訂建立外部/內部閘道的另一個部署。
必要條件
此指南假設您已遵循此文件,在 AKS 叢集上啟用 Istio 附加元件、部署範例應用程式,並設定環境變數。
啟用外部輸入閘道
使用 az aks mesh enable-ingress-gateway
,在 AKS 叢集上啟用可外部存取的 Istio 輸入:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external
使用 kubectl get svc
來檢查對應至輸入閘道的服務:
kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress
從輸出中觀察服務的外部 IP 位址是可公開存取的 IP 位址:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aks-istio-ingressgateway-external LoadBalancer 10.0.10.249 <EXTERNAL_IP> 15021:30705/TCP,80:32444/TCP,443:31728/TCP 4m21s
注意
目前不支援針對內部和外部閘道自訂 IP 位址。 Istio 附加元件會還原輸入規格上的自訂 IP 位址,未來計劃允許在 Istio 附加元件的閘道 API 實作中進行自訂。
根據預設,在啟用輸入閘道之後,就無法從叢集外部存取應用程式。 若要讓應用程式可供存取,請使用下列資訊清單,將範例部署的輸入對應至 Istio 輸入閘道:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-gateway-external
spec:
selector:
istio: aks-istio-ingressgateway-external
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: bookinfo-vs-external
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway-external
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
EOF
注意
閘道物件中使用的選取器會指向 istio: aks-istio-ingressgateway-external
,您可以在對應至先前啟用之外部輸入的服務上以標籤形式加以找到。
設定適用於外部輸入主機和連接埠的環境變數:
export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL
擷取範例應用程式的外部位址:
echo "http://$GATEWAY_URL_EXTERNAL/productpage"
瀏覽至上一個命令輸出中的 URL,並確認已顯示範例應用程式的產品頁面。 或者,您也可以使用 curl
來確認範例應用程式可供存取。 例如:
curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"
確認範例應用程式的產品頁面可供存取。 預期的輸出為:
<title>Simple Bookstore App</title>
啟用內部輸入閘道
使用 az aks mesh enable-ingress-gateway
,在 AKS 叢集上啟用內部 Istio 輸入:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal
使用 kubectl get svc
來檢查對應至輸入閘道的服務:
kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress
從輸出中觀察服務的外部 IP 位址並非可公開存取的 IP 位址,而是僅能在本機存取:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aks-istio-ingressgateway-internal LoadBalancer 10.0.182.240 <IP> 15021:30764/TCP,80:32186/TCP,443:31713/TCP 87s
啟用輸入閘道之後,必須透過閘道公開應用程式,並據此設定路由規則。 使用下列資訊清單,將範例部署的輸入對應至 Istio 輸入閘道:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-internal-gateway
spec:
selector:
istio: aks-istio-ingressgateway-internal
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: bookinfo-vs-internal
spec:
hosts:
- "*"
gateways:
- bookinfo-internal-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
EOF
注意
閘道物件中使用的選取器會指向 istio: aks-istio-ingressgateway-internal
,您可以在對應至先前啟用之內部輸入的服務上以標籤形式加以找到。
設定適用於內部輸入主機和連接埠的環境變數:
export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL
擷取範例應用程式的位址:
echo "http://$GATEWAY_URL_INTERNAL/productpage"
瀏覽至上一個命令輸出中的 URL,並確認未顯示範例應用程式的產品頁面。 或者,您也可以使用 curl
來確認無法存取範例應用程式。 例如:
curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"
使用 kubectl exec
來確認可從叢集的虛擬網路內部存取應用程式:
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS "http://$GATEWAY_URL_INTERNAL/productpage" | grep -o "<title>.*</title>"
確認範例應用程式的產品頁面可供存取。 預期的輸出為:
<title>Simple Bookstore App</title>
輸入閘道服務批注自定義
下列批注可以新增至外部和內部輸入閘道的 Kubernetes 服務:
service.beta.kubernetes.io/azure-load-balancer-internal-subnet
:將內部輸入網關係結至特定子網。service.beta.kubernetes.io/azure-shared-securityrule
:用於透過 增強式安全性規則公開輸入閘道。service.beta.kubernetes.io/azure-allowed-service-tags
:指定輸入 閘道可以接收要求的來源服務標籤 。service.beta.kubernetes.io/azure-load-balancer-ipv4
:用於設定靜態 IPv4 位址。service.beta.kubernetes.io/azure-load-balancer-resource-group
:指定叢集中不同資源群組中公用IP的資源群組。service.beta.kubernetes.io/azure-pip-name
:指定公用IP位址名稱。
刪除資源
若想要清除 Istio 外部或內部輸入閘道,但保留叢集上啟用的網格,請執行下列命令:
az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
如果您想要清除 Istio 服務網格和輸入 (留下叢集),請執行下列命令:
az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
如果您想要清除從 Istio 操作指南文件建立的所有資源,請執行下列命令:
az group delete --name ${RESOURCE_GROUP} --yes --no-wait
下一步
注意
若部署 Istio 輸入閘道或設定輸入流量路由期間發生任何問題,請參閱針對 Istio 附加元件輸入閘道進行疑難排解一文
- Istio 服務網格附加元件的安全輸入閘道 (部分機器翻譯)
- 調整輸入閘道 HPA (部分機器翻譯)