Share via


Externa eller interna ingresser för Azure Kubernetes Service (AKS) för tilläggsdistribution av Istio-tjänstnät

Den här artikeln visar hur du distribuerar externa eller interna ingresser för Istio Service Mesh-tillägg för Azure Kubernetes Service-kluster (AKS).

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

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

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

Program mappas inte till Istio-ingressgatewayen när ingressgatewayen har aktiverats. Använd följande manifest för att mappa exempeldistributionens ingress till Istio-ingressgatewayen:

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

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>

Ta bort resurser

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