Поделиться через


Размещение нескольких сайтов с помощью шлюза приложений для контейнеров — API шлюза

Этот документ помогает настроить пример приложения, использующего ресурсы из API шлюза для демонстрации размещения нескольких сайтов на одном ресурсе шлюза Kubernetes или интерфейсе шлюза приложений для контейнеров. Предоставлены следующие шаги:

  • Создайте ресурс шлюза с одним прослушивателем HTTP.
  • Создайте два ресурса HTTPRoute , которые ссылаются на уникальную серверную службу.

Предыстория

Шлюз приложений для контейнеров позволяет размещать многосайтовые сайты, позволяя настраивать несколько веб-приложений на одном порту. Два или более уникальных сайтов могут размещаться с помощью уникальных внутренних служб. См. следующий пример сценария:

Рисунок, показывающий многосайтовое размещение с помощью шлюза приложений для контейнеров.

Предпосылки

  1. Если вы использовали стратегию развертывания BYO, убедитесь, что вы настроили шлюз приложений для ресурсов контейнеров и контроллер ALB.

  2. Если вы использовали стратегию управляемого развертывания ALB, убедитесь в подготовке контроллера ALB и шлюза приложений для ресурсов контейнеров с помощью настраиваемого ресурса ApplicationLoadBalancer.

  3. Развертывание примера HTTP-приложения:
    Примените следующий файл deployment.yaml в кластере, чтобы создать пример веб-приложения для демонстрации маршрутизации на основе пути, запроса и заголовка.

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

    Эта команда создает следующее в вашем кластере:

    • Пространство имен с именем test-infra
    • Две службы с названиями backend-v1 и backend-v2 в пространстве имен test-infra.
    • Два развертывания с названиями backend-v1 и backend-v2 в пространстве имен test-infra

Развертывание необходимых ресурсов API шлюза

  1. Создание шлюза
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

Замечание

Когда контроллер ALB создает шлюз приложений для ресурсов контейнеров в Azure Resource Manager, он использует следующее соглашение об именовании для внешнего ресурса: fe-<eight randomly generated characters>

Если вы хотите изменить имя внешнего ресурса, созданного в Azure, рекомендуется использовать стратегию развертывания.

После создания ресурса шлюза убедитесь, что состояние действительно, слушатель запрограммирован, и шлюзу назначен адрес.

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

Пример выходных данных успешного создания шлюза.

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

После создания шлюза создайте два ресурса HTTPRoute для contoso.com доменных имен и fabrikam.com доменных имен. Каждый домен перенаправляет трафик в другую серверную службу.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: contoso-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: backend-v1
      port: 8080
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: fabrikam-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "fabrikam.com"
  rules:
  - backendRefs:
    - name: backend-v2
      port: 8080
EOF

После создания ресурса HTTPRoute убедитесь, что оба ресурса HTTPRoute отображаются как accepted , так и ресурс Шлюза приложений для контейнеров запрограммирован.

kubectl get httproute contoso-route -n test-infra -o yaml
kubectl get httproute fabrikam-route -n test-infra -o yaml

Убедитесь, что состояние ресурса шлюза приложений для контейнеров успешно обновляется для каждого 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

Проверка доступа к приложению.

Теперь мы готовы отправить определённый трафик к нашему примерному приложению через полное доменное имя, назначенное фронтенду. Чтобы получить полное доменное имя, используйте следующую команду.

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Если указать индикатор имени сервера с помощью команды curl, contoso.com для внешнего полного доменного имени он возвращает ответ от серверной службы версии 1.

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

В ответе мы должны увидеть следующее:

{
 "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"
}

Если указать индикатор имени сервера с помощью команды curl, fabrikam.com для внешнего полного доменного имени он возвращает ответ от серверной службы версии 1.

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

В ответе мы должны увидеть следующее:

{
 "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"
}

Поздравляем, вы установили контроллер ALB, развернули серверное приложение и перенаправили трафик в две разные серверные службы с помощью разных имен узлов через API шлюза в шлюзе приложений для контейнеров.