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


Заметки для контроллера объекта ingress Шлюза приложений

Вы можете замечать ресурс входящего трафика Kubernetes с произвольными парами ключей и значений. Шлюз приложений контроллер входящего трафика (AGIC) полагается на заметки для программных Шлюз приложений Azure функций, которые не настраиваются с помощью yamL входящего трафика. Заметки входящего трафика применяются ко всем параметрам HTTP, серверным пулам и прослушивателям, производным от ресурса входящего трафика.

Список поддерживаемых заметок

Чтобы группа доступности наблюдала за ресурсом входящего трафика, ресурс должен быть аннотирован с kubernetes.io/ingress.class: azure/application-gateway.

Ключ заметки Тип значения Default value Допустимые значения
appgw.ingress.kubernetes.io/backend-path-prefix string nil
appgw.ingress.kubernetes.io/backend-hostname string nil
appgw.ingress.kubernetes.io/health-probe-hostname string 127.0.0.1
appgw.ingress.kubernetes.io/health-probe-port int32 80
appgw.ingress.kubernetes.io/health-probe-path string /
appgw.ingress.kubernetes.io/health-probe-status-code string 200-399
appgw.ingress.kubernetes.io/health-probe-interval int32 30 (секунд)
appgw.ingress.kubernetes.io/health-probe-timeout int32 30 (секунд)
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold int32 3
appgw.ingress.kubernetes.io/ssl-redirect bool false
appgw.ingress.kubernetes.io/connection-draining bool false
appgw.ingress.kubernetes.io/connection-draining-timeout int32 (секунд) 30
appgw.ingress.kubernetes.io/use-private-ip bool false
appgw.ingress.kubernetes.io/override-frontend-port bool false
appgw.ingress.kubernetes.io/cookie-based-affinity bool false
appgw.ingress.kubernetes.io/request-timeout int32 (секунд) 30
appgw.ingress.kubernetes.io/use-private-ip bool false
appgw.ingress.kubernetes.io/backend-protocol string http http, https
appgw.ingress.kubernetes.io/hostname-extension string nil
appgw.ingress.kubernetes.io/waf-policy-for-path string nil
appgw.ingress.kubernetes.io/appgw-ssl-certificate string nil
appgw.ingress.kubernetes.io/appgw-ssl-profile string nil
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate string nil
appgw.ingress.kubernetes.io/rewrite-rule-set string nil
appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource
appgw.ingress.kubernetes.io/rule-priority int32 nil

Префикс пути к серверной части

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

Использование

appgw.ingress.kubernetes.io/backend-path-prefix: <path prefix>

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-bkprefix
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/test/"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

В предыдущем примере определяется ресурс входящего трафика с именем go-server-ingress-bkprefix appgw.ingress.kubernetes.io/backend-path-prefix: "/test/"заметки. Примечания сообщает Шлюз приложений создать параметр HTTP, имеющий префикс пути, переопределенный для пути /hello /test/.

В примере определяется только одно правило. Однако заметки применяются ко всему ресурсу входящего трафика. Поэтому при определении нескольких правил необходимо настроить префикс внутреннего пути для каждого из указанных путей. Если требуется разные правила с различными префиксами пути (даже для одной службы), необходимо определить различные ресурсы входящего трафика.

Имя узла серверной части

Используйте следующую заметку, чтобы указать имя узла, которое Шлюз приложений следует использовать при разговоре с модулями pod.

Использование

appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        backend:
          service:
            name: store-service
            port:
              number: 80
        pathType: Exact

Настраиваемая проба работоспособности

Вы можете настроить Шлюз приложений для отправки пользовательских проб работоспособности в серверный пул адресов. При наличии приведенных ниже заметок контроллер входящего трафика Kubernetes создает пользовательскую пробу для мониторинга серверного приложения. Затем контроллер применяет изменения к Шлюз приложений.

  • health-probe-hostname: эта заметка разрешает пользовательское имя узла в пробе работоспособности.
  • health-probe-port: эта заметка настраивает пользовательский порт для пробы работоспособности.
  • health-probe-path: эта заметка определяет путь для пробы работоспособности.
  • health-probe-status-code: эта заметка позволяет пробе работоспособности принимать различные коды состояния HTTP.
  • health-probe-interval: эта заметка определяет интервал, с помощью которого выполняется проба работоспособности.
  • health-probe-timeout: эта заметка определяет время ожидания пробы работоспособности до сбоя пробы работоспособности.
  • health-probe-unhealthy-threshold: эта заметка определяет, сколько проб работоспособности должно завершиться ошибкой, чтобы серверная часть была помечена как неработоспособная.

Использование

appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
appgw.ingress.kubernetes.io/health-probe-port: 80
appgw.ingress.kubernetes.io/health-probe-path: "/"
appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
appgw.ingress.kubernetes.io/health-probe-interval: 30
appgw.ingress.kubernetes.io/health-probe-timeout: 30
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
    appgw.ingress.kubernetes.io/health-probe-port: 81
    appgw.ingress.kubernetes.io/health-probe-path: "/probepath"
    appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
    appgw.ingress.kubernetes.io/health-probe-interval: 31
    appgw.ingress.kubernetes.io/health-probe-timeout: 31
    appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Перенаправление TLS

