すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ALB Ingress サービスの高度な利用

最終更新日:Jan 01, 2026

ACK クラスターでは、ALB Ingress は外部からアクセス可能な API オブジェクトを管理することで、サービスにレイヤー 7 のロードバランシングを提供します。このトピックでは、ALB Ingress を使用して、異なるドメイン名や URL パスからのリクエストを異なるバックエンドサーバーグループに転送する方法、HTTP リクエストを HTTPS にリダイレクトする方法、および段階的リリースなどの機能の実装方法について説明します。

インデックス

機能分類

設定例

ALB Ingress の設定

ヘルスチェックの設定

ポート/プロトコルの設定

転送ルールの設定

高度な設定

ドメイン名に基づくリクエストの転送

シンプルな Ingress を作成して、指定された標準ドメイン名または空のドメイン名に基づいてリクエストを転送できます。以下のセクションで例を示します。

標準ドメイン名に基づくリクエストの転送

以下の YAML の例では、ルーティングパスは /hello に設定されています。demo.domain.ingress.top/hello へのリクエストはバックエンドサービスに転送されます。

  1. 以下のテンプレートをデプロイして、Service、Deployment、および Ingress を作成します。リクエストは、Ingress で指定されたドメイン名を通じて Service に転送されます。

    サンプル YAML を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: demo.domain.ingress.top
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    バージョン 1.19 より前のクラスターの場合

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: demo.domain.ingress.top
          http:
            paths:
              - backend:
                  serviceName: demo-service
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  2. 次のコマンドを実行して、指定された標準ドメイン名を使用してサービスにアクセスします。

    ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。

    curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello

    想定される出力:

    {"hello":"coffee"}

空のドメイン名に基づくリクエストの転送

以下の YAML の例では、ドメイン名は空で、ルーティングパスは /hello に設定されています。<ADDRESS>/hello へのリクエストはバックエンドサービスに転送されます。

  1. 以下のテンプレートをデプロイして Ingress を作成します。

    サンプル YAML を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: ""
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    バージョン 1.19 より前のクラスターの場合

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: ""
          http:
            paths:
              - backend:
                  serviceName: demo-service
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  2. 次のコマンドを実行して、空のドメイン名を使用してサービスにアクセスします。

    ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。

    curl <ADDRESS>/hello

    想定される出力:

    {"hello":"coffee"}

URL パスに基づくリクエストの転送

ALB Ingress は URL に基づくリクエストの転送をサポートしています。pathType フィールドを使用して、さまざまな URL マッチングポリシーを設定できます。pathType フィールドは、次の 3 つのマッチングタイプをサポートしています。

  • 完全一致 (Exact): リクエスト URL パスと完全に一致します。

  • デフォルト (ImplementationSpecific): 具体的なロジックは Ingress コントローラーによって決定されます。ALB Ingress Controller では、これは完全一致 (Exact) です。path フィールドが指定されていない場合、ALB Ingress は / をデフォルトパスとして使用します。

  • プレフィックス一致 (Prefix): リクエスト URL パスのプレフィックスと一致します。

重要
  • pathTypeExact または Prefix に設定されている場合、path を空でない絶対パスに設定する必要があります。そうしないと、検証の失敗により Ingress リソースを作成できません。

  • URL マッチングポリシーが競合する可能性があります。この場合、リクエストが転送される前に、転送ルールは優先順位に従ってソートされます。詳細については、「転送ルールの優先順位設定」をご参照ください。

  • シンプルなパス (/、/foo、/foo/)

    マッチングタイプ

    ルールパス (ルーティングルール)

    リクエストパス (ユーザーアクセス)

    ルールは一致しますか?

    プレフィックス一致 (Prefix)

    /

    / (すべてのルールに一致)

    はい

    /foo

    • /foo

    • /foo/

    はい

    /foo/

    • /foo

    • /foo/

    はい

    /aaa

    /ccc

    いいえ、プレフィックスが一致しません。

    完全一致 (Exact) またはデフォルト (ImplementationSpecific)

    /foo

    /foo

    はい

    /bar

    いいえ

    /foo/

    いいえ

    /foo/

    /foo

    いいえ

  • 階層的なパス (/aaa/bb、/aaa/bbb、/aaa/bbb/)

    マッチングタイプ

    ルールパス (ルーティングルール)

    リクエストパス (ユーザーアクセス)

    ルールは一致しますか?

    プレフィックス一致 (Prefix)

    /aaa/bb

    /aaa/bbb

    いいえ

    /aaa/bbb

    /aaa/bbb

    はい

    /aaa/bbb/

    /aaa/bbb

    はい、ルールパスの末尾のスラッシュは無視されます。

    /aaa/bbb

    /aaa/bbb/

    はい、リクエストパスの末尾のスラッシュは一致します。

    /aaa/bbb/ccc

    はい、リクエストパスのサブパスが一致します。

  • 2 つのルールパスを同時に設定

    マッチングタイプ

    ルールパス (ルーティングルール)

    リクエストパス (ユーザーアクセス)

    ルールは一致しますか?

    プレフィックス一致 (Prefix)

    • /

    • /aaa

    /aaa/ccc

    はい、リクエストパスはルールパスの / プレフィックスに一致します。

    • /aaa

    • /

    /aaa/ccc

    はい、リクエストパスはルールパスの /aaa プレフィックスに一致します。

    /ccc

    はい、リクエストパスはルールパスの / プレフィックスに一致します。

    • /aaa

    • /bbb

    /ccc

    いいえ、プレフィックスが一致しません。

以下のセクションでは、3 つのマッチングタイプの例を示します:

プレフィックス一致 (Prefix)

URL パスは、/ で区切られたパスセグメントを使用するプレフィックスマッチング方式を使用します。マッチングは大文字と小文字を区別し、パスセグメント内の各要素をセグメントごとに比較します。

