Dela via


Konfigurera Istio-ingress med Kubernetes Gateway-API:et – förhandsversion

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och frivillig registrering. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. AKS-förhandsversioner stöds delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Utöver Istios egna API för hantering av inkommande trafik stöder tillägget Istio Service Mesh även Kubernetes Gateway-API:et för hantering av inkommande trafik. För att kunna få stöd från API-baserade distributioner i Azure for Gateway med Istio-tillägget måste du ha API-installationen för Managed Gateway aktiverad i klustret. Du kan använda både den automatiserade distributionsmodellen för Istio Gateway API eller den manuella distributionsmodellen för hantering av inkommande trafik. Anpassningar av ConfigMap måste ligga under listan över tillåtna resursanpassningar.

Begränsningar

Förutsättningar

Konfigurera ingress med en Kubernetes Gateway

Distribuera exempelprogram

Distribuera först exempelprogrammet httpbin i default namnområdet:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.26/samples/httpbin/httpbin.yaml

Skapa Kubernetes Gateway och HTTPRoute

Distribuera sedan en gateway-API-konfiguration i default-namnrymden med gatewayClassName satt till istio.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  gatewayClassName: istio
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http
  namespace: default
spec:
  parentRefs:
  - name: httpbin-gateway
  hostnames: ["httpbin.example.com"]
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /get
    backendRefs:
    - name: httpbin
      port: 8000
EOF

Anmärkning

Exemplet ovan skapar en extern ingress load balancer-tjänst som är tillgänglig utanför klustret. Du kan lägga till anteckningar för att skapa en intern lastbalanserare och anpassa andra inställningar för lastbalanserare.

Anmärkning

Om du utför en mindre revisionsuppgradering och har två Istio-tilläggsrevisioner installerade på klustret samtidigt, kommer som standard kontrollplanet för den högre revisionen att ta ägarskap av Gateways. Du kan lägga till istio.io/rev etiketten i Gateway för att styra vilken kontrollplansrevision som äger den. Om du lägger till revisionsetiketten kontrollerar du att du uppdaterar den enligt lämplig kontrollplansrevision innan du återställer eller slutför uppgraderingen.

Kontrollera att en Deployment, Service, HorizontalPodAutoscaleroch PodDisruptionBudget skapas för httpbin-gateway:

kubectl get deployment httpbin-gateway-istio
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
httpbin-gateway-istio   2/2     2            2           31m
kubectl get service httpbin-gateway-istio
NAME                    TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)                        AGE
httpbin-gateway-istio   LoadBalancer   10.0.65.45   <external-ip>    15021:32053/TCP,80:31587/TCP   33m
kubectl get hpa httpbin-gateway-istio
NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   2         5         3          34m
kubectl get pdb httpbin-gateway-istio
NAME                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
httpbin-gateway-istio   1               N/A               2                     36m

Du kan konfigurera dessa resursinställningar genom att GatewayClass ändra standardinställningarna för ConfigMap eller genom att koppla en ConfigMap till en specifik Gateway.

Skicka begäran till exempelapplikationen

Försök slutligen skicka en curl begäran till programmet httpbin . INGRESS_HOST Ange först miljövariabeln:

kubectl wait --for=condition=programmed gateways.gateway.networking.k8s.io httpbin-gateway
export INGRESS_HOST=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -ojsonpath='{.status.addresses[0].value}')

Försök sedan skicka en HTTP-begäran till httpbin:

curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/get"

Du bör se ett HTTP 200 svar.

Skydda Istio-inkommande trafik med Kubernetes Gateway-API:et

Istio-tillägget stöder synkronisering av sekretessdata från Azure Key Vault (AKV) för att skydda ingående trafik baserad på Gateway API med TLS-avslutning (Transport Layer Security) eller SNI-genomströmning (Server Name Indication). Du kan följa dokumentet om säker ingressgateway för att synkronisera sekretessdata från AKV till ditt AKS-kluster med hjälp av AKV Secrets Store Container Storage Interface (CSI) Driver-tillägget.