Вы можете настроить Шлюз приложений для автоматического перенаправления URL-адресов HTTP на своих коллег HTTPS. При наличии этой заметки и правильной настройке TLS контроллер входящего трафика Kubernetes создает правило маршрутизации с конфигурацией перенаправления. Затем контроллер применяет изменения к экземпляру Шлюз приложений. Созданное перенаправление — HTTP 301 Moved Permanently.

Использование

appgw.ingress.kubernetes.io/ssl-redirect: "true"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-redirect
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
   - hosts:
     - www.contoso.com
     secretName: testsecret-tls
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Сток подключений

Используйте следующие заметки, если вы хотите использовать очистку подключений:

  • connection-draining: эта заметка указывает, следует ли включить очистку подключений.
  • connection-draining-timeout: эта заметка указывает время ожидания, после которого Шлюз приложений завершает запросы к осушившей серверной конечной точке.

Использование

appgw.ingress.kubernetes.io/connection-draining: "true"
appgw.ingress.kubernetes.io/connection-draining-timeout: "60"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-drain
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/connection-draining: "true"
    appgw.ingress.kubernetes.io/connection-draining-timeout: "60"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Используйте следующую заметку, чтобы включить сходство на основе файлов cookie.

Использование

appgw.ingress.kubernetes.io/cookie-based-affinity: "true"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-affinity
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/cookie-based-affinity: "true"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Истекло время ожидания запроса

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

Использование

appgw.ingress.kubernetes.io/request-timeout: "20"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/request-timeout: "20"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Использование частного IP-адреса

Используйте следующую заметку, чтобы указать, следует ли предоставлять эту конечную точку на частном IP-адресе Шлюз приложений.

Для экземпляра Шлюз приложений, который не имеет частного IP-адреса, входящий appgw.ingress.kubernetes.io/use-private-ip: "true" трафик игнорируется. Журналы контроллера и события входящего трафика для этих входящего трафика отображают NoPrivateIP предупреждение.

Использование

appgw.ingress.kubernetes.io/use-private-ip: "true"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-privateip
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/use-private-ip: "true"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Переопределение внешнего порта

Используйте следующую заметку, чтобы настроить внешний прослушиватель для использования портов, отличных от 80 для HTTP и 443 для HTTPS.

Если порт находится в пределах Шлюз приложений авторизованного диапазона (от 1 до 64999), прослушиватель создается на этом конкретном порту. Если в заметке задан недопустимый порт или нет порта, конфигурация использует значение по умолчанию 80 или 443.

Использование

appgw.ingress.kubernetes.io/override-frontend-port: "port"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-overridefrontendport
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/override-frontend-port: "8080"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        backend:
          service:
            name: store-service
            port:
              number: 80
        pathType: Exact

Примечание.

Внешние запросы должны быть целевыми http://somehost:8080 вместо http://somehost.

Серверный протокол

Используйте следующую команду, чтобы указать протокол, который Шлюз приложений должен использоваться при обмене данными с модулями pod. Поддерживаются протоколы HTTP и HTTPS.

Хотя самозаверяющий сертификат поддерживается в Шлюз приложений, AGIC в настоящее время поддерживает HTTPS только в том случае, если модули pod используют сертификат, подписанный хорошо известным центром сертификации.

Не используйте порт 80 с HTTPS и портом 443 с HTTP на модулях pod.

Использование

appgw.ingress.kubernetes.io/backend-protocol: "https"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-protocol: "https"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 443

Расширение имени узла

Вы можете настроить Шлюз приложений для принятия нескольких имен узлов. Используйте заметку hostname-extension для определения нескольких имен узлов, включая подстановочные имена узлов. Это действие добавляет имена узлов в полное доменное имя, определенное в сведениях о входящего spec.rules.host трафика на интерфейсном прослушивателе, поэтому он настроен в качестве многосайтового прослушивателя.

Использование

appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-multisite
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"
spec:
  rules:
  - host: contoso.com
    http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 443

В предыдущем примере прослушиватель настраивает прием трафика для имен hostname1.contoso.com узлов и hostname2.contoso.com.

Политика WAF для пути

Используйте следующую заметку, чтобы подключить существующую политику брандмауэра веб-приложения (WAF) к путям списка для узла в ресурсе входящего трафика Kubernetes, который заносится в заметки. Политика WAF применяется как к URL-адресам, так /ad-server и /auth к URL-адресам.

Использование

appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/aaaa0000-bb11-2222-33cc-444444dddddd/resourceGroups/SampleRG/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/AGICWAFPolcy"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ad-server-ingress
  namespace: commerce
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/abcd/resourceGroups/rg/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/adserver"
spec:
  rules:
  - http:
      paths:
      - path: /ad-server
        backend:
          service:
            name: ad-server
            port:
              number: 80
        pathType: Exact
      - path: /auth
        backend:
          service:
            name: auth-server
            port:
              number: 80
        pathType: Exact

