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

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

简介

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

支持的批注列表

对于 AGIC 要观察的入口资源,必须使用 对其进行批注。 只有在批注之后,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 http, https
appgw.ingress.kubernetes.io/rewrite-rule-set string nil

后端路径前缀

此批注允许使用其中指定的前缀重新编写入口资源中指定的后端路径。 这样,用户就可以公开终结点与用于公开入口资源中服务的终结点名称不同的服务。

使用情况

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

示例

apiVersion: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 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: extensions/v1beta1
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:
          serviceName: websocket-repeater
          servicePort: 80

连接清空

connection-draining:此注释允许用户指定是否启用连接排出。 connection-draining-timeout:此注释允许用户指定超时时间,在此时间后,应用程序网关将终止对排出后端终结点的请求。

使用情况

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

示例

apiVersion: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 80

此批注可用于指定是否启用基于 Cookie 的相关性。

使用情况

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

示例

apiVersion: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 80

请求超时

此批注可用于指定请求超时(以秒为单位),在此超时过后,如果未收到响应,应用程序网关将使请求失败。

使用情况

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

示例

apiVersion: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 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: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 80

后端协议

使用此注释可以指定应用程序网关在与 Pod 通信时应使用的协议。 支持的协议:httphttps

注意

  • 应用程序网关支持自签名的证书,不过,目前仅当 Pod 使用已知 CA 签名的证书时,AGIC 才支持 https
  • 请务必不要在 Pod 上将端口 80 与 HTTPS 配合使用,或者将端口 443 与 HTTP 配合使用。

使用情况

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

示例

apiVersion: extensions/v1beta1
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/
        backend:
          serviceName: go-server-service
          servicePort: 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