Share via


servizio Azure Kubernetes (servizio Azure Kubernetes) esterno o interno per la distribuzione del componente aggiuntivo Mesh del servizio Istio

Questo articolo illustra come distribuire ingresso esterno o interno per il componente aggiuntivo Mesh del servizio Istio per il cluster del servizio Azure Kubernetes.

Nota

Quando si esegue un aggiornamento di revisione secondario del componente aggiuntivo Istio, verrà creata un'altra distribuzione per i gateway esterni/interni per la nuova revisione del piano di controllo.

Prerequisiti

Questa guida presuppone che sia stata seguita la documentazione per abilitare il componente aggiuntivo Istio in un cluster del servizio Azure Kubernetes, distribuire un'applicazione di esempio e impostare le variabili di ambiente.

Abilitare il gateway di ingresso esterno

Usare az aks mesh enable-ingress-gateway per abilitare un ingresso Istio accessibile esternamente nel cluster del servizio Azure Kubernetes:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

Usare kubectl get svc per controllare il servizio mappato al gateway di ingresso:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

Osservare dall'output che l'indirizzo IP esterno del servizio è accessibile pubblicamente:

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

Le applicazioni non sono accessibili dall'esterno del cluster per impostazione predefinita dopo aver abilitato il gateway di ingresso. Per rendere accessibile un'applicazione, eseguire il mapping del traffico in ingresso della distribuzione di esempio al gateway di ingresso Istio usando il manifesto seguente:

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

Nota

Il selettore usato nell'oggetto Gateway punta a istio: aks-istio-ingressgateway-external, che può essere trovato come etichetta nel servizio mappato al traffico in ingresso esterno abilitato in precedenza.

Impostare le variabili di ambiente per l'host e le porte in ingresso esterni:

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

Recuperare l'indirizzo esterno dell'applicazione di esempio:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Passare all'URL dall'output del comando precedente e verificare che venga visualizzata la pagina del prodotto dell'applicazione di esempio. In alternativa, è anche possibile usare curl per verificare che l'applicazione di esempio sia accessibile. Ad esempio:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

Verificare che la pagina del prodotto dell'applicazione di esempio sia accessibile. L'output previsto è il seguente:

<title>Simple Bookstore App</title>

Abilitare il gateway di ingresso interno

Usare az aks mesh enable-ingress-gateway per abilitare un ingresso Istio interno nel cluster del servizio Azure Kubernetes:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

Usare kubectl get svc per controllare il servizio mappato al gateway di ingresso:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

Osservare dall'output che l'indirizzo IP esterno del servizio non è accessibile pubblicamente ed è invece accessibile solo in locale:

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

Le applicazioni non vengono mappate al gateway di ingresso Istio dopo aver abilitato il gateway di ingresso. Usare il manifesto seguente per eseguire il mapping dell'ingresso della distribuzione di esempio al gateway di ingresso 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

Nota

Il selettore usato nell'oggetto Gateway punta a istio: aks-istio-ingressgateway-internal, che può essere trovato come etichetta nel servizio mappato al traffico in ingresso interno abilitato in precedenza.

Impostare le variabili di ambiente per l'host e le porte di ingresso interni:

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

Recuperare l'indirizzo dell'applicazione di esempio:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Passare all'URL dall'output del comando precedente e verificare che la pagina del prodotto dell'applicazione di esempio NON sia visualizzata. In alternativa, è anche possibile usare curl per verificare che l'applicazione di esempio NONsia accessibile. Ad esempio:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

Usare kubectl exec per verificare che l'applicazione sia accessibile dall'interno della rete virtuale del cluster:

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>"

Verificare che la pagina del prodotto dell'applicazione di esempio sia accessibile. L'output previsto è il seguente:

<title>Simple Bookstore App</title>

Eliminare risorse

Se si vuole pulire la mesh del servizio Istio e i dati in ingresso (lasciando il cluster), eseguire il comando seguente:

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

Se si desidera pulire tutte le risorse create dai documenti di istruzioni di Istio, eseguire il comando seguente:

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

Passaggi successivi