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
Azure Kubernetes Service