Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln visar hur du distribuerar externa eller interna ingresser för Istio Service Mesh-tillägget för AkS-kluster (Azure Kubernetes Service).
Kommentar
När du utför en mindre revisionsuppgradering av Istio-tillägget skapas en annan distribution för de externa/interna gatewayerna för den nya revisionen av kontrollplanet.
Förutsättningar
Den här guiden förutsätter att du har följt dokumentationen för att aktivera Istio-tillägget i ett AKS-kluster, distribuera ett exempelprogram och ange miljövariabler.
Aktivera extern ingressgateway
Kommentar
Om du behöver ingress-gatewaypoddarna schemaläggas på specifika noder kan du använda AKS-systemnoder eller nodetiketten azureservicemesh/istio.replica.preferred. Poddarna har nodtillhörighet med en viktad inställning 100 för AKS-systemnoder (märkt kubernetes.azure.com/mode: system) och en viktad inställning 50 för noder märkta azureservicemesh/istio.replica.preferred: true.
Använd az aks mesh enable-ingress-gateway för att aktivera en externt tillgänglig Istio-ingress i aks-klustret:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external
Använd kubectl get svc för att kontrollera tjänsten som är mappad till ingressgatewayen:
kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress
Observera från utdata att tjänstens externa IP-adress är offentligt tillgänglig:
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
Program är inte tillgängliga utanför klustret som standard när du har aktiverat ingressgatewayen. Om du vill göra ett program tillgängligt mappar du exempeldistributionens ingress till Ingress-gatewayen i Istio med hjälp av följande manifest:
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
Kommentar
Väljaren som används i gatewayobjektet pekar istio: aks-istio-ingressgateway-externalpå , som kan hittas som etikett på tjänsten som mappats till den externa ingress som aktiverades tidigare.
Ange miljövariabler för extern inkommande värd och portar:
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
Hämta den externa adressen för exempelprogrammet:
echo "http://$GATEWAY_URL_EXTERNAL/productpage"
Gå till URL:en från utdata från föregående kommando och bekräfta att exempelprogrammets produktsida visas. Du kan också använda curl för att bekräfta att exempelprogrammet är tillgängligt. Till exempel:
curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"
Bekräfta att exempelprogrammets produktsida är tillgänglig. Förväntade utdata är:
<title>Simple Bookstore App</title>
Aktivera intern ingress-gateway
Använd az aks mesh enable-ingress-gateway för att aktivera en intern Istio-ingress i aks-klustret:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal
Använd kubectl get svc för att kontrollera tjänsten som är mappad till ingressgatewayen:
kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress
Observera från utdata att tjänstens externa IP-adress inte är offentligt tillgänglig och i stället endast är lokalt tillgänglig:
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
När du har aktiverat ingressgatewayen måste program exponeras via gatewayen, och routningsregler måste konfigureras i enlighet med detta. Använd följande manifest för att mappa exempeldistributionens ingress till Istio-ingressgatewayen:
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
Kommentar
Väljaren som används i gatewayobjektet pekar istio: aks-istio-ingressgateway-internalpå , som kan hittas som etikett på tjänsten som mappats till den interna ingress som aktiverades tidigare.
Ange miljövariabler för intern inkommande värd och portar:
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
Hämta exempelprogrammets adress:
echo "http://$GATEWAY_URL_INTERNAL/productpage"
Gå till URL:en från utdata från föregående kommando och bekräfta att exempelprogrammets produktsida INTE visas. Du kan också använda curl för att bekräfta att exempelprogrammet inte är tillgängligt. Till exempel:
curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"
Använd kubectl exec för att bekräfta att programmet är tillgängligt inifrån klustrets virtuella nätverk:
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>"
Bekräfta att exempelprogrammets produktsida är tillgänglig. Förväntade utdata är:
<title>Simple Bookstore App</title>
Anpassningar av ingressgatewaytjänsten
Anteckningar
Följande anteckningar kan läggas till i Kubernetes-tjänsten för externa och interna ingressgatewayer:
-
external-dns.alpha.kubernetes.io/hostname: för att ange domänen för resursens DNS-poster. Mer information finns i external-dns. -
service.beta.kubernetes.io/azure-allowed-ip-ranges: för att ange en lista över tillåtna IP-intervall avgränsade med kommatecken. -
service.beta.kubernetes.io/azure-allowed-service-tags: för att ange vilken tjänst som taggar ingressgatewayen kan ta emot begäranden från. -
service.beta.kubernetes.io/azure-disable-load-balancer-floating-ip: inställd på för atttrueinaktivera flytande IP-adress i lastbalanserarens regel. -
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: namnet på undernätet som den interna ingressgatewayen ska bindas till. Det här undernätet måste finnas i samma virtuella nätverk som nätet. -
service.beta.kubernetes.io/azure-load-balancer-ipv4: för att konfigurera en statisk IPv4-adress. -
service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset: för att kontrollera om Azure Load Balancer aktiverar TCP-återställning. -
service.beta.kubernetes.io/azure-load-balancer-resource-group: för att ange resursgruppen för en offentlig IP-adress i en annan resursgrupp än klustret. -
service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: för att konfigurera tidsgränsen för TCP-inaktivitet i minuter för anslutningar via Azure Load Balancer. -
service.beta.kubernetes.io/azure-pip-ip-tags: för att ange en lista över IpTags avgränsade med kommatecken. -
service.beta.kubernetes.io/azure-pip-name: för att ange namnet på en offentlig IP-adress. -
service.beta.kubernetes.io/azure-shared-securityrule: för att exponera ingressgatewayen via en förhöjd säkerhetsregel.
Tillägget stöder hälsosondanteckningar för portarna 80 och 443. Läs mer om användningen av portar här.
Policy för extern trafik
Tillägget stöder anpassning av .spec.externalTrafficPolicy i Kubernetes-tjänsten för ingressgatewayen. Inställning av .spec.externalTrafficPolicy till Local bevarar klientens käll-IP vid Istio-ingress-gateway och undviker ett andra hopp i trafikvägen till backend-ingress-gateway-pods.
kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'
Kommentar
Att ändra .spec.externalTrafficPolicy till Local riskerar potentiellt obalanserad trafikspridning. Innan du tillämpar den här ändringen rekommenderar vi att du läser Kubernetes-dokumenten för att förstå kompromisserna mellan de olika externalTrafficPolicy inställningarna.
Ta bort resurser
Om du vill rensa de externa eller interna ingressgatewayerna i Istio, men låta nätet vara aktiverat i klustret, kör du följande kommando:
az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Om du vill rensa Istio-tjänstnätet och ingresserna (lämnar kvar klustret) kör du följande kommando:
az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Om du vill rensa alla resurser som skapats från instruktionsdokumenten för Istio kör du följande kommando:
az group delete --name ${RESOURCE_GROUP} --yes --no-wait
Nästa steg
Kommentar
Om det uppstår problem med att driftsätta Istio-ingressgateway eller konfigurera ingress-trafikroutning kan du läsa artikeln om felsökning av ingressgatewayer för Istio-tillägg
Azure Kubernetes Service