協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權
服務帳戶字符
在 Kubernetes 版本中預設會啟用 BoundServiceAccountTokenVolume
-
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。建議您確保已在叢集上安裝列出的版本或更新版本。
-
適用於 Kubernetes 的 Amazon VPC CNI 外掛程式及指標輔助外掛程式
1.8.0版及更新版本。若要檢查目前版本或更新版本,請參閱 使用 Amazon VPC CNI 將 IP 指派給 Pod 和 cni-metrics-helper。 -
CoreDNS
1.8.4版及更新版本。若要檢查目前版本或更新版本,請參閱 管理 Amazon EKS 叢集中的 CoreDNS for DNS。 -
AWS Load Balancer 控制器
2.0.0版及更新版本。若要檢查目前版本或更新版本,請參閱 透過 AWS Load Balancer 控制器路由網際網路流量。 -
目前的
kube-proxy版本。若要檢查目前版本或更新版本,請參閱 在 Amazon EKS 叢集中管理 kube-proxy。 -
AWS for Fluent Bit 版本
2.25.0或更新版本。若要更新您的目前版本,請參閱 GitHub 上的 Releases(版本)。 -
Fluentd 映像 1.14.6-1.2
版或更新版本,以及適用於 Kubernetes 中繼資料的 Fluentd 篩選器外掛程式 2.11.1 版或更新版本。
授予 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 服務主體 |
每次要在新叢集中使用 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 角色和服務帳戶之間的信任關係。根據預設,信任政策大小的長度為 |
|
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) 上的 |
|
角色可重複使用性 |
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 叢集版本。 |