Container Service for Kubernetes (ACK) クラスターでは、ALB Ingress は API オブジェクトを管理してクラスター内のサービスを外部トラフィックに公開することで、レイヤー 7 ロードバランシングを提供します。このトピックでは、ALB Ingress を使用して、さまざまなドメイン名や URL パスからのリクエストを異なるバックエンドサーバーグループに転送する方法、HTTP リクエストを HTTPS にリダイレクトする方法、および段階的リリースなどの機能を実装する方法について説明します。
インデックス
機能分類 | 設定例 |
ALB Ingress の設定 | ヘルスチェックの設定 |
ポート/プロトコルの設定 | |
転送ルールの設定 | |
高度な設定 | |
ドメイン名に基づくリクエストの転送
シンプルな Ingress を作成して、指定したドメイン名または空のドメイン名に基づいてリクエストを転送できます。
標準ドメイン名に基づくリクエストの転送
次の YAML の例では、ルーティングパスを /hello に設定しています。クライアントが demo.domain.ingress.top/hello にアクセスすると、リクエストはバックエンドサービスに転送されます。
次のテンプレートをデプロイして、サービス、デプロイメント、および Ingress を作成します。これにより、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: NodePort
---
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: NodePort
---
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: NodePort
---
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: NodePort
---
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 の場合、このタイプは完全一致として機能します。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
backend:
service:
name: tea-svc
port:
number: 80
# コンテキストパスを設定
- path: /coffee
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 など、カスタム転送アクションに関連するアノテーションでのみ使用できます。
このアノテーションを設定するには、ポート 443 の HTTPS リスナーが AlbConfig で設定されていることを確認してください。詳細については、「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> を実際のサービス名に置き換えます。これは、以下の 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> を実際のサービス名に置き換えます。これは、以下の backend.service.name と同じである必要があります。
[{
"type": "Path", ## Host もサポートされています。
"pathConfig": {
"values": [
"~*/pathvalue1", ## 正規表現には、フラグとして ~* または ~ をプレフィックスとして付ける必要があります。~* または ~ の後の内容が有効な正規表現です。~* は大文字と小文字を区別する正規表現マッチを示し、~ は大文字と小文字を区別しない正規表現マッチを示します。
"/pathvalue2" ## 完全一致には ~* プレフィックスは不要です。
]
}
}]
... ...
|
alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>
| カスタム転送条件を設定します。詳細については、「転送条件」をご参照ください。 <YOUR-SVC-NAME> を実際のサービス名に置き換えます。これは、以下の backend.service.name と同じである必要があります。
|
正規表現のマッチングルール:
マッチングオブジェクト | プレフィックス | ルール例 | クライアントパス | 一致しますか? | 説明 |
ドメイン名 | ~ で始まる
| ~test.example.com
| test.EXAMPLE.com | はい | ドメイン名は、大文字と小文字を区別しない正規表現マッチングをサポートします。 |
パス | ~ で始まる
| ~/api
| /API | はい | パスは、大文字と小文字を区別しない正規表現マッチングをサポートします。 |
~* で始まる
| ~*/api
| /Api | いいえ | パスは、大文字と小文字を区別する正規表現マッチングをサポートします。 |
再書き込みの設定
ALB Ingress は再書き込み機能をサポートしています。クライアントリクエストを受信した後、リクエストのパスを変更し、バックエンドサービスにリクエストを送信します。再書き込みは、次の 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" # パスフィールドで正規表現の使用を許可します。
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/(.*)/(.*)/(.*) の複数の部分をキャプチャして再配置します。再書き込み後のパスは、/ (標準パスプレフィックス) + ${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" # パスフィールドで正規表現の使用を許可します。
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" # パスフィールドで正規表現の使用を許可します。
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 コマンドを使用して、クライアントが使用する特定のパスが `path` で設定された正規表現に一致するかどうかをテストし、新しい再書き込み後のパスを表示できます。
シナリオ 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 内では、ルールは rules フィールド内の順序でソートされます。先に現れるルールほど優先度が高くなります。
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 の挿入。クライアントが最初のリクエストを行うと、ロードバランサーはレスポンスに Cookie (SERVERID) を挿入します。クライアントがこの Cookie を使用して後続のリクエストを行うと、ロードバランサーは以前に記録されたバックエンドサーバーにリクエストを転送します。
Server:Cookie の書き換え。ロードバランサーがユーザーからのカスタム Cookie を検出すると、元の Cookie を書き換えます。クライアントが新しい Cookie を使用して後続のリクエストを行うと、ロードバランサーは以前に記録されたバックエンドサーバーにリクエストを転送します。
説明 このパラメーターは、サーバーグループの StickySessionEnabled が true に設定されている場合に有効になります。サーバーグループのパラメーターの詳細については、「CreateServerGroup」をご参照ください。 | 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: "許可されたクロスドメインのドメイン名"
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: "許可されたクロスドメインのドメイン名"
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 は転送ルールの 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 がサービスバックエンドに追加された後、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:スロースタート機能を無効にします。
| 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 サーバーグループのクロスゾーンロードバランシングを無効にすると、トラフィックは同じゾーン内のバックエンドサービス間でのみ分散されます。
重要 クロスゾーンロードバランシングを無効にするには、各ゾーンに利用可能なバックエンドサービスが設定されており、これらのサーバーに十分なリソースがあることを確認してください。サービスに影響を与えないように、この操作は慎重に行ってください。
次の例は、クロスゾーンロードバランシングを無効にする方法を示しています:
完全なサンプル 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"
... ...
|