藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權

管理服務帳戶服務帳戶的 IAM 角色了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權

服務帳戶字符

在 Kubernetes 版本中預設會啟用 BoundServiceAccountTokenVolume 功能。此功能允許在 Kubernetes 上執行的工作負載請求對象、時間和金鑰綁定的 JSON Web 字符,從而提升服務帳戶字符的安全性。服務帳戶字符的過期時間為一小時。在舊版 Kubernetes 版本中,字符沒有過期。這表示仰賴這些字符的客戶端必須在一小時內重新整理字符。以下 Kubernetes 用戶端 SDK 會在要求的時間範圍內自動重新整理字符:

  • Go 版本 0.15.7 和更新版本

  • Python 版本 12.0.0 和更新版本

  • Java 版本 9.0.0 和更新版本

  • JavaScript 版本 0.10.3 和更新版本

  • Ruby master 分支

  • Haskell 版本 0.3.0.0

  • C# 7.0.5 版及更新版本

如果工作負載使用較早的客戶端版本,則必須進行更新。為使客戶端順暢移轉到更新的限時服務帳戶字符,Kubernetes 對服務帳戶字符新增了超過預設的一小時的延長到期期間。針對 Amazon EKS 叢集,延長的到期期間為 90 天。您的 Amazon EKS 叢集的 Kubernetes API 伺服器拒絕超過 90 天的字符的請求。我們建議您檢查應用程式及其相依性,以確保 Kubernetes 用戶端開發套件與先前列出的版本相同或為更新版本。

當 API 服務器收到使用超過一小時的字符的請求時,它會使用 annotations.authentication.k8s.io/stale-token 註釋 API 稽核日誌事件。註釋的值如下範例所示:

subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.

如果您的叢集啟用了控制平面記錄,則註釋位於稽核日誌中。您可以使用下列 CloudWatch Logs Insights 查詢以識別使用過時字符的 Amazon EKS 叢集中的所有 Pod:

fields @timestamp |filter @logStream like /kube-apiserver-audit/ |filter @message like /seconds after warning threshold/ |parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime

subject 指的是該 Pod 使用的服務帳戶。elapsedtime 表示讀取最新字符後的經過時間(以秒為單位)。當 elapsedtime 超過 90 天 (7,776,000 秒),對 API 伺服器的請求將遭到拒絕。您應主動更新應用程式的 Kubernetes 用戶端 SDK,以使用先前列出的自動重新整理字符的版本之一。如果您使用的服務帳戶字符接近 90 天,並且沒有足夠的時間在字符過期前更新客戶端 SDK 版本,則可以終止現有 Pod 並建立新 Pod。這會導致重新擷取服務帳戶字符,進而給您額外的 90 天來更新的客戶端版本 SDK。

如果 Pod 為部署的一部分,則在維持高可用性的同時終止 Pod 的建議方法是使用以下命令執行推出。使用您的部署名稱替換 my-deployment (我的部署)。

kubectl rollout restart deployment/my-deployment

叢集附加元件

下列叢集附加元件已更新以使用自動重新擷取服務帳戶字符的 Kubernetes 客戶端 SDK。建議您確保已在叢集上安裝列出的版本或更新版本。

授予 AWS Identity and Access Management 許可給 Amazon Elastic Kubernetes Service 叢集上的工作負載

Amazon EKS 提供兩種授予 AWS Identity and Access Management 許可給在 Amazon EKS 叢集中執行的工作負載的方式:服務帳戶的 IAM 角色EKS Pod 身分識別

服務帳戶的 IAM 角色

服務帳戶的 IAM 角色 (IRSA) 可設定執行在 AWS 上的 Kubernetes 應用程式,使用精細的 IAM 許可來存取各種其他 AWS 資源,例如 Amazon S3 儲存貯體、Amazon DynamoDB 資料表等等。您可以在同一個 Amazon EKS 叢集中同時執行多個應用程式,並確保每個應用程式只有其所需的最低許可集。IRSA 是為了支援各種 Kubernetes 部署選項而建置,這些選項均受到 AWS 的支援,例如 Amazon EKS、Amazon EKS Anywhere、Red Hat OpenShift Service on AWS 和 Amazon EC2 執行個體上的自我管理 Kubernetes 叢集。因此,IRSA 是使用基礎 AWS 服務 (例如 IAM) 所建置,不會對 Amazon EKS 服務和 EKS API 產生任何直接相依性。如需詳細資訊,請參閱 服務帳戶的 IAM 角色

EKS Pod 身分識別

