Udostępnij za pośrednictwem


Ponowne zapisywanie adresów URL dla bramy aplikacja systemu Azure dla kontenerów — interfejs API ruchu przychodzącego

Usługa Application Gateway for Containers umożliwia ponowne zapisywanie adresu URL żądania klienta, w tym nazwy hosta żądań i/lub ścieżki żądań. Gdy usługa Application Gateway dla kontenerów inicjuje żądanie do obiektu docelowego zaplecza, żądanie zawiera nowo przepisany adres URL w celu zainicjowania żądania.

Szczegóły użycia

Ponowne zapisywanie adresów URL korzysta z usługi Application Gateway dla zasobu niestandardowego IngressExtension kontenerów.

Tło

Ponowne zapisywanie adresów URL umożliwia tłumaczenie żądania przychodzącego na inny adres URL po zainicjowaniu do obiektu docelowego zaplecza.

Na poniższej ilustracji przedstawiono żądanie przeznaczone dla contoso.com/shop ponownego pisania do contoso.com/ecommerce po zainicjowaniu żądania do obiektu docelowego zaplecza przez usługę Application Gateway dla kontenerów:

Diagram przedstawiający usługę Application Gateway for Containers ponownie zapisującą adres URL do zaplecza.

Wymagania wstępne

  1. Jeśli wykonasz strategię wdrażania byo, upewnij się, że skonfigurowaliśmy usługę Application Gateway dla zasobów kontenerów i kontroler usługi ALB.
  2. Jeśli wykonasz strategię wdrażania zarządzanego przez usługę ALB, upewnij się, że aprowizujesz kontroler usługi ALB i aprowizujesz zasoby usługi Application Gateway for Containers za pośrednictwem zasobu niestandardowego ApplicationLoadBalancer.
  3. Wdróż przykładową aplikację HTTP:
    Zastosuj następujący plik deployment.yaml w klastrze, aby utworzyć przykładową aplikację internetową w celu zademonstrowania routingu opartego na ścieżkach, zapytaniach i nagłówkach.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml

To polecenie tworzy następujące polecenie w klastrze:

  • Przestrzeń nazw o nazwie test-infra
  • Dwie usługi o nazwie backend-v1 i backend-v2 w test-infra przestrzeni nazw
  • Dwa wdrożenia o nazwie backend-v1 i backend-v2 w test-infra przestrzeni nazw

Wdrażanie wymaganych zasobów interfejsu API ruchu przychodzącego

  1. Tworzenie ruchu przychodzącego, który przechwytuje cały ruch i trasy do zaplecza-v2
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF
  1. Tworzenie ruchu przychodzącego zgodnego z prefiksem /shop, który kieruje do zaplecza-v1
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-02
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-ingress-extension: url-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /shop
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
EOF

Uwaga

Gdy kontroler usługi ALB tworzy bramę Application Gateway dla zasobów kontenerów w usłudze ARM, użyje następującej konwencji nazewnictwa dla zasobu frontonu: fe-8< losowo wygenerowanych znaków>

Jeśli chcesz zmienić nazwę frontonu utworzonego na platformie Azure, rozważ zastosowanie własnej strategii wdrażania.

Po utworzeniu każdego zasobu ruchu przychodzącego upewnij się, że stan jest prawidłowy, odbiornik jest zaprogramowany, a adres jest przypisany do bramy.

kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml

Przykładowe dane wyjściowe jednego z zasobów ruchu przychodzącego.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
  - host: contoso.com
    http:
      paths:
      - backend:
          service:
            name: backend-v2
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

Po utworzeniu ruchu przychodzącego utwórz zasób IngressExtension dla elementu contoso.com. Ten przykład zapewnia zainicjowanie contoso.com/ecommerce ruchu wysyłanego do contoso.com/shop obiektu docelowego zaplecza.

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: url-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
      - type: URLRewrite
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /ecommerce
EOF

Po utworzeniu zasobu IngressExtension upewnij się, że zasób IngressExtension zawiera wartość Zaakceptowane , a zasób Application Gateway for Containers jest zaprogramowany.

kubectl get IngressExtension url-rewrite -n test-infra -o yaml

Sprawdź, czy zasób usługi Application Gateway for Containers został pomyślnie zaktualizowany dla rozszerzenia IngressExtension.

Testowanie dostępu do aplikacji

Teraz możemy wysłać jakiś ruch do naszej przykładowej aplikacji za pośrednictwem nazwy FQDN przypisanej do frontonu. Użyj następującego polecenia, aby uzyskać nazwę FQDN.

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Jeśli określisz wskaźnik contoso.com/shop nazwy serwera przy użyciu polecenia curl, odpowiedź z usługi backend-v1 zostanie zwrócona z żądaną ścieżką do obiektu docelowego zaplecza z wyświetloną wartością contoso.com/ecommerce.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop

W odpowiedzi powinna zostać wyświetlona następująca odpowiedź:

{
 "path": "/ecommerce",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

Jeśli określisz wskaźnik contoso.com nazwy serwera przy użyciu polecenia curl, odpowiedź zostanie zwrócona z usługi backend-v2, jak pokazano.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

Powinna zostać wyświetlona następująca odpowiedź:

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i użyto rozszerzenia IngressExtension do ponownego zapisania żądanego adresu URL klienta przed ustawieniem ruchu docelowego w usłudze Application Gateway for Containers.