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

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

支持的批注列表

对于 AGIC 要观察的入口资源,必须使用 kubernetes.io/ingress.class: azure/application-gateway 对其进行批注。 只有在注释之后,AGIC 才能使用相关的入口资源。

批注键 值类型 默认值 允许的值
appgw.ingress.kubernetes.io/backend-path-prefix string nil
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/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/rewrite-rule-set string 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/ 的路径前缀重写。

注意

在上面的示例中,只定义了一个规则。 但是,注释适用于整个入口资源,因此,如果用户定义了多个规则,则会为指定的每个路径设置后端路径前缀。 如果用户想要创建包含不同路径前缀的不同规则(即使是对于同一服务),需要定义不同的入口资源。

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(例如:80/443)。 在 HTTP 上使用带有注释 appgw.ingress.kubernetes.io/use-private-ip: "false" 的入口和带有 appgw.ingress.kubernetes.io/use-private-ip: "true" 的另一个入口会导致 AGIC 在更新应用程序网关时失败。
  • 对于没有专用 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-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/use-private-ip: "true"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

后端协议

使用以下注释可指定应用程序网关与 Pod 进行通信时应使用的协议。 支持的协议为 httphttps

注意

应用程序网关支持自签名的证书,不过,目前仅当 Pod 使用已知 CA 签名的证书时,AGIC 才支持 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: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 443

重写规则集

使用以下注释,你可以将现有的重写规则集分配给相应的请求路由规则。

使用情况

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