Ponowne zapisywanie nagłówka dla bramy aplikacja systemu Azure dla kontenerów — interfejs API ruchu przychodzącego

Usługa Application Gateway for Containers umożliwia ponowne zapisywanie nagłówków HTTP żądań klientów i odpowiedzi z obiektów docelowych zaplecza.

Szczegóły użycia

Ponowne zapisywanie nagłówka korzysta z usługi Application Gateway dla zasobu niestandardowego IngressExtension kontenera.

Tło

Ponowne zapisywanie nagłówków umożliwia modyfikowanie nagłówków żądań i odpowiedzi do i z obiektów docelowych zaplecza.

Na poniższej ilustracji przedstawiono przykład żądania z ponownym zapisem określonego agenta użytkownika do uproszczonej wartości wywoływanej rewritten-user-agent po zainicjowaniu żądania do obiektu docelowego zaplecza przez usługę Application Gateway for Containers:

Diagram przedstawiający usługę Application Gateway for Containers ponownie zapisującą nagłówek żądania 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 wykonano strategię wdrażania zarządzanego usługi ALB, upewnij się, że aprowizowaliśmy kontroler usługi ALB i aprowizowaliśmy 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ą, aby zademonstrować ponowne zapisywanie nagłówka.

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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

Utwórz zasób ruchu przychodzącego, aby nasłuchiwać żądań do contoso.com:

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
    alb.networking.azure.io/alb-ingress-extension: header-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            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 zasobu ruchu przychodzącego upewnij się, że stan zawiera nazwę hosta modułu równoważenia obciążenia i że oba porty nasłuchują żądań.

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

Przykładowe dane wyjściowe pomyślnego utworzenia 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/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/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/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz", "alb.networking.azure.io/alb-ingress-extension":"header-rewrite"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v1","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:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

Po utworzeniu ruchu przychodzącego należy zdefiniować rozszerzenie IngressExtension przy użyciu reguł ponownego zapisywania nagłówka.

W tym przykładzie ustawimy statycznego agenta użytkownika z wartością rewritten-user-agent.

W tym przykładzie pokazano również dodanie nowego nagłówka o nazwie AGC-Header-Add z wartością AGC-value i usunięcie nagłówka żądania o nazwie client-custom-header.

Napiwek

W tym przykładzie, chociaż możemy użyć wartości HTTPHeaderMatch z wartością "Exact" dla dopasowania ciągu, demonstracja jest używana w wyrażeniu regularnym w celu zakłopatrowania dalszych możliwości.

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: header-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
        - type: RequestHeaderModifier
          requestHeaderModifier:
            set:
              - name: "user-agent"
                value: "rewritten-user-agent"
            add:
              - name: "AGC-Header-Add"
                value: "AGC-value"
            remove:
              - "client-custom-header"
EOF

Po utworzeniu zasobu IngressExtension upewnij się, że zasób zwraca wartość Brak błędów walidacji i jest prawidłowy.

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

Sprawdź, czy stan zasobu usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany.

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 nazwy serwera przy użyciu polecenia curl, contoso.com dla nazwy FQDN frontonu zostanie zwrócona odpowiedź z usługi backend-v1.

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": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

Określenie nagłówka user-agent z wartością my-user-agent powinno zwrócić odpowiedź z usługi zaplecza elementu rewritten-user-agent:

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

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

{
 "path": "/",
 "host": "fabrikam.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-v1-5b8fd96959-f59mm"
}

Określenie client-custom-header nagłówka z wartością moo powinno zostać usunięte z żądania, gdy usługa Application Gateway dla kontenerów inicjuje połączenie z usługą zaplecza:

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"

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

{
 "path": "/",
 "host": "fabrikam.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": [
   "kd83nc84-4325-5d22-3d23-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i zmodyfikowano wartości nagłówków za pośrednictwem interfejsu API ruchu przychodzącego w usłudze Application Gateway for Containers.