以下の YAML の例では、ルーティングルールは / として設定されています。/hello のような / で始まるすべてのパスが一致します。

  1. 以下のテンプレートをデプロイして Ingress を作成します。

    サンプル YAML を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-path-prefix
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /
              backend:
                service:
                  name: demo-service
                  port:
                    number: 80
              pathType: Prefix

    バージョン 1.19 より前のクラスターの場合

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo-path-prefix
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /
              backend:
                serviceName: demo-service
                servicePort: 80
              pathType: Prefix
  2. 次のコマンドを実行してサービスにアクセスします。

    ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。

    curl <ADDRESS>/hello
  3. 想定される出力:

    {"hello":"coffee"}

完全一致 (Exact) またはデフォルト (ImplementationSpecific)

以下の YAML の例では、ルーティングルールは /hello として設定されています。/hello パスのみが一致します。

  1. 以下のテンプレートをデプロイして Ingress を作成します。

    サンプル YAML を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-path
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /hello
              backend:
                service:
                  name: demo-service
                  port: 
                    number: 80
              pathType: Exact

    バージョン 1.19 より前のクラスターの場合

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo-path
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /hello
              backend:
                serviceName: demo-service
                servicePort: 80
              pathType: Exact
  2. 次のコマンドを実行してサービスにアクセスします。

    ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。

    curl <ADDRESS>/hello

    想定される出力:

    {"hello":"coffee"}

ヘルスチェックの設定

ALB Ingress はヘルスチェックをサポートしています。以下のアノテーションを設定することで、ヘルスチェックを設定できます。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      # コンテキストパスを設定
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      # コンテキストパスを設定
      - path: /coffee
        pathType: ImplementationSpecific
        backend:
          service:
            name: coffee-svc
            port:
              number: 80

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-httpcode: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      # コンテキストパスを設定します。
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      # コンテキストパスを設定します。
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

以下のアノテーションのコードブロックは、アノテーションの例を示しています:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
... ...

パラメーター

説明

デフォルト値

alb.ingress.kubernetes.io/healthcheck-enabled

バックエンドサーバーグループのヘルスチェックを有効にするかどうかを指定します。

  • true: ヘルスチェックを有効にします。

  • false: ヘルスチェックを無効にします。

false

alb.ingress.kubernetes.io/healthcheck-path

ヘルスチェックパス。

/

alb.ingress.kubernetes.io/healthcheck-protocol

ヘルスチェックに使用されるプロトコル。

  • HTTP: HTTP プロトコルを使用します。HEAD または GET リクエストを送信してブラウザアクセスをシミュレートし、サーバーアプリケーションが正常かどうかを確認します。

  • HTTPS: HTTPS プロトコルを使用します。HEAD または GET リクエストを送信してブラウザアクセスをシミュレートし、サーバーアプリケーションが正常かどうかを確認します。

  • TCP: TCP プロトコルを使用します。SYN ハンドシェイクメッセージを送信して、サーバーポートがアクティブかどうかを確認します。

  • GRPC: gRPC プロトコルを使用します。POST または GET リクエストを送信して、サーバーアプリケーションが正常かどうかを確認します。

HTTP

alb.ingress.kubernetes.io/healthcheck-httpversion

HTTP プロトコルのバージョン。このパラメーターは、healthcheck-protocolHTTP または HTTPS に設定されている場合に有効です。

  • HTTP1.0

  • HTTP1.1

HTTP1.1

alb.ingress.kubernetes.io/healthcheck-method

ヘルスチェックメソッド。

  • HEAD

  • POST

  • GET

重要

healthcheck-protocolGRPC に設定されている場合は、POST または GET を選択してください。

HEAD

alb.ingress.kubernetes.io/healthcheck-httpcode

ヘルスチェックのステータスコード。バックエンドサーバーは、プローブリクエストが成功し、指定されたステータスコードを返した場合にのみ正常と見なされます。

以下のオプションを 1 つ以上入力できます。複数のステータスコードはカンマ (,) で区切ります。

  • http_2xx

  • http_3xx

  • http_4xx

  • http_5xx

http_2xx

alb.ingress.kubernetes.io/healthcheck-code

ヘルスチェックのステータスコード。バックエンドサーバーは、プローブリクエストが成功し、指定されたステータスコードを返した場合にのみ正常と見なされます。このパラメーターを healthcheck-httpcode と一緒に使用する場合、このパラメーターが優先されます。

利用可能なオプションは healthcheck-protocol の値によって異なります:

  • HTTP または HTTPS

    以下のオプションを 1 つ以上入力できます。複数のステータスコードはカンマ (,) で区切ります。

    • http_2xx

    • http_3xx

    • http_4xx

    • http_5xx

  • GRPC: 値の範囲は [0, 99] です。

    値の範囲を入力できます。最大 20 個の範囲を入力できます。複数の範囲はカンマ (,) で区切ります。

  • HTTP または HTTPS

    デフォルト値: http_2xx

  • GRPC

    デフォルト値: 0

alb.ingress.kubernetes.io/healthcheck-timeout-seconds

ヘルスチェックのタイムアウト期間 (秒)。値の範囲は [1, 300] です。

5

alb.ingress.kubernetes.io/healthcheck-interval-seconds

ヘルスチェック間隔 (秒)。値の範囲は [1, 50] です。

2

alb.ingress.kubernetes.io/healthy-threshold-count

バックエンドサーバーを正常と宣言するために必要な連続成功ヘルスチェック回数。値の範囲は [2, 10] です。

3

alb.ingress.kubernetes.io/unhealthy-threshold-count

バックエンドサーバーを異常と宣言するために必要な連続失敗ヘルスチェック回数。値の範囲は [2, 10] です。

