ACK サーバーレスクラスターでは、Application Load Balancer (ALB) Ingress は、クラスター Service 内で外部からアクセス可能な API オブジェクトを管理することにより、レイヤー 7 のロードバランシングを提供します。このトピックでは、ALB Ingress を使用して、異なるドメイン名や URL パスからのリクエストを異なるバックエンドサーバーグループに転送する方法、HTTP リクエストを HTTPS にリダイレクトする方法、およびカナリアリリースを実装する方法について説明します。
前提条件
ACK サーバーレスクラスターが作成されていること。クラスターの VPC には、クラスターがインターネットにアクセスしてコンテナイメージをダウンロードできるように、NAT Gateway が設定されている必要があります。詳細については、「サーバーレス Kubernetes (ACK Serverless) のクイックスタート」をご参照ください。
AlbConfig が作成されていること。詳細については、「AlbConfig の作成」をご参照ください。
ドメイン名に基づくリクエストの転送
指定された標準ドメイン名または空のドメイン名に基づいてリクエストを転送する単純な Ingress を作成できます。以下のセクションで例を示します。
標準ドメイン名に基づくリクエストの転送
次の YAML の例では、ルーティングパスは /hello に設定されています。demo.domain.ingress.top/hello へのリクエストは、バックエンドサービスに転送されます。
次のテンプレートをデプロイして、Service、Deployment、および Ingress を作成します。リクエストは、Ingress で指定されたドメイン名を介して Service に転送されます。
次のコマンドを実行して、指定された標準ドメイン名を使用してサービスにアクセスします。
ADDRESS を ALB インスタンスのドメイン名に置き換えます。
kubectl get ingを実行してドメイン名を取得できます。curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello期待される出力:
{"hello":"coffee"}
空のドメイン名に基づくリクエストの転送
次の YAML の例では、ドメイン名は空で、ルーティングパスは /hello に設定されています。<ADDRESS>/hello へのリクエストは、バックエンドサービスに転送されます。
次のテンプレートをデプロイして Ingress を作成します。
次のコマンドを実行して、空のドメイン名を使用してサービスにアクセスします。
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 パスのプレフィックスと一致します。
pathTypeがExactまたはPrefixに設定されている場合、パスを空でない絶対パスに設定する必要があります。そうしないと、検証の失敗により 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 などが一致します。
次のテンプレートをデプロイして Ingress を作成します。
次のコマンドを実行してサービスにアクセスします。
ADDRESS を ALB インスタンスのドメイン名に置き換えます。
kubectl get ingを実行してドメイン名を取得できます。curl <ADDRESS>/hello
期待される出力:
{"hello":"coffee"}完全一致 (Exact) またはデフォルト (ImplementationSpecific)
次の YAML の例では、ルーティングルールは /hello として設定されています。/hello パスのみが一致します。
次のテンプレートをデプロイして Ingress を作成します。
次のコマンドを実行してサービスにアクセスします。
ADDRESS を ALB インスタンスのドメイン名に置き換えます。
kubectl get ingを実行してドメイン名を取得できます。curl <ADDRESS>/hello期待される出力:
{"hello":"coffee"}
ヘルスチェックの設定
ALB Ingress はヘルスチェックをサポートしています。次のアノテーションを設定することで、ヘルスチェックを設定できます。
次のコードブロックは、アノテーションの例を示しています。
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:
... ...パラメーター | 説明 | デフォルト値 |
| バックエンドサーバーグループのヘルスチェックを有効にするかどうかを指定します。
|
|
| ヘルスチェックパス。 |
|
| ヘルスチェックに使用されるプロトコル。
|
|
| HTTP プロトコルバージョン。このパラメーターは、
|
|
| ヘルスチェックメソッド。
重要
|
|
| ヘルスチェックのステータスコード。バックエンドサーバーは、プローブリクエストが成功し、指定されたステータスコードを返した場合にのみ正常と見なされます。 次のオプションを 1 つ以上入力できます。複数のステータスコードはカンマ (,) で区切ります。
|
|
| ヘルスチェックのステータスコード。バックエンドサーバーは、プローブリクエストが成功し、指定されたステータスコードを返した場合にのみ正常と見なされます。このパラメーターを 利用可能なオプションは、
|
|
| ヘルスチェックのタイムアウト期間 (秒)。有効値は [1, 300] です。 |
|
| ヘルスチェック間隔 (秒)。有効値は [1, 50] です。 |
|
| バックエンドサーバーを正常と宣言するために必要な連続した成功したヘルスチェックの回数。有効値は [2, 10] です。 |
|
| バックエンドサーバーを異常と宣言するために必要な連続した失敗したヘルスチェックの回数。有効値は [2, 10] です。 |
|
| ヘルスチェックに使用されるポート。 |
説明
|
HTTP リクエストの HTTPS へのリダイレクト
アノテーション alb.ingress.kubernetes.io/ssl-redirect: "true" を ALB Ingress に追加して、HTTP リクエストを HTTPS ポート 443 にリダイレクトできます。
この機能は、リスナーポート 80 を使用する HTTP 転送ルールでのみ設定できます。
この機能は、カスタム転送アクション
RemoveHeader、InsertHeader、およびクロスドメインCorsに関連するアノテーションでのみ使用できます。このアノテーションを設定するには、AlbConfig でポート 443 の HTTPS リスナーが設定されていることを確認する必要があります。詳細については、「AlbConfig を介した ALB リスナーの設定」をご参照ください。
Kubernetes 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: ClusterIP
---
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: PrefixKubernetes バージョン 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: ClusterIP
---
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バックエンドの HTTPS および gRPC プロトコルのサポート
ALB は、バックエンドプロトコルとして HTTPS と gRPC をサポートしています。これらを使用するには、Ingress に次のアノテーションを追加します。
Ingress が作成された後、バックエンドプロトコルは変更できません。プロトコルを変更するには、Ingress を削除して新しいものを作成する必要があります。
パラメーター | 説明 | YAML の例 |
|
| |
正規表現の設定
alb.ingress.kubernetes.io/use-regex: "true" アノテーションを使用して正規表現モードを有効にできます。その後、カスタム転送条件またはアクションで正規表現を設定できます。
このアノテーションは、pathType: Prefix を持つパスルールにのみ適用されます。
パラメーター | 説明 | |
| 正規表現を有効にします。 | |
| カスタム転送条件を設定します。詳細については、「転送条件」をご参照ください。
|
正規表現の一致ルール:
一致オブジェクト | プレフィックス | ルールの例 | クライアントパス | 一致しますか? | 説明 |
ドメイン名 |
|
| test.EXAMPLE.com | はい | ドメイン名は、大文字と小文字を区別しない正規表現の一致をサポートします。 |
パス |
|
| /API | はい | パスは、大文字と小文字を区別しない正規表現の一致をサポートします。 |
|
| /Api | いいえ | パスは、大文字と小文字を区別する正規表現の一致をサポートします。 |
書き換えの設定
ALB Ingress は書き換え機能をサポートしています。ALB Ingress がクライアントリクエストを受信した後、リクエストのパスを変更してから、リクエストをバックエンド Service に送信します。書き換えは、次の 2 つのアノテーションを使用して実装されます。
alb.ingress.kubernetes.io/rewrite-target: /<path>/${number}:書き換えを有効にし、書き換えられたパスを指定します。重要${number}形式を使用して、正規表現を使用して元のパスから取得される変数を表します。${1}、${2}、または${3}などの 1 つ以上の変数を設定できます。元のパスから最大 3 つの変数を取得できます。Ingress の
pathTypeはPrefixに設定する必要があります。
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 番目のキャプチャグループのコンテンツ) です。次の表は、パスの書き換え効果を示しています。
元のクライアントパス | パスの正規表現に一致しますか? | 書き換えられたパス |
| 一致しました。2 番目のキャプチャグループは空です。 |
|
| 一致しました。2 番目のキャプチャグループは空です。 |
|
| 一致しました。2 番目のキャプチャグループのコンテンツは |
|
| 一致しません。この例では、ルーティングルールが一致せず、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 つのセグメントが明示的に必要です。この方法では、クライアントが固定のパス形式を使用する必要があります。
元のクライアントパス | パスの正規表現に一致しますか? | 書き換えられたパス |
| 一致しました。2 番目のキャプチャグループのコンテンツは |
|
| 一致しました。2 番目のキャプチャグループのコンテンツは |
|
| 一致しません。この例では、ルーティングルールが一致せず、ALB Ingress は 503 ステータスコードを返します。 | |
| 一致しません。この例では、ルーティングルールが一致せず、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 番目のキャプチャグループのコンテンツ) です。次の表は、パスの書き換え効果を示しています。
元のクライアントパス | パスの正規表現に一致しますか? | 書き換えられたパス |
| 一致しました。2 番目のキャプチャグループのコンテンツは |
|
| 一致しました。2 番目のキャプチャグループのコンテンツは |
|
| 一致しました。2 番目のキャプチャグループは空です。 |
|
| 一致しません。この例では、ルーティングルールが一致せず、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} を例として使用します。
次のサンプルコマンドを
path2.txtに保存します。/items/electronics/computers/554 /items/produce/fruits/12 /items/headphones/5 /drinks/41パスが一致するかどうかを確認し、書き換えられたパスを表示します。
次のコマンドでは、例のパス正規表現 (
/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) の両方を同時に公開できます。
ALB は、Ingress で直接新しいリスナーを作成することをサポートしていません。Ingress が期待どおりに機能するようにするには、まず AlbConfig で必要なリスナーポートとプロトコルを作成する必要があります。その後、Ingress でこれらのリスナーをサービスに関連付けることができます。ALB リスナーの作成方法については、「AlbConfig を介した ALB リスナーの設定」をご参照ください。
パラメーター | 説明 | YAML の例 |
| サービスがポート 80 とポート 443 の両方でリッスンするようにします。 | |
転送ルールの優先度の設定
デフォルトでは、ALB 転送ルールの優先度は次のようにソートされます。
異なる Ingress は、
namespace/nameの辞書順でソートされます。辞書順が小さいほど、優先度が高くなります。まず namespace が比較されます。namespace が同じ場合は、name が文字ごとに比較されます。
同じ Ingress 内では、ルールは
ruleフィールドでの順序でソートされます。先に設定されたルールほど優先度が高くなります。rules: - host: www.example.com http: ... - host: www.test.com http: ...
Ingress の namespace/name フィールドを変更しない場合は、次の Ingress アノテーションを設定して、ALB 転送ルールの優先度を定義できます。
パラメーター | 説明 | 有効値 | YAML の例 |
| ALB 転送ルールの優先度を定義します。値が小さいほど、優先度が高くなります。 同じリスナー内のルールの優先度は一意でなければなりません。 | [1,1000] デフォルト値:10 | |
アノテーションを使用した段階的リリースの実装
ALB は複雑なルーティングをサポートし、ヘッダー、Cookie、および重みに基づいて段階的リリース機能を提供します。次のアノテーションを設定して、さまざまな段階的リリースポリシーを柔軟に実装できます。段階的リリースのベストプラクティスに関する詳細については、「ALB Ingress を介した段階的リリースの実装」をご参照ください。
パラメーター | 説明 | 説明 |
| 段階的リリース機能を有効にします。 |
|
指定されたヘッダーに基づいてカナリアトラフィックを割り当てる
パラメーター
説明
YAML の例
alb.ingress.kubernetes.io/canary-by-headerこのルールを使用すると、リクエストヘッダーとそれに対応する値をカスタマイズできます。両方のアノテーションを設定する必要があります。
リクエストの
headerとheader-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が含まれている場合、トラフィックはカナリアサービスにルーティングされます。他のリクエストは、カナリアの重みポリシーに基づいてカナリアサービスに割り当てられます。以下は設定例です。指定された Cookie に基づいてカナリアトラフィックを割り当てる
パラメーター
Cookie の値
YAML の例
alb.ingress.kubernetes.io/canary-by-cookiealways:すべてのリクエストトラフィックがカナリアサービスのエンドポイントに割り当てられます。never:リクエストトラフィックはカナリアサービスのエンドポイントに割り当てられません。
Cookie ベースのカナリアリリースはカスタム設定をサポートしておらず、
alwaysとneverのみです。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 の例
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% に設定します。
アノテーションを使用したセッション維持の実装
ALB Ingress は、次のアノテーションを介してセッション維持をサポートしています。
次のコードブロックは、アノテーションの例を示しています。
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:
... ...パラメーター | 説明 | デフォルト値 |
| セッション維持を有効にするかどうかを指定します。
|
|
| Cookie の処理方法。
説明 このパラメーターは、サーバーグループの |
|
| Cookie のタイムアウト期間 (秒)。有効値は [1, 86400] です。 このアノテーションは、 | 1000 |
| カスタム Cookie の値。 このアノテーションは、 | "" |
バックエンドサーバーグループのロードバランシングアルゴリズムの指定
ALB Ingress は、次のアノテーションを使用してバックエンドサーバーグループのロードバランシングアルゴリズムを指定できます。指定可能な値とその説明は、次の表に示されています。
パラメーター | 値 | 説明 | |
|
| 重み付けラウンドロビン。重みが大きいバックエンドサーバーほど、ポーリングされる可能性が高くなります (デフォルト値)。 | |
| ポーリングは、各バックエンドサーバーに設定された重み値と、バックエンドサーバーの実際の負荷 (接続数) に基づいて行われます。重みが同じ場合、接続数が少ないサーバーが優先されます。 | ||
| ソース IP の一貫性ハッシュ。リクエストは、クライアントのソース IP のハッシュに基づいて分散されます。同じ IP アドレスからのリクエストは、同じバックエンドサーバーに割り当てられます。 | ||
| URL パラメーターの一貫性ハッシュ。 |
クロスドメインアクセスの設定
次のコードブロックは、ALB Ingress がサポートするクロスオリジンリソース共有 (CORS) の設定例を示しています。
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"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloud-nodeport
port:
number: 80パラメーター | 説明 |
| ブラウザを使用してリソースにアクセスすることが許可されているサイト。複数のサイトはカンマ (,) で区切ります。値は http:// または https:// で始まり、その後に有効なドメイン名またはトップレベルのワイルドカードドメイン名が続く必要があります。デフォルト値: |
| 許可されるクロスドメインメソッド。値は大文字と小文字を区別しません。複数のメソッドはカンマ (,) で区切ります。 デフォルト値: |
| 許可されるクロスドメインリクエストヘッダー。ヘッダーには、文字、数字、アンダースコア (_)、およびハイフン (-) のみを含めることができます。複数のヘッダーはカンマ (,) で区切ります。 デフォルト値: |
| 公開できるヘッダーのリスト。ヘッダーには、文字、数字、アンダースコア (_)、ハイフン (-)、およびアスタリスク (*) を含めることができます。複数のヘッダーはカンマ (,) で区切ります。 デフォルト値: |
| クロスドメインリクエストで資格情報を持ち運ぶことを許可するかどうかを指定します。 デフォルト値: |
| 単純でないリクエストの場合、ブラウザでの OPTIONS プリフライトリクエストの最大キャッシュ時間 (秒) を設定します。有効値:[-1, 172800]。 デフォルト値: |
永続的なバックエンド接続の設定
従来のロードバランサーは、バックエンドサーバーグループにアクセスするために短命な接続を使用します。各リクエストは TCP 接続を作成およびクローズするため、パフォーマンス専有型システムではボトルネックになる可能性があります。永続的なバックエンド接続は、接続リソースの消費を大幅に削減し、処理パフォーマンスを向上させます。alb.ingress.kubernetes.io/backend-keepalive アノテーションを追加することで、ALB Ingress で永続的なバックエンド接続を有効にできます。以下はサンプル設定です。
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: 80QPS レート制限のサポート
ALB は、転送ルールの秒間クエリ数 (QPS) 制限をサポートしています。QPS 制限は 1 から 100,000 までの値でなければなりません。ALB Ingress で QPS 制限を有効にするには、alb.ingress.kubernetes.io/traffic-limit-qps アノテーションを追加します。以下はサンプル設定です。
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バックエンドのスロースタート
新しい Pod が Service バックエンドに追加された後、ALB Ingress がすぐに新しい Pod にトラフィックを割り当てると、一時的に CPU やメモリの負荷が高まり、アクセス例外が発生する可能性があります。スロースタートを使用すると、ALB Ingress は徐々に新しい Pod にトラフィックを転送し、突然のトラフィックバーストの影響を緩和できます。次のコードブロックは、サンプル設定を示しています。
パラメーター | 説明 | YAML の例 |
| スロースタート機能を有効にするかどうかを指定します。デフォルトでは無効になっています。
| |
| スロースタートが完了した後にトラフィックが徐々に増加する時間が長いほど、トラフィックの増加率は遅くなります。このパラメーターは秒 (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 の例 |
| 接続ドレインを有効にするかどうかを指定します。デフォルトでは無効になっています。
| |
| 接続ドレインのタイムアウト期間 (秒)。有効値は [0, 900] で、デフォルト値は 300 秒です。 |