Condividi tramite


Servizio Azure Kubernetes esterno o interno in ingresso 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 secondaria 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

Nota

Le personalizzazioni all'indirizzo IP nei gateway interni ed esterni non sono ancora supportate. Le personalizzazioni degli indirizzi IP nelle specifiche di ingresso vengono ripristinate dal componente aggiuntivo Istio. È previsto che queste personalizzazioni vengano consentite nell'implementazione dell'API gateway per il componente aggiuntivo Istio in futuro.

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

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

Dopo aver abilitato il gateway di ingresso, le applicazioni devono essere esposte tramite il gateway e le regole di routing devono essere configurate di conseguenza. 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/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

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>

Personalizzazione dell'annotazione del servizio gateway in ingresso

Le annotazioni seguenti possono essere aggiunte al servizio Kubernetes per i gateway di ingresso esterni e interni:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: per associare un gateway di ingresso interno a una subnet specifica.
  • service.beta.kubernetes.io/azure-shared-securityrule: per esporre il gateway in ingresso tramite una regola di sicurezza aumentata.
  • service.beta.kubernetes.io/azure-allowed-service-tags: per specificare da quale servizio contrassegna il gateway in ingresso può ricevere richieste.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: per la configurazione di un indirizzo IPv4 statico.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: per specificare il gruppo di risorse di un indirizzo IP pubblico in un gruppo di risorse diverso dal cluster.
  • service.beta.kubernetes.io/azure-pip-name: per specificare il nome di un indirizzo IP pubblico.

Eliminare risorse

Se si desidera pulire i gateway di ingresso interni o esterni Istio, ma lasciare abilitata la mesh nel cluster, eseguire il comando seguente:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

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

Nota

In caso di problemi riscontrati con la distribuzione del gateway di ingresso Istio o la configurazione del routing del traffico in ingresso, vedere l'articolo sulla risoluzione dei problemi relativi ai gateway di ingresso del componente aggiuntivo Istio