3

alb.ingress.kubernetes.io/healthcheck-connect-port

ヘルスチェックに使用されるポート。

0

説明

0 は、バックエンドサーバーのポートがヘルスチェックに使用されることを示します。

HTTP から HTTPS へのリダイレクト設定

ALB Ingress は、次のアノテーションを使用して HTTP リクエストを HTTPS ポート 443 にリダイレクトします。

重要
  • この機能は、リスナーポート 80 を使用する HTTP 転送ルールでのみ設定できます。

  • この機能は、カスタム転送アクション RemoveHeaderInsertHeader、およびクロスドメイン Cors に関連するアノテーションとのみ使用できます。

  • このアノテーションを設定するには、AlbConfig でポート 443 の HTTPS リスナーが設定されていることを確認する必要があります。詳細については、「AlbConfig を介した ALB リスナーの設定」をご参照ください。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: v1
kind: Service
metadata:
  name: demo-service-ssl
  namespace: default
spec:
  ports:
    - name: port1
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: demo-ssl
  sessionAffinity: None
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-ssl
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-ssl
  template:
    metadata:
      labels:
        app: demo-ssl
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
          imagePullPolicy: IfNotPresent
          name: demo-ssl
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
  namespace: default
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - ssl.alb.ingress.top
  rules:
    - host: ssl.alb.ingress.top
      http:
        paths:
          - backend:
              service:
                name: demo-service-ssl
                port: 
                  number: 80
            path: /
            pathType: Prefix

バージョン 1.19 より前のクラスターの場合

apiVersion: v1
kind: Service
metadata:
  name: demo-service-ssl
  namespace: default
spec:
  ports:
    - name: port1
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: demo-ssl
  sessionAffinity: None
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-ssl
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-ssl
  template:
    metadata:
      labels:
        app: demo-ssl
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
          imagePullPolicy: IfNotPresent
          name: demo-ssl
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
  namespace: default
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - ssl.alb.ingress.top
  rules:
    - host: ssl.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: demo-service-ssl
              servicePort: 80
            path: /
            pathType: Prefix

パラメーター

説明

アノテーションの例

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

HTTP リクエストを HTTPS ポート 443 にリダイレクトします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
 ... ...

バックエンドでの HTTPS および gRPC プロトコルのサポート

ALB は、バックエンドプロトコルとして HTTPS と gRPC をサポートしています。これらを使用するには、Ingress に次のアノテーションを追加します。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:  
      - path: /
        pathType: Prefix
        backend:
          service:
            name: grpc-demo-svc
            port:
              number: 9080

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: grpc-demo-svc
              servicePort: 9080
            path: /
            pathType: Prefix
説明

Ingress の作成後、バックエンドプロトコルは変更できません。プロトコルを変更するには、Ingress を削除して新しいものを作成する必要があります。

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/backend-protocol

  • https: バックエンドサービスは HTTPS プロトコルを使用します。

  • grpc: バックエンドサービスは gRPC プロトコルを使用します。

    Ingress を使用して gRPC サービスを転送する場合、ドメイン名に SSL 証明書を設定し、通信に TLS プロトコルを使用します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
... ...

正規表現の設定

alb.ingress.kubernetes.io/use-regex: "true" アノテーションを使用して正規表現モードを有効にできます。その後、カスタム転送条件またはアクションで正規表現を設定できます。

重要

このアノテーションは、pathType: Prefix を持つパスルールにのみ適用されます。

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 正規表現の使用を許可します。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME> を実際の Service 名に置き換えます。これは以下の backend.service.name と同じでなければなりません。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## 正規表現の前にフラグとして ~* または ~ を追加します。~* または ~ の後の内容が有効な正規表現です。~* は大文字と小文字を区別する正規表現マッチを示し、~ は大文字と小文字を区別しない正規表現マッチを示します。
              "/pathvalue2"    ## 完全一致には ~* は不要です。
           ]
       }
      }]
  name: ingress-example
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /test-path-for-alb
        pathType: Prefix
        backend:
          service:
            name: <YOUR-SVC-NAME> ## ここでの <YOUR-SVC-NAME> は、関係を示すためにカスタム転送条件アノテーションで指定されたサービス名と同じでなければなりません。
            port:
              number: 88

パラメーター

説明

alb.ingress.kubernetes.io/use-regex: "true"

正規表現を有効にします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 正規表現の使用を許可します。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME> を実際の Service 名に置き換えます。これは以下の backend.service.name と同じでなければなりません。
     [{
       "type": "Path",         ## Host をサポートします
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## 正規表現の前にフラグとして ~* または ~ を追加します。~* または ~ の後の内容が有効な正規表現です。~* は大文字と小文字を区別する正規表現マッチを示し、~ は大文字と小文字を区別しない正規表現マッチを示します。
              "/pathvalue2"    ## 完全一致には ~* は不要です。
           ]
       }
      }]
... ...

alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>

カスタム転送条件を設定します。詳細については、「転送条件」をご参照ください。

<YOUR-SVC-NAME> を実際の Service 名に置き換えます。これは以下の backend.service.name と同じでなければなりません。

正規表現のマッチングルール:

マッチングオブジェクト

プレフィックス

ルールの例

クライアントパス

一致しますか?

説明

ドメイン名

~ で始まる

~test.example.com

test.EXAMPLE.com

はい

ドメイン名は、大文字と小文字を区別しない正規表現マッチングをサポートします。

パス

~ で始まる

~/api

/API

はい

パスは、大文字と小文字を区別しない正規表現マッチングをサポートします。

~* で始まる

~*/api

/Api

いいえ

パスは、大文字と小文字を区別する正規表現マッチングをサポートします。

再書き込みの設定

