Hostowanie wielu witryn za pomocą usługi Application Gateway dla kontenerów — interfejs API ruchu przychodzącego

Ten dokument ułatwia skonfigurowanie przykładowej aplikacji korzystającej z interfejsu API ruchu przychodzącego do zademonstrowania hostowania wielu witryn w tym samym zasobie ruchu przychodzącego Kubernetes / frontonu usługi Application Gateway for Containers. Dostępne są następujące kroki:

Tło

Usługa Application Gateway dla kontenerów umożliwia hostowanie wielu witryn, umożliwiając skonfigurowanie więcej niż jednej aplikacji internetowej na tym samym porcie. Co najmniej dwie unikatowe witryny mogą być hostowane przy użyciu unikatowych usług zaplecza. Zobacz następujący przykładowy scenariusz:

A diagram showing multisite hosting with Application Gateway for Containers.

Wymagania wstępne

  1. Jeśli użyto strategii 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 użyto strategii wdrażania zarządzanego usługi ALB, upewnij się, że aprowizowanie zasobów kontrolera usługi ALB i 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://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 wymaganego zasobu ruchu przychodzącego

  1. Tworzenie ruchu przychodzącego
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-v1
                port:
                  number: 8080
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF

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"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"example.com","http":{"paths":[{"backend":{"service":{"name":"echo","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}],"tls":[{"hosts":["example.com"],"secretName":"listener-tls-secret"}]}}
  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
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

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}'')

Następnie określ wskaźnik nazwy serwera przy użyciu polecenia curl, contoso.com aby nazwa FQDN frontonu powinna zwrócić 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"
}

Następnie określ wskaźnik nazwy serwera przy użyciu polecenia curl, fabrikam.com aby nazwa FQDN frontonu powinna zwrócić odpowiedź z usługi backend-v1.

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

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-v2-594bd59865-ppv9w"
}

Gratulacje, kontroler usługi ALB został zainstalowany, wdrożono aplikację zaplecza i przekierowano ruch do dwóch różnych usług zaplecza przy użyciu różnych nazw hostów z interfejsem API ruchu przychodzącego w usłudze Application Gateway for Containers.