你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

应用程序网关入口控制器的批注

可以使用任意键/值对来批注 Kubernetes 入口资源。 应用程序网关入口控制器 (AGIC) 依赖注释来对无法通过入口 YAML 配置的 Azure 应用程序网关功能进行编程。 入口注释适用于派生自入口资源的所有 HTTP 设置、后端池和侦听器。

支持的批注列表

若要使 AGIC 观察入口资源,必须使用 kubernetes.io/ingress.class: azure/application-gateway 对该资源进行批注

注释键 值类型 默认值 允许的值
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 httphttps
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

前面的示例定义了一个注释名为 appgw.ingress.kubernetes.io/backend-path-prefix: "/test/" 的入口资源 go-server-ingress-bkprefix。 该注释会告知应用程序网关创建一个 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 重定向

将应用程序网关配置为向其 HTTPS 对等方自动重定向 HTTP URL。 如果存在此注释并且 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 当前仅在 Pod 使用由已知证书颁发机构签名的证书时,才支持 HTTPS。

不要在 Pod 上将端口 80 与 HTTPS 配合使用,或者将端口 443 与 HTTP 配合使用。

使用情况

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 信息中定义的 FQDN 上,因此它 配置为多站点侦听器

使用情况

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.comhostname2.contoso.com 的流量。

路径的 WAF 策略

使用以下注释将现有 Web 应用程序防火墙 (WAF) 策略附加到要注释的 Kubernetes 入口资源中的主机的列表路径。 WAF 策略同时应用于 /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 密钥保管库的未版本化机密 ID。 当注释包含证书名称且证书已在应用程序网关中预安装时,Kubernetes 入口控制器会创建使用 HTTPS 侦听器的传递规则,并将更改应用到应用程序网关实例。 在 SSL 重定向的情况下,还可以将 appgw-ssl-certificate 注释与 ssl-redirect 批注一起使用。

注意

当 TLS 规范同时在入口中定义时,将忽略 appgw-ssl-certificate 注释。 如果想要具有不同主机的不同证书(终止多个 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

重写规则集自定义资源

注意

适用于容器的应用程序网关的发布引入了许多性能、复原能力和功能变化。 请考虑使用适用于容器的应用程序网关进行下一次部署。

可以在此有关入口 API 的文章此有关入口 API 的文章中找到适用于容器的应用程序网关的 URL 重写规则。 可以在此有关入口 API 的文章中找到适用于容器的应用程序网关的标头重写规则。

可以通过应用程序网关重写请求和响应的所选内容。 使用此功能,你可以转换 URL、更改查询字符串参数并修改请求标头和响应标头。 还可以使用此功能来添加条件,确保只有在满足特定条件的情况下才能重写 URL 或指定的标头。 重写规则集自定义资源将此功能引入了 AGIC。

HTTP 标头可让客户端和服务器连同请求或响应一起传递附加的信息。 重写这些标头可以完成重要的任务,例如,添加安全相关的标头字段(如 HSTSX-XSS-Protection)、删除可能透露敏感信息的响应标头字段,以及从 X-Forwarded-For 标头中删除端口信息。

使用 URL 重写功能,可以:

  • 重写请求 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。