次の方法で共有


Application Gateway イングレス コントローラーの注釈

Kubernetes イングレス リソースには、任意のキー/値のペアを使用して注釈を付けることができます。 Application Gateway イングレス コントローラー (AGIC) は注釈に依存して、イングレス YAML を介して構成できない Azure Application Gateway 機能をプログラムします。 イングレス注釈は、イングレス リソースから派生したすべての HTTP 設定、バックエンド プール、およびリスナーに適用されます。

ヒント

Application Gateway for Containers とは」も参照してください。

サポートされている注釈の一覧

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 という名前のイングレス リソースを定義します。 この注釈は、パス /hello から /test/ へのパス プレフィックス オーバーライドを含む HTTP 設定を作成するよう、Application Gateway に指示します。

この例では、1 つの規則のみを定義します。 ただし、注釈はイングレス リソース全体に適用されます。 したがって、複数の規則を定義する場合は、指定された各パスのバックエンド パス プレフィックスを設定します。 (同じサービスに対するものであっても) パス プレフィックスが異なっている別々の規則が必要な場合、別々のイングレス リソースを定義する必要があります。

バックエンド ホスト名

次の注釈を使用して、Application Gateway がポッドとの通信時に使用するホスト名を指定します。

使用方法

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

カスタム正常性プローブ

カスタム正常性プローブをバックエンド アドレス プールに送信するように Application Gateway を構成できます。 次の注釈が存在する場合、Kubernetes イングレス コントローラーはカスタム プローブを作成し、バックエンド アプリケーションを監視します。 その後、コントローラーによって Application Gateway に変更が適用されます。

  • 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 を自動的にリダイレクトするように Application Gateway を構成できます。 この注釈が存在し、TLS が正しく構成されている場合、Kubernetes イングレス コントローラーは、リダイレクト構成を持つルーティング規則を作成します。 その後、コントローラーによって Application Gateway インスタンスに変更が適用されます。 作成されたリダイレクトは 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: この注釈はタイムアウトを指定します。この時間の経過後に Application Gateway は、ドレイン状態のバックエンド エンドポイントへの要求を終了します。

使用方法

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

Request Timeout

次の注釈を使用して、要求タイムアウトを秒単位で指定します。 タイムアウト後、応答が受信されない場合、Application Gateway は要求を失敗します。

使用方法

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 を使用

次の注釈を使用して、このエンドポイントを Application Gateway のプライベート IP で公開するかどうかを指定します。

プライベート IP を持たない Application Gateway インスタンスの場合、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

フロントエンド ポートのオーバーライド

次の注釈を使用して、HTTP に 80 以外、HTTPS に 443 以外のポートを使用するようにフロントエンド リスナーを構成します。

ポートが Application Gateway の承認された範囲内 (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

Note

外部要求の宛先は http://somehost ではなく http://somehost:8080 とする必要があります。

バックエンド プロトコル

次の注釈を使用して、Application Gateway がポッドと通信するときに使用するプロトコルを指定します。 サポートされているプロトコルは、HTTP および HTTPS です。

自己署名証明書は Application Gateway でサポートされていますが、AGIC は現在、ポッドが既知の証明機関によって署名された証明書を使用する場合にのみ HTTPS をサポートしています。

ポッドでは、HTTPS ではポート 80、HTTP ではポート 443 を使用しないようにしてください。

使用方法

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

ホスト名拡張

複数のホスト名を受け入れるように Application Gateway を構成できます。 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.com および hostname2.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

Application Gateway SSL 証明書

SSL 証明書を Application Gateway に対して構成するには、ローカルの PFX 証明書ファイルから行うことも、Azure Key Vault バージョン指定なしシークレット ID への参照を使用することもできます。 証明書名を指定した注釈が存在しているときに、その証明書が Application Gateway にプレインストールされている場合は、HTTPS リスナーを使用するルーティング規則が Kubernetes イングレス コントローラーによって作成され、その変更が Application Gateway インスタンスに適用されます。 SSL リダイレクトの場合は、appgw-ssl-certificate 注釈を ssl-redirect 注釈と共に使用することもできます。

Note

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

Application Gateway SSL プロファイル

リスナーごとに Application Gateway インスタンスで SSL プロファイルを構成できます。 プロファイル名を指定した注釈が存在しているときに、そのプロファイルが Application Gateway にプレインストールされている場合は、HTTPS リスナーを使用するルーティング規則が Kubernetes イングレス コントローラーによって作成され、その変更が Application Gateway インスタンスに適用されます。

使用方法

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

Application Gateway 信頼されたルート証明書

AGIC 経由で信頼されるために自身のルート証明書を Application Gateway に対して構成できるようになりました。 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

書き換えルール セット カスタム リソース

Note

Application Gateway for Containers のリリースでは、パフォーマンス、回復性、機能に関する多数の変更が導入されています。 Application Gateway for Containers を次回のデプロイに使用することを検討してください。

Application Gateway for Containers の URL 書き換え規則については、ゲートウェイ API に関する記事およびイングレス API に関する記事を参照してください。 Application Gateway for Containers のヘッダー書き換え規則については、ゲートウェイ API に関する記事を参照してください。

Application Gateway を使用すると、選択した要求と応答のコンテンツを書き換えることができます。 この機能により、URL の変換、クエリ文字列パラメーターの変更、要求ヘッダーと応答ヘッダーの変更を行えます。 また、条件を追加することで、特定の条件が満たされた場合にのみ、URL または指定したヘッダーが確実に書き換えられるようにできます。 "書き換えルール セット カスタム リソース" によって、この機能を AGIC で利用できるようになります。

クライアントとサーバーは、HTTP ヘッダーを使用して、要求または応答に追加の情報を渡すことができます。 これらのヘッダーの書き換えによって、セキュリティ関連ヘッダー フィールドの追加 (HSTSX-XSS-Protection など)、機密情報が漏れる可能性のある応答ヘッダー フィールドの削除、X-Forwarded-For ヘッダーからのポート情報の削除など、重要なタスクを実現できます。

URL 書き換え機能を使用すると、次のことができます。

  • 要求 URL のホスト名、パス、およびクエリ文字列の書き換え。
  • 全要求の URL の書き換え、または設定した 1 つ以上の条件に一致する要求の URL のみの書き換え。 これらの条件は、要求と応答のプロパティ (要求ヘッダー、応答ヘッダー、およびサーバー変数) に基づいています。
  • 要求のルーティングを元の URL と書き換え後の URL のどちらに基づいて行うかを選択する。

Note

この機能は 1.6.0-rc1 以降でサポートされています。 Application Gateway に対して既存の書き換えルール セットを使用できる、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

ルールの優先順位

この注釈を使用すると、Application Gateway イングレス コントローラーが、関連付けられている要求ルーティング規則の優先順位を明示的に設定できます。

使用方法

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 に設定します。