Udostępnij za pośrednictwem


Przekierowanie adresu URL dla bramy aplikacja systemu Azure dla kontenerów — interfejs API bramy

Usługa Application Gateway for Containers umożliwia zwrócenie odpowiedzi przekierowania do klienta na podstawie trzech aspektów adresu URL: protokołu, nazwy hosta i ścieżki. Dla każdego przekierowania może zostać zwrócony zdefiniowany kod stanu HTTP do klienta w celu zdefiniowania charakteru przekierowania.

Szczegóły użycia

Przekierowania adresów URL korzystają z filtru reguły RequestRedirect zdefiniowanego przez interfejs API bramy Kubernetes.

Przekierowania

Przekierowanie ustawia kod stanu odpowiedzi zwracany do klientów, aby zrozumieć przeznaczenie przekierowania. Obsługiwane są następujące typy przekierowań:

  • 301 (Przeniesiono trwale): wskazuje, że zasób docelowy ma przypisany nowy trwały identyfikator URI. Przyszłe odwołania do tego zasobu używają jednego z ujętych identyfikatorów URI. Użyj kodu stanu 301 dla przekierowania HTTP do HTTPS.
  • 302 (Znaleziono): wskazuje, że zasób docelowy jest tymczasowo w innym identyfikatorze URI. Ponieważ przekierowanie może się zmieniać przy okazji, klient powinien nadal używać obowiązującego identyfikatora URI żądania dla przyszłych żądań.

Możliwości przekierowania

  • Przekierowywanie protokołu jest często używane do kierowania klienta do przeniesienia z niezaszyfrowanego schematu ruchu do ruchu, takiego jak przekierowanie HTTP do HTTPS.

  • Przekierowanie nazwy hosta jest zgodne z w pełni kwalifikowaną nazwą domeny (fqdn) żądania. Jest to często obserwowane podczas przekierowywania starej nazwy domeny do nowej nazwy domeny; contoso.com na przykład do fabrikam.com.

  • Przekierowanie ścieżki ma dwa różne warianty: prefix i full.

    • Prefix typ przekierowania spowoduje przekierowanie wszystkich żądań rozpoczynających się od zdefiniowanej wartości. Na przykład: prefiks /shop będzie zgodny /shop i dowolny tekst po. Na przykład /shop, /shop/checkout i /shop/item-a spowoduje przekierowanie do /shop, jak również.
    • Full typ przekierowania odpowiada dokładnej wartości. Na przykład: /shop może przekierować do /store, ale /shop/checkout nie przekierowuje do /store.

Na poniższej ilustracji przedstawiono przykład żądania przeznaczonego do contoso.com/summer-promotion przekierowania do contoso.com/shop/category/5. Ponadto drugie żądanie zainicjowane w celu contoso.com za pośrednictwem protokołu HTTP zwraca przekierowanie w celu zainicjowania nowego połączenia z jego wariantem https.

Diagram przedstawiający usługę Application Gateway dla kontenerów zwracającą adres URL przekierowania do klienta.

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 wdrożyć przykładowy certyfikat TLS, aby zademonstrować możliwości przekierowania.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/ssl-termination/deployment.yaml
    

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

    • przestrzeń nazw o nazwie test-infra
    • jedna usługa wywoływana echo test-infra w przestrzeni nazw
    • jedno wdrożenie wywoływane echo test-infra w przestrzeni nazw
    • jeden wpis tajny wywoływany listener-tls-secret test-infra w przestrzeni nazw

Wdrażanie wymaganych zasobów interfejsu API bramy

  1. Tworzenie bramy

    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: gateway-01
      namespace: test-infra
      annotations:
        alb.networking.azure.io/alb-namespace: alb-test-infra
        alb.networking.azure.io/alb-name: alb-test
    spec:
      gatewayClassName: azure-alb-external
      listeners:
      - name: http-listener
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: Same
      - name: https-listener
        port: 443
        protocol: HTTPS
        allowedRoutes:
          namespaces:
            from: Same
        tls:
          mode: Terminate
          certificateRefs:
          - kind : Secret
            group: ""
            name: listener-tls-secret
    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 zasobu bramy upewnij się, że stan jest prawidłowy, odbiornik jest zaprogramowany, a adres jest przypisany do bramy.

kubectl get gateway gateway-01 -n test-infra -o yaml

Przykładowe dane wyjściowe pomyślnego utworzenia bramy.

status:
  addresses:
  - type: Hostname
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Utwórz zasób HTTPRoute, który contoso.com obsługuje ruch odbierany za pośrednictwem protokołu HTTPS.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-contoso
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: echo
      port: 80
EOF

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

kubectl get httproute rewrite-example -n test-infra -o yaml

Sprawdź, czy zasób usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany dla każdej usługi HTTPRoute.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Po utworzeniu bramy utwórz zasób httpRoute za contoso.com pomocą filtru RequestRedirect, który przekierowuje ruch http do protokołu HTTPS.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-to-https-contoso-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: http-listener
  hostnames:
  - "contoso.com"
  rules:
    - matches:
      filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https
            statusCode: 301
EOF

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

kubectl get httproute rewrite-example -n test-infra -o yaml

Sprawdź, czy zasób usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany dla każdej usługi HTTPRoute.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Utwórz zasób httpRoute, który contoso.com obsługuje przekierowanie dla ścieżki /summer-promotion do określonego adresu URL. Eliminując sekcję SectionName, pokazaną w zasobach http-https httpRoute, ta reguła przekierowania ma zastosowanie zarówno do żądań HTTP, jak i HTTPS.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: summer-promotion-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /summer-promotion
    filters:
      - type: RequestRedirect
        requestRedirect:
          path:
            type: ReplaceFullPath
            replaceFullPath: /shop/category/5
          statusCode: 302
  - backendRefs:
    - name: echo
      port: 80
EOF

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

kubectl get httproute rewrite-example -n test-infra -o yaml

Sprawdź, czy zasób usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany dla każdej usługi HTTPRoute.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Po określeniu wskaźnika nazwy serwera za pomocą polecenia http://contoso.com curl powinna zwrócić odpowiedź z usługi Application Gateway for Containers z nagłówkiem definiującym location przekierowanie 301 do https://contoso.comelementu .

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

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

* Added contoso.com:80:xxx.xxx.xxx.xxx to DNS cache
* Hostname contoso.com was found in DNS cache
*   Trying xxx.xxx.xxx.xxx:80...
* Connected to contoso.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: contoso.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< location: https://contoso.com/
< date: Mon, 26 Feb 2024 22:56:23 GMT
< server: Microsoft-Azure-Application-LB/AGC
< content-length: 0
<
* Connection #0 to host contoso.com left intact

Po określeniu wskaźnika nazwy serwera przy użyciu polecenia curl usługa https://contoso.com/summer-promotion Application Gateway dla kontenerów powinna zwrócić 302 przekierowanie do https://contoso.com/shop/category/5.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v

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

> GET /summer-promotion HTTP/2
> Host: contoso.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 302
< location: https://contoso.com/shop/category/5
< date: Mon, 26 Feb 2024 22:58:43 GMT
< server: Microsoft-Azure-Application-LB/AGC
<
* Connection #0 to host contoso.com left intact

Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i użyto interfejsu API bramy do skonfigurowania zarówno przekierowania HTTP do protokołu HTTPS, jak i przekierowania opartego na ścieżkach do określonych żądań klientów.