Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот документ помогает настроить пример приложения, использующего ресурсы из API шлюза для демонстрации размещения нескольких сайтов на одном ресурсе шлюза Kubernetes или интерфейсе шлюза приложений для контейнеров. Предоставлены следующие шаги:
- Создайте ресурс шлюза с одним прослушивателем HTTP.
- Создайте два ресурса HTTPRoute , которые ссылаются на уникальную серверную службу.
Предыстория
Шлюз приложений для контейнеров позволяет размещать многосайтовые сайты, позволяя настраивать несколько веб-приложений на одном порту. Два или более уникальных сайтов могут размещаться с помощью уникальных внутренних служб. См. следующий пример сценария:
Предпосылки
Если вы использовали стратегию развертывания BYO, убедитесь, что вы настроили шлюз приложений для ресурсов контейнеров и контроллер ALB.
Если вы использовали стратегию управляемого развертывания ALB, убедитесь в подготовке контроллера ALB и шлюза приложений для ресурсов контейнеров с помощью настраиваемого ресурса ApplicationLoadBalancer.
Развертывание примера 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 шлюза
- Создание шлюза
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 шлюза в шлюзе приложений для контейнеров.