Dela via


Distribuera ingressgatewayer för Istio Service Mesh-tillägg för Azure Kubernetes Service

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 att true inaktivera 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