Resursanpassningar

Anpassningar av anteckningar

Du kan lägga till anteckningar under spec.infrastructure.annotations för att konfigurera inställningarna för lastbalanseraren för Gateway. Om du till exempel vill skapa en intern lastbalanserare som är kopplad till ett specifikt undernät kan du skapa en Gateway med följande anteckningar:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  gatewayClassName: istio
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
  infrastructure:
    annotations: 
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "my-subnet"
EOF

Anpassningar av ConfigMap

Istio-tillägget stöder också anpassningar av de resurser som genereras för Gateways, nämligen:

  • Tjänster
  • Driftsättning
  • Horizontal Pod Autoscaler (HPA)
  • Budget för avbrott för poddar (PDB)

Standardinställningarna för dessa resurser anges i istio-gateway-class-defaults ConfigMap i aks-istio-system namnområdet. Denna ConfigMap måste ha gateway.istio.io/defaults-for-class-etiketten inställd till istio för att anpassningarna ska börja gälla för alla Gateways med spec.gatewayClassName: istio. GatewayClass-nivå ConfigMap installeras som default i namnområdet aks-istio-system när Managed Gateway API-installation är aktiverad. Det kan ta upp till ~5 minuter innan istio-gateway-class-defaults ConfigMap distribueras efter att CRD:erna för Managed Gateway-API:erna har installerats.

kubectl get configmap istio-gateway-class-defaults -n aks-istio-system -o yaml
...
data:
  horizontalPodAutoscaler: |
    spec:
      minReplicas: 2
      maxReplicas: 5
  podDisruptionBudget: |
    spec:
      minAvailable: 1
...

Som beskrivs i de efterföljande avsnitten kan du ändra de här inställningarna för alla Istio Gateways på en GatewayClass nivå genom att uppdatera istio-gateway-class-defaults ConfigMap, eller så kan du ange dem för enskilda Gateway resurser. För både GatewayClass-nivå och Gateway-nivå ConfigMaps måste fälten vara vitlistade för den angivna resursen. Om det finns anpassningar både för GatewayClass och en enskild Gateway, har konfigurationen på Gateway-nivå företräde.

Tillåtlista för resursanpassning

Fält som inte finns på listan över tillåtna för resursen tillåts inte och blockeras via tilläggshanterade webhooks. Se policyn för Istio-tilläggsstöd för mer information, allowed, blocked, supported och funktioner.

Distributionsfält

Fältsökväg Description
metadata.labels Distributionsetiketter
metadata.annotations Distributionsanteckningar
spec.replicas Antal distributionsrepliker
spec.template.metadata.labels Poddetiketter
spec.template.metadata.annotations Poddanteckningar
spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms Nodtillhörighet
spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution Nodtillhörighet
spec.template.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution Pod-affinitet
spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution Pod-affinitet
spec.template.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution Poddskyddstillhörighet
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution Poddskyddstillhörighet
spec.template.spec.containers.resizePolicy Användning av containerresurser
spec.template.spec.containers.resources.limits Användning av containerresurser
spec.template.spec.containers.resources.requests Användning av containerresurser
spec.template.spec.containers.stdin Felsökning av containrar
spec.template.spec.containers.stdinOnce Felsökning av containrar
spec.template.spec.nodeSelector Poddschemaläggning
spec.template.spec.nodeName Poddschemaläggning
spec.template.spec.tolerations Poddschemaläggning
spec.template.spec.topologySpreadConstraints Poddschemaläggning

Tjänstfält

Fältsökväg Description
metadata.labels Tjänstetiketter
metadata.annotations Tjänstanteckningar
spec.type Typ av tjänst
spec.loadBalancerSourceRanges Inställningar för tjänstlastbalanserare
spec.loadBalancerClass Inställningar för tjänstlastbalanserare
spec.externalTrafficPolicy Tjänsttrafikprincip
spec.internalTrafficPolicy Tjänsttrafikprincip

