本主題描述部署 AWS Global Accelerator 以在多站點 Keycloak 部署之間路由流量的必要步驟。
此部署旨在與多站點部署的概念指南中描述的設定一起使用。請將此部署與多站點部署的建構區塊指南中概述的其他建構區塊一起使用。
我們提供這些藍圖,以展示一個最小功能完整範例,該範例具有常規安裝的良好基準效能。您仍然需要根據您的環境和組織的標準與安全最佳實務進行調整。 |
本指南描述如何部署 AWS Global Accelerator 執行個體,以處理多個可用區域 Keycloak 部署的 Keycloak 用戶端連線故障轉移。
為了確保使用者請求路由到每個 Keycloak 站點,我們需要利用負載平衡器。為了防止用戶端 DNS 快取問題,實作應使用靜態 IP 位址,該位址在將用戶端路由到兩個可用區域時保持不變。
在本指南中,我們將描述如何通過 AWS Global Accelerator 負載平衡器路由所有 Keycloak 用戶端請求。如果 Keycloak 站點發生故障,加速器會確保所有用戶端請求都路由到其餘健康的站點。如果兩個站點都被標記為不健康,則加速器將「故障開放」,並將請求轉發到隨機選擇的站點。
在兩個 ROSA 叢集上建立 AWS 網路負載平衡器 (NLB),以便使 Keycloak Pod 作為 AWS Global Accelerator 執行個體的端點可用。每個叢集端點都被分配一個權重 128(最大權重 255 的一半),以確保當兩個叢集都健康時,加速器流量會平均路由到兩個可用區域。
基於 ROSA 的多可用區域 Keycloak 部署
建立網路負載平衡器
在每個 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 | 與建立的加速器執行個體相關聯的 ARN,此 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 Loadbalancer。
建立或更新 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 | 停用預設入口,因為所有 Keycloak 存取都應通過佈建的 NLB |
為了確保請求轉發按預期工作,Keycloak CR 需要指定用戶端將通過其存取 Keycloak 執行個體的主機名稱。這可以是與 Global Accelerator 相關聯的 DualStackDnsName
或 DnsName
主機名稱。如果您使用自訂網域並將您的自訂網域指向 AWS Global Loadbalancer,請在此處使用您的自訂網域。
要驗證 Global Accelerator 是否已正確設定為連線到叢集,請瀏覽到上方設定的主機名稱,您應該會看到 Keycloak 管理主控台。