ACK クラスターでは、ALB Ingress は外部からアクセス可能な API オブジェクトを管理することで、サービスにレイヤー 7 のロードバランシングを提供します。このトピックでは、ALB Ingress を使用して、異なるドメイン名や URL パスからのリクエストを異なるバックエンドサーバーグループに転送する方法、HTTP リクエストを HTTPS にリダイレクトする方法、および段階的リリースなどの機能の実装方法について説明します。
インデックス
機能分類 | 設定例 |
ALB Ingress の設定 | ヘルスチェックの設定 |
ポート/プロトコルの設定 | |
転送ルールの設定 | |
高度な設定 | |
ドメイン名に基づくリクエストの転送
シンプルな Ingress を作成して、指定された標準ドメイン名または空のドメイン名に基づいてリクエストを転送できます。以下のセクションで例を示します。
標準ドメイン名に基づくリクエストの転送
以下の YAML の例では、ルーティングパスは /hello に設定されています。demo.domain.ingress.top/hello へのリクエストはバックエンドサービスに転送されます。
以下のテンプレートをデプロイして、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
次のコマンドを実行して、指定された標準ドメイン名を使用してサービスにアクセスします。
ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。
curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello
想定される出力:
{"hello":"coffee"}
空のドメイン名に基づくリクエストの転送
以下の YAML の例では、ドメイン名は空で、ルーティングパスは /hello に設定されています。<ADDRESS>/hello へのリクエストはバックエンドサービスに転送されます。
以下のテンプレートをデプロイして 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
次のコマンドを実行して、空のドメイン名を使用してサービスにアクセスします。
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 に設定されている場合、path を空でない絶対パスに設定する必要があります。そうしないと、検証の失敗により Ingress リソースを作成できません。
URL マッチングポリシーが競合する可能性があります。この場合、リクエストが転送される前に、転送ルールは優先順位に従ってソートされます。詳細については、「転送ルールの優先順位設定」をご参照ください。
以下のセクションでは、3 つのマッチングタイプの例を示します:
プレフィックス一致 (Prefix)
URL パスは、/ で区切られたパスセグメントを使用するプレフィックスマッチング方式を使用します。マッチングは大文字と小文字を区別し、パスセグメント内の各要素をセグメントごとに比較します。
以下の YAML の例では、ルーティングルールは / として設定されています。/hello のような / で始まるすべてのパスが一致します。
以下のテンプレートをデプロイして 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
次のコマンドを実行してサービスにアクセスします。
ADDRESS を ALB インスタンスのドメイン名に置き換えます。kubectl get ing を実行してドメイン名を取得できます。
curl <ADDRESS>/hello
想定される出力:
{"hello":"coffee"}
完全一致 (Exact) またはデフォルト (ImplementationSpecific)
以下の YAML の例では、ルーティングルールは /hello として設定されています。/hello パスのみが一致します。
以下のテンプレートをデプロイして 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
次のコマンドを実行してサービスにアクセスします。
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-protocol が HTTP または HTTPS に設定されている場合に有効です。 | HTTP1.1
|
alb.ingress.kubernetes.io/healthcheck-method
| ヘルスチェックメソッド。
重要 healthcheck-protocol が GRPC に設定されている場合は、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 転送ルールでのみ設定できます。
この機能は、カスタム転送アクション RemoveHeader、InsertHeader、およびクロスドメイン 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
| | 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 つのアノテーションを使用して実装されます:
設定例
シナリオ 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} を例として使用します:
次のサンプルコマンドを 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) の両方を同時に公開できます。
サンプル 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"
| 段階的リリース機能を有効にします。 | |
指定されたヘッダーに基づいてカナリアトラフィックを割り当てる
パラメーター | 説明 | YAML の例 |
alb.ingress.kubernetes.io/canary-by-header
| このルールを使用すると、リクエストヘッダーとそれに対応する値をカスタマイズできます。両方のアノテーションを設定する必要があります。 | 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
| 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 全文を展開して表示
バージョン 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
| セッション維持を有効にするかどうかを指定します。 | 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 はリクエストを以前に記録されたバックエンドサーバーに転送します。
説明 このパラメーターは、サーバーグループの StickySessionEnabled が true の場合に有効です。サーバーグループのパラメーターの詳細については、「サーバーグループの作成」をご参照ください。 | Insert
|
alb.ingress.kubernetes.io/cookie-timeout
| Cookie のタイムアウト期間 (秒)。値の範囲は [1, 86400] です。 このアノテーションは、sticky-session-type が Insert に設定されている場合に有効です。 | 1000 |
alb.ingress.kubernetes.io/cookie
| カスタム Cookie の値。 このアノテーションは、sticky-session-type が Server に設定されている場合は必須であり、空にすることはできません。 | "" |
バックエンドサーバーグループのロードバランシングアルゴリズムの指定
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-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-allow-credentials
| クロスドメインアクセス中に資格情報を携帯することを許可するかどうかを指定します。 | |
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
| | 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
| スロースタート機能を有効にするかどうかを指定します。デフォルトでは無効になっています。 | 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"
... ...
|