Share via


適用於 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

根據預設,在啟用輸入閘道之後,就無法從叢集外部存取應用程式。 若要讓應用程式可供存取,請使用下列資訊清單,將範例部署的輸入對應至 Istio 輸入閘道:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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 輸入閘道。 使用下列資訊清單,將範例部署的輸入對應至 Istio 輸入閘道:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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>

刪除資源

如果您想要清除 Istio 服務網格和輸入 (留下叢集),請執行下列命令:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

如果您想要清除從 Istio 操作指南文件建立的所有資源,請執行下列命令:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

下一步