Ponowne zapisywanie adresów URL dla bramy aplikacja systemu Azure dla kontenerów — interfejs API bramy

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 filtrów zdefiniowanych przez interfejs API bramy Kubernetes.

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 przykład żądania przeznaczonego do contoso.com/shop przepisania do contoso.com/ecommerce. Żądanie jest inicjowane do obiektu docelowego zaplecza przez usługę Application Gateway dla kontenerów:

A diagram showing the Application Gateway for Containers rewriting a URL to the backend.

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. Wdrażanie przykładowej aplikacji 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 kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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 echotest-infra w przestrzeni nazw
    • Jedno wdrożenie o nazwie echo w test-infra przestrzeni nazw
    • Jeden wpis tajny wywoływany listener-tls-secrettest-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
    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

Po utworzeniu bramy utwórz zasób HTTPRoute dla usługi 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: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rewrite-example
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "contoso.com"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /shop
      filters:
        - type: URLRewrite
          urlRewrite:
            path:
              type: ReplacePrefixMatch
              replacePrefixMatch: /ecommerce
      backendRefs:
        - name: backend-v1
          port: 8080
    - backendRefs:
        - name: backend-v2
          port: 8080
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 contoso.com/shop curl powinien zwrócić odpowiedź z usługi backend-v1 z żądaną ścieżką do obiektu docelowego zaplecza z wyświetlonym 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"
}

Po określeniu wskaźnika nazwy serwera przy użyciu polecenia contoso.com curl powinien zwrócić odpowiedź z usługi backend-v2.

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

W odpowiedzi 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 filtrowania w celu ponownego zapisania żądanego adresu URL klienta przed ustawieniem ruchu docelowego w usłudze Application Gateway for Containers.