HPA-fält (HorizontalPodAutoscaler)

Fältsökväg Description
metadata.labels HPA-etiketter
metadata.annotations HPA-anteckningar
spec.behavior.scaleUp.stabilizationWindowSeconds HPA:s skalningsbeteende
spec.behavior.scaleUp.selectPolicy HPA:s skalningsbeteende
spec.behavior.scaleUp.policies HPA:s skalningsbeteende
spec.behavior.scaleDown.stabilizationWindowSeconds HPA-nedskalningsbeteende
spec.behavior.scaleDown.selectPolicy HPA-nedskalningsbeteende
spec.behavior.scaleDown.policies HPA-nedskalningsbeteende
spec.metrics HPA-skalningsresursmått
spec.minReplicas HPA minimalt antal repliker. Får inte vara under 2.
spec.maxReplicas Maximalt antal HPA-repliker

PodDisruptionBudget-fält (PDB)

Fältsökväg Description
metadata.labels PDB-etiketter
metadata.annotations PDB-anteckningar
spec.minAvailable Lägsta tillgänglighet för PDB
spec.unhealthyPodEvictionPolicy PDB-eviktionspolicy

Anmärkning

Om PDB du ändrar principen för lägsta tillgänglighet och borttagning kan det leda till potentiella fel vid uppgradering och borttagning av kluster/noder. Följ felsökningsguiden för PDB för att åtgärda UpgradeFailed-fel på grund av PDB borttagningsfel.

Konfigurera inställningar på GatewayClass-nivå

Uppdatera ConfigMap på GatewayClass-nivå i aks-istio-system namnrymden:

kubectl edit cm istio-gateway-class-defaults -n aks-istio-system

Redigera resursinställningarna:

...
data:
  deployment: |
    metadata:
      labels:
        test.azureservicemesh.io/deployment-config: "updated"
  horizontalPodAutoscaler: |
    spec:
      minReplicas: 3
      maxReplicas: 6
  podDisruptionBudget: |
    spec:
      minAvailable: 1
...

Anmärkning

Endast en ConfigMap per GatewayClass tillåts.

Nu bör du se att den HPA för httpbin-gateway som du skapade tidigare har blivit uppdaterad.

kubectl get hpa httpbin-gateway-istio
NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   3         6         3          36m

Kontrollera också att Deployment är uppdaterad med den nya etiketten:

kubectl get deployment httpbin-gateway-istio -ojsonpath='{.metadata.labels.test\.azureservicemesh\.io\/deployment-config}'
updated

Konfigurera inställningar för en specifik gateway

Skapa en ConfigMap med resursanpassningar för httpbinGateway:

kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: gw-options
data:
  horizontalPodAutoscaler: |
    spec:
      minReplicas: 2
      maxReplicas: 4
  deployment: |
    metadata:
      labels:
        test.azureservicemesh.io/deployment-config: "updated-per-gateway"
EOF

Uppdatera httpbinGateway för att referera till ConfigMap:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  gatewayClassName: istio
  infrastructure:
    parametersRef:
      group: ""
      kind: ConfigMap
      name: gw-options
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

Kontrollera att HPA har uppdaterats med de nya min/max-värdena. Om du också har konfigurerat GatewayClass-nivå ConfigMap, bör Gateway-nivåinställningarna ha företräde:

kubectl get hpa httpbin-gateway-istio
NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   2         4         2          4h14m

Kontrollera även etiketterna Deployment för att se till att test.azureservicemesh.io/deployment-config uppdateras till det nya värdet:

kubectl get deployment httpbin-gateway-istio -ojsonpath='{.metadata.labels.test\.azureservicemesh\.io\/deployment-config}'
updated-per-gateway

Nästa steg