SSL-сертификат Шлюз приложений

Ssl-сертификат можно настроить для Шлюз приложений из локального файла сертификата PFX или ссылки на неверизованный секретный идентификатор Azure Key Vault. Если заметка присутствует с именем сертификата и сертификат предварительно установлен в Шлюз приложений, контроллер входящего трафика Kubernetes создает правило маршрутизации с прослушивателем HTTPS и применяет изменения к экземпляру Шлюз приложений. Вы также можете использовать заметку appgw-ssl-certificate вместе с заметкой ssl-redirect в случае перенаправления SSL.

Примечание.

appgw-ssl-certificate Заметка игнорируется, если спецификация TLS определена входящего трафика одновременно. Если требуется разные сертификаты с разными узлами (завершение нескольких сертификатов TLS), необходимо определить различные ресурсы входящего трафика.

Использование

appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

профиль SSL Шлюз приложений

Профиль SSL можно настроить на экземпляре Шлюз приложений на прослушиватель. Когда заметка присутствует с именем профиля и профиль предварительно установлен в Шлюз приложений, контроллер входящего трафика Kubernetes создает правило маршрутизации с прослушивателем HTTPS и применяет изменения к экземпляру Шлюз приложений.

Использование

appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
    appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Шлюз приложений доверенный корневой сертификат

Теперь вы можете настроить собственные корневые сертификаты, чтобы Шлюз приложений быть доверенными с помощью AGIC. Вы можете использовать заметку appgw-trusted-root-certificate вместе с заметкой backend-protocol , чтобы указать сквозное шифрование SSL. Если указать несколько корневых сертификатов, разделите их запятыми; например, name-of-my-root-cert1,name-of-my-root-cert2.

Использование

appgw.ingress.kubernetes.io/backend-protocol: "https"
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-protocol: "https"
    appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Переопределение набора правил

Используйте следующую заметку, чтобы назначить существующее правило перезаписи соответствующему правилу маршрутизации запросов.

Использование

appgw.ingress.kubernetes.io/rewrite-rule-set: <rewrite rule set name>

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-bkprefix
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/rewrite-rule-set: add-custom-response-header
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 8080

Переопределение настраиваемого ресурса набора правил

Примечание.

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

Правила перезаписи URL-адресов для Шлюз приложений для контейнеров см. в этой статье об API шлюза и этой статье об API входящего трафика. Правила перезаписи заголовков для Шлюз приложений для контейнеров см. в этой статье об API шлюза.

Шлюз приложений позволяет переписать выбранное содержимое запросов и ответов. С помощью этой функции можно преобразовать URL-адреса, изменить параметры строки запроса и изменить заголовки запросов и ответов. Эту функцию можно также использовать для добавления условий, чтобы убедиться, что URL-адрес или указанные заголовки перезаписываются только при выполнении определенных условий. Перезапись настраиваемого ресурса набора правил приводит эту функцию к AGIC.

HTTP-заголовки позволяют клиенту и серверу передавать дополнительную информацию вместе с запросом или ответом. Перезаписав эти заголовки, можно выполнить важные задачи, такие как добавление полей заголовков, связанных с безопасностью (например, HSTS или X-XSS-Protection), удаление полей заголовков ответа, которые могут отображать конфиденциальную информацию и удалять сведения о портах из X-Forwarded-For заголовков.

С помощью возможности перезаписи URL-адресов можно:

  • Переопределите имя узла, путь и строку запроса URL-адреса запроса.
  • Выберите переписать URL-адрес всех запросов или только запросов, которые соответствуют одному или нескольким заданным условиям. Эти условия основаны на свойствах запроса и ответа (заголовок запроса, заголовок ответа и переменные сервера).
  • Выберите маршрутизировать запрос на основе исходного URL-адреса или URL-адреса перезаписи.

Примечание.

Эта функция поддерживается с версии 1.6.0-rc1. Использованиеappgw.ingress.kubernetes.io/rewrite-rule-set, позволяющее использовать существующий набор правил перезаписи в Шлюз приложений.

Использование

appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource

Пример

apiVersion: appgw.ingress.azure.io/v1beta1 
kind: AzureApplicationGatewayRewrite 
metadata: 
  name: my-rewrite-rule-set-custom-resource 
spec: 
  rewriteRules: 
  - name: rule1 
    ruleSequence: 21
    conditions:
  - ignoreCase: false
    negate: false
    variable: http_req_Host
    pattern: example.com
  actions:
    requestHeaderConfigurations:
    - actionType: set
      headerName: incoming-test-header
      headerValue: incoming-test-value
    responseHeaderConfigurations:
    - actionType: set
      headerName: outgoing-test-header
      headerValue: outgoing-test-value
    urlConfiguration:
      modifiedPath: "/api/"
      modifiedQueryString: "query=test-value"
      reroute: false

Приоритет правил

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

Использование

appgw.ingress.kubernetes.io/rule-priority:

Пример

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-rulepriority
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/rule-priority: 10
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 8080

В предыдущем примере задан приоритет 10 для правила маршрутизации запросов.