如何防止系統還原 Amazon EKS 內負載平衡器上的安全群組規則、接聽程式或其他變更?

2 分的閱讀內容
0

當我嘗試對 Amazon Elastic Kubernetes Service (Amazon EKS) 的負載平衡器進行變更時,變更會自動還原。

簡短說明

當您使用 AWS 負載平衡器控制器建立負載平衡服務或輸入資源時,控制器會設定許多預設參數。這包括您未在清單檔案中指定的任何參數,例如運作狀態檢查路徑、預設逾時或安全群組規則。

不過,您可以使用 AWS API 呼叫直接變更預設組態。您可以從 Amazon Elastic Compute Cloud (Amazon EC2) 主控台、AWS Command Line Interface (AWS CLI) 或其他第三方工具進行此 API 呼叫。在此情況下,控制器會在下次叢集協調期間將這些變更還原為其原始值。如需詳細資訊,請參閱 Kubernetes 叢集 API 網站上的控制器與協調

下列問題通常是因為 Amazon EKS 中還原的負載平衡器變更而發生:

  • 負載平衡器的自訂安全群組規則自動還原為 0.0.0.0/0 或消失。
  • 負載平衡器自動刪除或新增接聽程式規則。
  • 自訂閒置逾時值自動還原為預設值。
  • 憑證自動還原為之前的版本。
  • 由於 Amazon EKS 還原運作狀態檢查路徑值,導致您無法更新路徑。
  • Amazon EKS 透過負載平衡器屬性修改角色。

若要疑難排解這些問題,請先確定造成負載平衡器進行這些變更的原因。具體來說,請找到遭變更資源的相關 API 呼叫,以及用於執行呼叫的工具。然後,請在清單檔案中實作變更。

**注意:**在下列解決方法中,「負載平衡器」是指負載平衡服務,例如 Network Load Balancer 或 Classic Load Balancer。負載平衡器也可能是輸入資源,例如 Application Load Balancer。

解決方法

若要定義負載平衡器的預期狀態,您必須在清單檔案的註釋中指定變更。否則,註釋會強制將變更還原為未變更的預設值。

若您試圖使用 AWS API 呼叫直接變更這些值,控制器會將其視為頻外變更。在下次協調期間,控制器會將變更還原為原始值,以便與您的 Kubernetes 服務清單檔案組態同步。視控制器還原的屬性而定,這可能導致您的服務長時間停機。

AWS 負載平衡器控制器使用多個邏輯路徑進行協調。下列情況可能導致 aws-load-balancer-controller Pod 重新啟動:

  • 控制平面、工作節點或平台升級
  • 由於硬體故障或運作狀態問題等基礎問題,導致執行個體重新整理
  • 在控制器 Pod 上導致更新、刪除或修補程式 API 呼叫的任何活動
  • 自動定期協調
    **注意:**依預設,控制器的協調期間為 1 小時。然而,此功能不適用於 Amazon EKS 2.4.7 及更早版本。

在這些情況下,AWS 負載平衡器控制器會啟動協調,而您的負載平衡器會參照最近的清單檔案組態。若您先前透過 API 呼叫對負載平衡器進行任何變更,則這些變更會還原。

識別變更來源

尋找與更新資源相關的 API 呼叫。在 AWS CloudTrail 中搜尋發生變更的時間範圍。若要查看所有 AWS 負載平衡器 API 呼叫,請參閱 Elastic Load Balancing (ELB) API 參考資料。若要查看 Amazon EC2 API 呼叫,請參閱 Amazon EC2 API 參考資料

例如,如果控制器還原 SecurityGroup 規則,您會看到系統叫用 API RevokeSecurityGroupIngress。然後您便可使用對應的 CloudTrail 事件來識別 API 使用者。如果控制器使用 WorkerNode 角色,系統會顯示進行該 API 呼叫的節點角色:

....
"type": "AssumedRole",
"arn": "arn:aws:sts::***********:assumed-role/eksctl-mycluster-NodeInstanceRole/i-***********",
"sessionContext": {
    "sessionIssuer": {
        "type": "Role",
        "arn": "arn:aws:iam::***********:role/eksctl-mycluster-nodegr-NodeInstanceRole",
        "userName": "eksctl-mycluster-nodegr-NodeInstanceRole"
    },
    ...
    eventName ": "
    RevokeSecurityGroupIngress ",
    "userAgent": "elbv2.k8s.aws/v2.4.5 aws-sdk-go/1.42.27 (go1.19.3; linux; amd64)",
    "requestParameters": {
        "groupId": "sg-****",
        "ipPermissions": {
            "items": [{
                        "ipProtocol": "tcp",
                        "fromPort": 443,
                        "toPort": 443,
                        "groups": {},
                        "ipRanges": {
                            "items": [{
                                "cidrIp": "0.0.0.0/0"
                            }]
                        }]

如果您使用 AWS 負載平衡器控制器的專用角色,系統會顯示服務帳戶的 AWS Identity and Access Management (IAM) 角色。

避免不需要的變更

請勿對負載平衡器的任何參數進行頻外變更。這包括透過 Amazon EC2 主控台、AWS CLI,或直接呼叫 AWS API 的任何工具所執行的變更。

例如,您想更新安全群組規則。請使用 .spec.loadBalancerSourceRangesservice.beta.kubernetes.io/load-balancer-source-ranges 註釋。您可以使用這些註釋來限制負載平衡器的 CIDR IP 地址。如需有關這些註釋的詳細資訊,請參閱 AWS 負載平衡器控制器 GitHub 網站上的存取控制

請只使用清單檔案中的適當註釋來更新逾時值、運作狀態檢查路徑、憑證 ARN 和其他屬性。若要查看所有支援的服務和輸入註釋,請參閱 AWS 負載平衡器控制器 GitHub 網站上的服務註釋輸入註釋

AWS 官方
AWS 官方已更新 1 年前