このトピックでは、マルチサイト Keycloak デプロイメント間でトラフィックをルーティングするために必要な AWS Global Accelerator をデプロイする手順について説明します。
このデプロイメントは、「マルチサイトデプロイメントの概念」ガイドで説明されているセットアップで使用することを目的としています。このデプロイメントは、「マルチサイトデプロイメントの構成要素」ガイドで概説されている他の構成要素とともに使用してください。
これらのブループリントは、通常のインストールで良好なベースラインパフォーマンスを備えた、機能的に完全な最小限の例を示すために提供されています。それでも、お客様の環境および組織の標準とセキュリティのベストプラクティスに合わせて調整する必要があります。 |
このガイドでは、複数のアベイラビリティーゾーンにまたがる Keycloak デプロイメントに対する Keycloak クライアント接続のフェイルオーバーを処理するために、AWS Global Accelerator インスタンスをデプロイする方法について説明します。
ユーザーリクエストが各 Keycloak サイトにルーティングされるようにするには、ロードバランサーを利用する必要があります。クライアント側の DNS キャッシュの問題を防ぐために、実装では、クライアントを両方のアベイラビリティーゾーンにルーティングする際に同じままの静的 IP アドレスを使用する必要があります。
このガイドでは、すべての Keycloak クライアントリクエストを AWS Global Accelerator ロードバランサー経由でルーティングする方法について説明します。Keycloak サイトで障害が発生した場合、Accelerator はすべてのクライアントリクエストが残りの正常なサイトにルーティングされるようにします。両方のサイトが異常とマークされている場合、Accelerator は「フェイルオープン」し、ランダムに選択されたサイトにリクエストを転送します。
Keycloak ポッドを AWS Global Accelerator インスタンスのエンドポイントとして利用できるようにするために、AWS Network Load Balancer (NLB) が両方の ROSA クラスターに作成されます。各クラスターエンドポイントには、128 (最大ウェイト 255 の半分) のウェイトが割り当てられ、両方のクラスターが正常な場合にアクセラレータートラフィックが両方のアベイラビリティーゾーンに均等にルーティングされるようにします。
Network Load Balancer の作成
各 Keycloak クラスターで以下を実行します
ROSA クラスターにログインします
Kubernetes ロードバランサーサービスを作成します
cat <<EOF | kubectl apply -n $NAMESPACE -f - (1)
apiVersion: v1
kind: Service
metadata:
name: accelerator-loadbalancer
annotations:
service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: accelerator=${ACCELERATOR_NAME},site=${CLUSTER_NAME},namespace=${NAMESPACE} (2)
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/lb-check"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "https"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "10" (3)
service.beta.kubernetes.io/aws-load-balancer-healthcheck-healthy-threshold: "3" (4)
service.beta.kubernetes.io/aws-load-balancer-healthcheck-unhealthy-threshold: "3" (5)
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: 8443
selector:
app: keycloak
app.kubernetes.io/instance: keycloak
app.kubernetes.io/managed-by: keycloak-operator
sessionAffinity: None
type: LoadBalancer
EOF
1 | $NAMESPACE は Keycloak デプロイメントの名前空間に置き換える必要があります |
2 | 後で取得できるように、AWS によって作成されたリソースに追加のタグを追加します。ACCELERATOR_NAME は、後続のステップで作成される Global Accelerator の名前にする必要があります。また、CLUSTER_NAME は現在のサイトの名前にする必要があります。 |
3 | ヘルスチェックプローブが実行される頻度(秒単位) |
4 | NLB が正常と見なされるためにパスする必要があるヘルスチェックの回数 |
5 | NLB が異常と見なされるために失敗する必要があるヘルスチェックの回数 |
DNS ホスト名をメモしておきます。これは後で必要になります
kubectl -n $NAMESPACE get svc accelerator-loadbalancer --template="{{range .status.loadBalancer.ingress}}{{.hostname}}{{end}}"
abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com
Global Accelerator インスタンスを作成します
aws globalaccelerator create-accelerator \
--name example-accelerator \ (1)
--ip-address-type DUAL_STACK \ (2)
--region us-west-2 (3)
1 | 作成するアクセラレータの名前。必要に応じて更新してください |
2 | 'DUAL_STACK' または 'IPV4' を指定できます |
3 | すべての globalaccelerator コマンドはリージョン 'us-west-2' を使用する必要があります |
{
"Accelerator": {
"AcceleratorArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71", (1)
"Name": "example-accelerator",
"IpAddressType": "DUAL_STACK",
"Enabled": true,
"IpSets": [
{
"IpFamily": "IPv4",
"IpAddresses": [
"75.2.42.125",
"99.83.132.135"
],
"IpAddressFamily": "IPv4"
},
{
"IpFamily": "IPv6",
"IpAddresses": [
"2600:9000:a400:4092:88f3:82e2:e5b2:e686",
"2600:9000:a516:b4ef:157e:4cbd:7b48:20f1"
],
"IpAddressFamily": "IPv6"
}
],
"DnsName": "a099f799900e5b10d.awsglobalaccelerator.com", (2)
"Status": "IN_PROGRESS",
"CreatedTime": "2023-11-13T15:46:40+00:00",
"LastModifiedTime": "2023-11-13T15:46:42+00:00",
"DualStackDnsName": "ac86191ca5121e885.dualstack.awsglobalaccelerator.com" (3)
}
}
1 | 作成された Accelerator インスタンスに関連付けられた ARN。これは後続のコマンドで使用されます |
2 | IPv4 Keycloak クライアントが接続する必要がある DNS 名 |
3 | IPv6 Keycloak クライアントが接続する必要がある DNS 名 |
アクセラレータのリスナーを作成します
aws globalaccelerator create-listener \
--accelerator-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71' \
--port-ranges '[{"FromPort":443,"ToPort":443}]' \
--protocol TCP \
--region us-west-2
{
"Listener": {
"ListenerArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40",
"PortRanges": [
{
"FromPort": 443,
"ToPort": 443
}
],
"Protocol": "TCP",
"ClientAffinity": "NONE"
}
}
リスナーのエンドポイントグループを作成します
CLUSTER_1_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \
--query "LoadBalancers[?DNSName=='abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \ (1)
--region eu-west-1 \ (2)
--output text
)
CLUSTER_2_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \
--query "LoadBalancers[?DNSName=='a1c76566e3c334e4ab7b762d9f8dcbcf-985941f9c8d108d4.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \ (1)
--region eu-west-1 \ (2)
--output text
)
ENDPOINTS='[
{
"EndpointId": "'${CLUSTER_1_ENDPOINT_ARN}'",
"Weight": 128,
"ClientIPPreservationEnabled": false
},
{
"EndpointId": "'${CLUSTER_2_ENDPOINT_ARN}'",
"Weight": 128,
"ClientIPPreservationEnabled": false
}
]'
aws globalaccelerator create-endpoint-group \
--listener-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40' \ (2)
--traffic-dial-percentage 100 \
--endpoint-configurations ${ENDPOINTS} \
--endpoint-group-region eu-west-1 \ (3)
--region us-west-2
1 | クラスターの NLB の DNS ホスト名 |
2 | 前のステップで作成したリスナーの ARN |
3 | これはクラスターをホストする AWS リージョンである必要があります |
{
"EndpointGroup": {
"EndpointGroupArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40/endpoint-group/2581af0dc700",
"EndpointGroupRegion": "eu-west-1",
"EndpointDescriptions": [
{
"EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/abab80a363ce8479ea9c4349d116bce2/6b65e8b4272fa4b5",
"Weight": 128,
"HealthState": "HEALTHY",
"ClientIPPreservationEnabled": false
},
{
"EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/a1c76566e3c334e4ab7b762d9f8dcbcf/985941f9c8d108d4",
"Weight": 128,
"HealthState": "HEALTHY",
"ClientIPPreservationEnabled": false
}
],
"TrafficDialPercentage": 100.0,
"HealthCheckPort": 443,
"HealthCheckProtocol": "TCP",
"HealthCheckPath": "undefined",
"HealthCheckIntervalSeconds": 30,
"ThresholdCount": 3
}
}
オプション: カスタムドメインの設定
カスタムドメインを使用している場合は、カスタムドメインでエイリアスまたは CNAME を設定して、カスタムドメインを AWS Global Load Balancer にポイントします。
Keycloak デプロイメントの作成または更新
各 Keycloak クラスターで以下を実行します
ROSA クラスターにログインします
Keycloak CR に次の構成があることを確認します
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: keycloak
spec:
hostname:
hostname: $HOSTNAME (1)
ingress:
enabled: false (2)
1 | クライアントが Keycloak に接続するために使用するホスト名 |
2 | プロビジョニングされた NLB 経由ですべての Keycloak アクセスを行う必要があるため、デフォルトのイングレスを無効にします |
リクエスト転送が期待どおりに機能するようにするには、Keycloak CR で、クライアントが Keycloak インスタンスにアクセスするためのホスト名を指定する必要があります。これは、Global Accelerator に関連付けられた DualStackDnsName
または DnsName
ホスト名のいずれかです。カスタムドメインを使用している場合は、カスタムドメインを AWS Global Accelerator にポイントし、ここでカスタムドメインを使用します。
Global Accelerator がクラスターに接続するように正しく構成されていることを検証するには、上記で構成したホスト名に移動すると、Keycloak 管理コンソールが表示されるはずです。