ALB Ingress は再書き込み機能をサポートしています。ALB Ingress がクライアントリクエストを受信した後、リクエストのパスを変更してから、そのリクエストをバックエンド Service に送信します。再書き込みは、次の 2 つのアノテーションを使用して実装されます:

  • alb.ingress.kubernetes.io/rewrite-target: /<path>/${number}: 再書き込みを有効にし、再書き込み後のパスを指定します。

    重要
    • 正規表現を使用して元のパスから取得した変数を表すには、${number} 形式を使用します。1 つ以上の変数を設定できます。たとえば、${1}${2}、または ${3} です。元のパスから最大 3 つの変数を取得できます。

    • Ingress の pathTypePrefix に設定する必要があります。

  • alb.ingress.kubernetes.io/use-regex: パスで正規表現を使用するかどうかを指定します。rewrite-target を設定すると、デフォルトで有効になります。

    • "true": 正規表現を使用します。

    • "false": 正規表現を使用しません。パスに特殊文字 (“%#;!()[]^,”\" など) が含まれている場合、Ingress リソースは作成できません。

設定例

シナリオ 1:プレフィックスの削除

以下の YAML の例では、path: /something(/|$)(.*) は正規表現を使用してクライアントリクエストパスを 3 つの部分に分割します:

  • /something: 削除するプレフィックスに一致します。

  • (/|$): 最初のキャプチャグループで、/something に続く / 文字またはパスの末尾 ($) に一致します。

  • (.*): 2 番目のキャプチャグループで、/something/ に続くすべてのコンテンツに一致します。再書き込み後のパスでは ${2} として使用されます。

alb.ingress.kubernetes.io/rewrite-target アノテーションで設定された再書き込み後のパスは、/ (標準パスプレフィックス) + ${2} (2 番目のキャプチャグループのコンテンツ) です。次の表は、パスの再書き込み効果を示しています。

元のクライアントパス

パスの正規表現に一致しますか?

再書き込み後のパス

/something

一致しました。2 番目のキャプチャグループは空です。

/

/something/

一致しました。2 番目のキャプチャグループは空です。

/

/something/new

一致しました。2 番目のキャプチャグループのコンテンツは new です。

/new

/something-new/item

一致しません。この例では、一致するルーティングルールがなく、ALB Ingress は 503 ステータスコードを返します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # path フィールドで正規表現の使用を許可します。
    alb.ingress.kubernetes.io/rewrite-target: /${2} # このアノテーションは正規表現の置換をサポートします。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

シナリオ 2:複数の部分をキャプチャして再配置する

次の例では、パス /items/(.*)/(.*)/(.*) の複数の部分をキャプチャして再配置します。また、ユーザーに気づかれずに URL 形式を POST リクエストに似た形式に変更します。再書き込み後のパスは / (標準パスプレフィックス) + ${2} (2 番目のキャプチャグループのコンテンツ) + ?code= + ${3} (3 番目のキャプチャグループのコンテンツ) です。次の表は、パスの再書き込み効果を示しています。

この例では、パスに 4 つのセグメントが明示的に必要です。この方法では、クライアントが固定のパス形式を使用する必要があります。

元のクライアントパス

パスの正規表現に一致しますか?

再書き込み後のパス

/items/electronics/computers/554

一致しました。2 番目のキャプチャグループのコンテンツは computers で、3 番目のキャプチャグループのコンテンツは 554 です。

/computers?code=554

/items/produce/fruits/12

一致しました。2 番目のキャプチャグループのコンテンツは fruits で、3 番目のキャプチャグループのコンテンツは 12 です。

/fruits?code=12

/items/headphones/5

一致しません。この例では、一致するルーティングルールがなく、ALB Ingress は 503 ステータスコードを返します。

/drinks/41

一致しません。この例では、一致するルーティングルールがなく、ALB Ingress は 503 ステータスコードを返します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # path フィールドで正規表現の使用を許可します。
    alb.ingress.kubernetes.io/rewrite-target: /${2}?code=${3} # このアノテーションは正規表現の置換をサポートします。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /items/(.*)/(.*)/(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

シナリオ 3:複数のパスを単一のパスに再書き込みする

次の例では、複数のパス (/app-a(/|$)(.*)/app-b(/|$)(.*)) を正規表現でマッチングさせることで、複数のパスを単一のパスに再書き込みします。再書き込み後のパスは /app-c/ + ${2} (2 番目のキャプチャグループのコンテンツ) です。次の表は、パスの再書き込み効果を示しています。

元のクライアントパス

パスの正規表現に一致しますか?

再書き込み後のパス

/app-a/item1

一致しました。2 番目のキャプチャグループのコンテンツは item1 です。

/app-c/item1

/app-a/item2

一致しました。2 番目のキャプチャグループのコンテンツは item2 です。

/app-c/item2

/app-a または /app-a/

一致しました。2 番目のキャプチャグループは空です。

/app-c/

/drinks/41

一致しません。この例では、一致するルーティングルールがなく、ALB Ingress は 503 ステータスコードを返します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # path フィールドで正規表現の使用を許可します。
    alb.ingress.kubernetes.io/rewrite-target: /app-c/${2} # このアノテーションは正規表現の置換をサポートします。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /app-a(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080
      - path: /app-b(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

シナリオ 4:ドメイン名の再書き込み

alb.ingress.kubernetes.io/rewrite-target アノテーションはパスの変更のみをサポートします。ドメイン名やパラメーターなど、URL の他の部分を変更するには、カスタム転送ルールを使用できます。

再書き込みルールのマッチングの検証

sed コマンドを使用して、クライアントが使用する特定のパスがパスで設定された正規表現に一致するかどうかを事前にテストし、新しい再書き込み後のパスを表示できます。

このセクションでは、「シナリオ 2:複数の部分をキャプチャして再配置する」のキャプチャパス /items/(.*)/(.*)/(.*) と再書き込みルール /${2}?code=${3} を例として使用します:

  1. 次のサンプルコマンドを path2.txt に保存します:

    /items/electronics/computers/554
    /items/produce/fruits/12
    /items/headphones/5
    /drinks/41
  2. パスが一致するかどうかを確認し、再書き込み後のパスを表示します:

    次のコマンドでは、例のパス正規表現 (/items/(.*)/(.*)/(.*)) と再書き込み後のパス (/${2}?code=${3}) が変更されています。sed コマンドでは、特殊文字 / はエスケープ文字 \ でエスケープする必要があり、キャプチャグループのコンテンツは ${2} ではなく \2 と記述されます。
    sed -E 's#\/items\/(.*)\/(.*)\/(.*)#Matched: [&]  --->  Rewritten: [/\2?code=\3]#' path2.txt

    想定される出力は次のとおりです。最初の 2 つのパスは再書き込みルールに一致し、新しいパスに再書き込みされます。最後の 2 つのパスは再書き込みルールに一致せず、再書き込みされません。

    Matched: [/items/electronics/computers/554]  --->  Rewritten: [/computers?code=554]
    Matched: [/items/produce/fruits/12]  --->  Rewritten: [/fruits?code=12]
    /items/headphones/5
    /drinks/41

カスタムリスナーポートの設定

ALB Ingress は、アノテーションを介してカスタムリスナーポートをサポートします。これにより、サービスはポート 80 (HTTP) とポート 443 (HTTPS) の両方を同時に公開できます。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
  name: cafe-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific
重要

ALB は Ingress で直接新しいリスナーを作成することをサポートしていません。Ingress が期待どおりに機能するようにするには、まず AlbConfig で必要なリスナーポートとプロトコルを作成する必要があります。その後、Ingress でこれらのリスナーをサービスに関連付けることができます。ALB リスナーの作成方法については、「AlbConfig を介した ALB リスナーの設定」をご参照ください。

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'

サービスがポート 80 とポート 443 の両方でリッスンするようにします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
... ...

転送ルールの優先順位設定

デフォルトでは、ALB 転送ルールの優先順位は次のようにソートされます:

  • 異なる Ingress は、namespace/name の辞書順でソートされます。辞書順が小さいほど優先順位が高くなります。

    名前空間が最初に比較されます。名前空間が同じ場合は、名前が文字ごとに比較されます。
  • 同じ Ingress 内では、ルールは rule フィールドの順序でソートされます。先に設定されたルールほど優先順位が高くなります。

    rules:
      - host: www.example.com
        http: ...
      - host: www.test.com
        http: ...

Ingress の namespace/name フィールドを変更しない場合、次の Ingress アノテーションを設定して ALB 転送ルールの優先順位を定義できます:

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/order: "2"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/order: "2" 
  name: cafe-ingress
spec:
  ingressClassName: alb
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific

パラメーター

説明

値の範囲

YAML の例

alb.ingress.kubernetes.io/order

ALB 転送ルールの優先順位を定義します。値が小さいほど優先順位が高くなります。

同じリスナー内のルールの優先順位は一意でなければなりません。

[1,1000]

デフォルト値: 10

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/order: "2"
spec:
... ...

アノテーションを使用した段階的リリースの実装

ALB は複雑なルーティングをサポートし、ヘッダー、Cookie、および重みに基づく段階的リリース機能を提供します。次のアノテーションを設定して、さまざまな段階的リリース ポリシーを柔軟に実装できます。段階的リリースのベストプラクティスについては、「ALB Ingress を介した段階的リリースの実装」をご参照ください。

パラメーター

説明

説明

alb.ingress.kubernetes.io/canary: "true"

段階的リリース機能を有効にします。

  • カナリアトラフィックは、ヘッダー、Cookie、または重みに基づいて割り当てることができます。

    割り当ての優先順位は、ヘッダー > Cookie > 重み (高い順) です。
  • 段階的リリースのプロセス中に元のルールを削除しないでください。これにより、サービス例外が発生する可能性があります。段階的リリースが検証された後、元の Ingress のバックエンド Service を新しい Service に更新し、その後カナリア Ingress を削除します。

  • 指定されたヘッダーに基づいてカナリアトラフィックを割り当てる

    パラメーター

    説明

    YAML の例

    alb.ingress.kubernetes.io/canary-by-header

    このルールを使用すると、リクエストヘッダーとそれに対応する値をカスタマイズできます。両方のアノテーションを設定する必要があります。

    • リクエストの headerheader-value が設定値と一致する場合、リクエストトラフィックはカナリアサービスのエンドポイントに割り当てられます。

    • その他の一致しないリクエストは、カナリアの優先順位に従って後続のカナリアサービスに割り当てられます。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
    spec:
    ... ...

    alb.ingress.kubernetes.io/canary-by-header-value

    リクエストヘッダーに location: hz が含まれている場合、トラフィックはカナリアサービスにルーティングされます。その他のリクエストは、カナリアの重みポリシーに基づいてカナリアサービスに割り当てられます。以下は設定例です。

    サンプル YAML 全文を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    バージョン 1.19 より前のクラスターの場合

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  • 指定された Cookie に基づいてカナリアトラフィックを割り当てる

    パラメーター

    Cookie の値

    YAML の例

    alb.ingress.kubernetes.io/canary-by-cookie

    • always: すべてのリクエストトラフィックがカナリアサービスのエンドポイントに割り当てられます。

    • never: リクエストトラフィックはカナリアサービスのエンドポイントに割り当てられません。

    Cookie ベースのカナリアリリースはカスタム設定をサポートしておらず、alwaysnever のみです。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      ... ... 

    リクエストヘッダーに Cookie: demo=always が含まれている場合、トラフィックはカナリアサービスにルーティングされます。リクエストヘッダーに Cookie: demo=never が含まれている場合、トラフィックはカナリアサービスにルーティングされません。以下は設定例です。

    サンプル YAML 全文を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    バージョン 1.19 より前のクラスターの場合

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  • 重みによるトラフィックの割り当て

    パラメーター

    説明

    YAML の例

    alb.ingress.kubernetes.io/canary-weight

    指定されたサービスへのリクエストの割合を設定します。値は 0 から 100 までの整数です。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight

    次の例では、カナリアサービスの重みを 50% に設定します:

    サンプル YAML 全文を展開して表示

    バージョン 1.19 以降のクラスターの場合

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    バージョン 1.19 より前のクラスターの場合

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific

アノテーションを使用したセッション維持の実装

ALB Ingress は、次のアノテーションを介してセッション維持をサポートします。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"   # カスタム Cookie を使用する場合、Cookie の挿入タイプは Server でなければなりません。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - backend:
          service:
            name: tea-svc
            port:
              number: 80
        path: /tea2
        pathType: ImplementationSpecific
      - backend:
          service:
            name: coffee-svc
            port:
              number: 80
        path: /coffee2
        pathType: ImplementationSpecific

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"  # カスタム Cookie を使用する場合、Cookie の挿入タイプは Server でなければなりません。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      #コンテキストパスを設定します。
      - path: /tea2
        pathType: ImplementationSpecific
        backend:
          serviceName: tea-svc
          servicePort: 80
      #コンテキストパスを設定します。
      - path: /coffee2
        pathType: ImplementationSpecific
        backend:
          serviceName: coffee-svc
          servicePort: 80

以下のアノテーションのコードブロックは、アノテーションの例を示しています:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"   # カスタム Cookie を使用する場合、Cookie の挿入タイプは Server でなければなりません。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
... ...

パラメーター

説明

デフォルト値

alb.ingress.kubernetes.io/sticky-session

セッション維持を有効にするかどうかを指定します。

  • true: 有効

  • false: インスタンスはシャットダウンされます。

false

alb.ingress.kubernetes.io/sticky-session-type

Cookie の処理方法。

  • Insert: Cookie を挿入します。クライアントが初めてサービスにアクセスすると、Server Load Balancer は HTTP または HTTPS 応答に Cookie (SERVERID) を挿入します。クライアントがこの Cookie を使用して再度サービスにアクセスすると、Server Load Balancer はリクエストを以前に記録されたバックエンドサーバーに転送します。

  • Server: Cookie を書き換えます。Server Load Balancer がカスタム Cookie を検出すると、元の Cookie を書き換えます。クライアントが新しい Cookie を使用して再度サービスにアクセスすると、Server Load Balancer はリクエストを以前に記録されたバックエンドサーバーに転送します。

説明

このパラメーターは、サーバーグループの StickySessionEnabledtrue の場合に有効です。サーバーグループのパラメーターの詳細については、「サーバーグループの作成」をご参照ください。

Insert

alb.ingress.kubernetes.io/cookie-timeout

Cookie のタイムアウト期間 (秒)。値の範囲は [1, 86400] です。

このアノテーションは、sticky-session-typeInsert に設定されている場合に有効です。

1000

alb.ingress.kubernetes.io/cookie

カスタム Cookie の値。

このアノテーションは、sticky-session-typeServer に設定されている場合は必須であり、空にすることはできません。

""

バックエンドサーバーグループのロードバランシングアルゴリズムの指定

ALB Ingress は、次のアノテーションを使用してバックエンドサーバーグループのロードバランシングアルゴリズムを指定できます。指定可能な値とその説明は次の表のとおりです。

サンプル YAML 全文を展開して表示

バージョン 1.19 以降のクラスターの場合

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 必要に応じて wrr, sch, または wlc に設定できます。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # このパラメーターは、ロードバランシングアルゴリズムが uch の場合にのみ必要です。wrr, sch, または wlc の場合は不要です。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

バージョン 1.19 より前のクラスターの場合

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 必要に応じて wrr, sch, または wlc に設定することもできます。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # このパラメーターは、ロードバランシングアルゴリズムが uch の場合にのみ必要です。wrr, sch, または wlc の場合は不要です。
  name: cafe-ingress
spec:
  ingressClassName: alb
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific

パラメーター

説明

alb.ingress.kubernetes.io/backend-scheduler

wrr

重み付けラウンドロビン。重みが大きいバックエンドサーバーほど、ポーリングされる可能性が高くなります (デフォルト値)。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 必要に応じて wrr, sch, または wlc に設定できます。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # このパラメーターは、ロードバランシングアルゴリズムが uch の場合にのみ必要です。wrr, sch, または wlc の場合は不要です。
spec:
... ... 

wlc

ポーリングは、各バックエンドサーバーに設定された重み値と、バックエンドサーバーの実際の負荷 (接続数) に基づいて行われます。重みが同じ場合、接続数が少ないサーバーが優先されます。

sch

送信元 IP の一貫性ハッシュ。リクエストは、クライアントの送信元 IP のハッシュに基づいて分散されます。同じ IP アドレスからのリクエストは、同じバックエンドサーバーに割り当てられます。

uch

URL パラメーターの一貫性ハッシュ。

alb.ingress.kubernetes.io/backend-scheduler-uch-value アノテーションを使用して、一貫性ハッシュの URL パラメーターを指定します。

クロスドメイン設定

ALB Ingress は、次のアノテーションパラメーターをサポートして、クロスドメイン動作を制御します。許可されたサイト、リクエストメソッド、リクエストおよびレスポンスヘッダー、資格情報の携帯、およびプリフライト (OPTIONS) のキャッシュ時間を指定して、さまざまなセキュリティおよびビジネスシナリオにおけるクロスドメインアクセス要件を満たすことができます。

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-cors: "true"
    alb.ingress.kubernetes.io/cors-expose-headers: ""
    alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    alb.ingress.kubernetes.io/cors-allow-credentials: "true"
    alb.ingress.kubernetes.io/cors-max-age: "600"
    alb.ingress.kubernetes.io/cors-allow-origin: "Allowed-cross-domain-name"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud-nodeport
            port:
              number: 80

以下のアノテーションのコードブロックは、アノテーションの例を示しています:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-cors: "true"
    alb.ingress.kubernetes.io/cors-expose-headers: ""
    alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    alb.ingress.kubernetes.io/cors-allow-credentials: "true"
    alb.ingress.kubernetes.io/cors-max-age: "600"
    alb.ingress.kubernetes.io/cors-allow-origin: "Allowed-cross-domain-name"
spec:
... ...

パラメーター

説明

デフォルト値

alb.ingress.kubernetes.io/enable-cors

CORS クロスドメイン設定を有効にします。

デフォルト値: "true"

alb.ingress.kubernetes.io/cors-allow-origin

ブラウザを介してサーバーリソースへのアクセスが許可されているサイト。

サイトはカンマ (,) で区切ります。単一の値は http:// または https:// で始まり、その後に有効なドメイン名または第一レベルのワイルドカードドメイン名が続く必要があります。IP アドレスはサポートされていません。
  • デフォルト値: *

  • 例: alb.ingress.kubernetes.io/cors-allow-origin: "https://example.com:4443, http://aliyundoc.com, https://example.org:1199"

alb.ingress.kubernetes.io/cors-allow-methods

許可されたクロスドメインメソッド。

メソッドは大文字と小文字を区別しません。クロスドメインメソッドはカンマ (,) で区切ります。
  • デフォルト値: GET, PUT, POST, DELETE, PATCH, OPTIONS

  • 例: alb.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"

alb.ingress.kubernetes.io/cors-allow-headers

ドメイン間で伝播できるリクエストヘッダー。

これを * に設定するか、1 つ以上の値を設定できます。複数の値はカンマ (,) で区切ります。単一の値には、大文字、小文字、数字のみを含めることができます。アンダースコア (_) またはハイフン (-) で開始または終了することはできません。最大長は 32 文字です。
  • デフォルト値: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

  • 例: alb.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, X-app123-XPTO"

alb.ingress.kubernetes.io/cors-expose-headers

公開できるヘッダーのリスト。

これを * に設定するか、1 つ以上の値を設定できます。複数の値はカンマ (,) で区切ります。単一の値には、大文字、小文字、数字のみを含めることができます。アンダースコア (_) またはハイフン (-) で開始または終了することはできません。最大長は 32 文字です。
  • デフォルト値: ""

  • 例: alb.ingress.kubernetes.io/cors-expose-headers: "*,X-CustomResponseHeader"

alb.ingress.kubernetes.io/cors-allow-credentials

クロスドメインアクセス中に資格情報を携帯することを許可するかどうかを指定します。

  • デフォルト値: true

  • 例: alb.ingress.kubernetes.io/cors-allow-credentials: "false"

alb.ingress.kubernetes.io/cors-max-age

単純でないリクエストの場合、ブラウザでの OPTIONS プリフライトリクエストの最大キャッシュ時間を秒単位で設定します。値の範囲は [0, 172800] です。

デフォルト値: 172800

バックエンドの持続的接続

従来のロードバランシングでは、バックエンドサーバーグループへのアクセスに短命な接続が使用されます。各リクエストには TCP 接続の確立と終了が必要であり、これによりネットワーク接続が高パフォーマンスシステムのボトルネックになります。ロードバランサーからのバックエンド持続的接続サポートにより、接続レイヤーの処理にかかるリソース消費が大幅に削減され、処理パフォーマンスが大幅に向上します。次のコードブロックは、サンプル設定を示しています:

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud-nodeport
            port:
              number: 80

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/backend-keepalive: "true"

バックエンドの持続的接続を有効にします。これにより、各リクエストの TCP 接続の確立と終了が削減され、リソース消費が減り、高パフォーマンスシステムの処理能力が向上します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:

バックエンドサーバーグループへの IPv6 のマウントサポート

サーバーグループの IPv6 マウントを有効にした後、IPv4 と IPv6 の両方の Pod をサーバーグループにマウントするには、クラスターでデュアルスタック機能が有効になっていることを確認する必要があります。詳細については、「ACK マネージドクラスターの作成」をご参照ください。

説明

IPv6 マウントを有効にする場合、次の制限が適用されます:

  • サーバーグループが配置されている VPC で IPv6 が有効になっていない場合、サーバーグループで IPv6 マウントを有効にすることはできません。

  • カスタム転送アクションを使用して IP タイプまたは Function Compute タイプのサーバーグループをマウントする場合、IPv6 マウントはサポートされません。

  • IPv4 タイプの ALB インスタンスに関連付けられている Ingress の場合、サーバーグループの IPv6 マウントはサポートされません。

サンプル YAML 全文を展開して表示

apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  annotations:
spec:
  # デュアルスタックを設定する場合、ipFamilies は IPv4 または IPv6 に設定し、ipFamilyPolicy は RequireDualStack または PreferDualStack に設定する必要があります。
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv4
  - IPv6
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: tea
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tea
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tea
  template:
    metadata:
      labels:
        app: tea
    spec:
      containers:
      - name: tea
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
        ports:
        - containerPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
  ingressClassName: alb
  rules:
   - host: demo.alb.ingress.top
     http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80
Service と ALB Ingress の両方が、デュアルスタックに必要な設定を行う必要があります。デュアルスタック ALB インスタンスを作成した後、サーバーグループは IPv4 と IPv6 の両方のバックエンドサーバーをマウントできます。

設定オブジェクト

設定パラメーター

説明

YAML の例

Service

ipFamilies

  • IPv4

  • IPv6

Service で利用可能な IP アドレスタイプを指定します。

apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  annotations:
spec:
  # デュアルスタックを設定する場合、ipFamilies は IPv4 または IPv6 に設定し、ipFamilyPolicy は RequireDualStack または PreferDualStack に設定する必要があります。
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv4
  - IPv6
... ...

ipFamilyPolicy

  • RequireDualStack

  • PreferDualStack

Service の IP ポリシーを設定し、デュアルスタックをサポートします。

ALB Ingress

alb.ingress.kubernetes.io/enable-ipv6

"true"

サーバーグループの IPv6 マウントを有効にします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
... ...

QPS 制限のサポート

ALB は、転送ルールの 1 秒あたりのクエリ数 (QPS) 制限をサポートしています。次のアノテーションを設定することで、QPS 制限を設定できます。

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
  ingressClassName: alb
  rules:
   - host: demo.alb.ingress.top
     http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      - path: /coffee
        pathType: ImplementationSpecific
        backend:
          service:
            name: coffee-svc
            port:
              number: 80

アノテーション

説明

YAML の例

alb.ingress.kubernetes.io/traffic-limit-qps

転送ルールの QPS 制限を設定します。値の範囲は [1, 1000000] です。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
... ...

バックエンドのスロースタート

新しい Pod が Service バックエンドに追加された後、ALB Ingress がすぐに新しい Pod にトラフィックを割り当てると、一時的に高い CPU またはメモリの負荷が発生し、アクセス例外を引き起こす可能性があります。スロースタートを使用すると、ALB Ingress は新しい Pod に徐々にトラフィックを転送できるため、急激なトラフィックバーストの影響を緩和できます。次のコードブロックは、サンプル設定を示しています:

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/slow-start-enabled: "true"
    alb.ingress.kubernetes.io/slow-start-duration: "100"
  name: alb-ingress
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/slow-start-enabled

スロースタート機能を有効にするかどうかを指定します。デフォルトでは無効になっています。

  • true: スロースタート機能を有効にします。

  • false: スロースtart機能を無効にします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/slow-start-enabled: "true"
    alb.ingress.kubernetes.io/slow-start-duration: "100"
  name: alb-ingress
... ...

alb.ingress.kubernetes.io/slow-start-duration

スロースタートが完了した後にトラフィックが徐々に増加する時間が長いほど、トラフィックの増加率は遅くなります。このパラメーターは秒 (s) 単位です。値の範囲は [30, 900] で、デフォルト値は 30 秒です。

接続ドレイン

Pod が Terminating 状態に入ると、ALB Ingress はそれをバックエンドサーバーグループから削除します。ALB と Pod の間に既に確立されている接続はすぐには中断されません。クライアントアクセスは、これらのバックエンドサーバーにリクエストを転送し続けます。これにより、Pod 内のビジネスが長時間オフラインにできなかったり、リクエストエラーが発生したりする可能性があります。この問題を回避するために、ALB の接続ドレイン機能を使用できます。Pod が削除されたり、ヘルスチェックが異常になったりすると、ALB Ingress は一定期間通常の伝送を維持し、中断時間に達した後に接続を積極的に切断します。これにより、スムーズなビジネスのオフラインプロセスが保証されます。詳細については、「ALB 接続ドレインによるスムーズなビジネスのオフライン化の実現」をご参照ください。

重要

接続ドレイン時間が終了する前に、ALB Ingress は Pod が実行状態にあることを保証できません。Pod の spec.terminationGracePeriodSeconds を設定するか、preStop フックを使用して、Terminating 状態の Pod の可用性を制御できます。

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/connection-drain-enabled: "true"
    alb.ingress.kubernetes.io/connection-drain-timeout: "199"
  name: alb-ingress
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/connection-drain-enabled

接続ドレインを有効にするかどうかを指定します。デフォルトでは無効になっています。

  • true: 接続ドレインを有効にします。

  • false: 接続ドレインを無効にします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/connection-drain-enabled: "true"
    alb.ingress.kubernetes.io/connection-drain-timeout: "199"
  name: alb-ingress
... ...

alb.ingress.kubernetes.io/connection-drain-timeout

接続ドレインのタイムアウト期間 (秒)。値の範囲は [0, 900] で、デフォルト値は 300 秒です。

クロスゾーンロードバランシングの無効化

デフォルトでは、ALB はクロスゾーンロードバランシングを有効にします。これは、トラフィックが同じリージョン内の異なるゾーンにあるバックエンドサービスに均等に分散されることを意味します。ALB サーバーグループのクロスゾーンロードバランシングを無効にすると、トラフィックは同じリージョン内の同じゾーンにあるバックエンドサービス間でのみ分散されます。

重要

クロスゾーンロードバランシングを無効にするには、ALB が各ゾーンに利用可能なバックエンドサービスを設定しており、これらのサーバーに十分なリソースがあることを確認する必要があります。ビジネスに影響を与えないように、この操作は慎重に行ってください。

次の例を参照して、クロスゾーンロードバランシングを無効にできます:

サンプル YAML 全文を展開して表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/cross-zone-enabled: "false"
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

パラメーター

説明

YAML の例

alb.ingress.kubernetes.io/cross-zone-enabled

クロスゾーン転送を無効にするかどうかを指定します。デフォルトでは有効になっています。

  • true: クロスゾーン転送を有効にします。

  • false: クロスゾーン転送を無効にします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/cross-zone-enabled: "false"
... ...