EKS Pod 身分識別為叢集管理員提供簡化的工作流程,以驗證應用程式來存取各種其他 AWS 資源,例如 Amazon S3 儲存貯體、Amazon DynamoDB 資料表等等。EKS Pod 身分識別僅適用於 EKS,因此可簡化叢集管理員設定 Kubernetes 應用程式以取得 IAM 許可的方式。現在可以直接透過 AWS 管理主控台、EKS API 和 AWS CLI 以較少的步驟輕鬆設定這些許可,而且在任何 Kubernetes 物件中都不需要在叢集內採取任何動作。叢集管理員不需要在 EKS 和 IAM 服務之間切換,也不需要使用特殊權限 IAM 操作來設定應用程式所需的許可。IAM 角色現在可跨多個叢集使用,無需在建立新叢集時更新角色信任政策。EKS Pod 身分識別提供的 IAM 憑證包含角色工作階段標籤,並具有叢集名稱、命名空間、服務帳戶名稱等屬性。角色工作階段標籤可讓管理員編寫可跨服務帳戶使用的單一角色,方法是允許根據相符標籤存取 AWS 資源。如需詳細資訊,請參閱 了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權

比較 EKS Pod 身分識別和 IRSA

整體上來說,EKS Pod 身分識別和 IRSA 都可讓您將 IAM 許可授予在 Kubernetes 叢集上執行的應用程式。但是,它們在設定方式、支援的限制和啟用的功能完全不同。下面,我們比較兩種解決方案的一些關鍵面向。

注意

AWS 建議儘可能使用 EKS Pod 身分識別,向 Pod 授予對 AWS 資源的存取權。如需詳細資訊,請參閱 了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權

屬性 EKS Pod 身分識別 IRSA

角色擴充性

您必須設定每個角色一次,才能與新推出的 Amazon EKS 服務主體 pods.eks.amazonaws.com 建立信任。完成此一次性步驟之後,您不需要每次在新叢集中使用角色的信任政策時更新該政策。

每次要在新叢集中使用 IAM 角色時,您都必須使用新的 EKS 叢集 OIDC 提供者端點更新該角色的信任政策。

叢集可擴展性

EKS Pod 身分識別不需要使用者設定 IAM OIDC 提供者,因此不適用此限制。

每個 EKS 叢集具有與其相關聯的 OpenID Connect (OIDC) 發行者 URL。若要使用 IRSA,則必須為 IAM 中的每個 EKS 叢集建立唯一的 OpenID Connect 提供者。IAM 的預設全域限制為每個 AWS 帳戶 100 個 OIDC 提供者。如果您計劃每個具有 IRSA 的 AWS 帳戶都有超過 100 個 EKS 叢集,則您會達到 IAM OIDC 提供者限制。

角色可擴展性

EKS Pod 身分識別不需要使用者在信任政策中定義 IAM 角色和服務帳戶之間的信任關係,因此不適用此限制。

在 IRSA 中,您可以在角色的信任政策中定義 IAM 角色和服務帳戶之間的信任關係。根據預設,信任政策大小的長度為 2048。這表示您通常可以在單一信任政策中定義 4 個信任關係。雖然您可以提高信任政策長度限制,但在單一信任政策中,您通常只能使用最多 8 個信任關係。

STS API 配額用量

EKS Pod 身分識別能簡化交付 AWS 憑證至 Pod 的程序,並且無須程式碼透過 AWS Security Token Service (STS) 直接呼叫。EKS 服務可處理角色擔任,無須 Pod 與 AWS STS 通訊或使用 STS API 配額,即可交付憑證至使用 Pod 中的 AWS SDK 撰寫的應用程式。

在 IRSA 中,使用 Pod 中的 AWS SDK 撰寫的應用程式,藉助記號來呼叫 AWS Security Token Service (STS) 上的 AssumeRoleWithWebIdentity API。視乎 AWS SDK 程式碼的邏輯,程式碼可能會對 AWS STS 做出不必要的呼叫及接收限流錯誤。

角色可重複使用性

EKS Pod 身分識別提供的 AWS STS 臨時憑證包含角色工作階段標籤,例如叢集名稱、命名空間、服務帳戶名稱。角色工作階段標籤可讓管理員編寫可搭配多個服務帳戶使用的單一 IAM 角色,並具有不同的有效許可,方法是允許根據連接至它們的標籤存取 AWS 資源。這也稱為屬性型存取控制 (ABAC)。如需詳細資訊,請參閱 根據標籤授予 Pod 對 AWS 資源的存取權

AWS STS 工作階段標籤不受支援。您可以在叢集之間重複使用角色,但是每個 Pod 都會收到該角色的所有許可。

支援的環境

EKS Pod 身分識別僅適用於 Amazon EKS。

IRSA 可用於 Amazon EKS、Amazon EKS Anywhere、Red Hat OpenShift Service on AWS,以及 Amazon EC2 執行個體上的自我管理 Kubernetes 叢集。

支援 EKS 版本

所有支援的 EKS 叢集版本。如需特定平台版本,請參閱 EKS Pod 身分識別叢集版本

所有支援的 EKS 叢集版本。