本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Step Functions 建立和管理 Amazon EKS叢集
了解如何將 Step Functions 與 Amazon 整合EKS,以管理 Kubernetes 叢集。Step Functions 提供兩種類型的服務整合APIs,可與 Amazon Elastic Kubernetes Service 整合。其中之一可讓您使用 Amazon EKSAPIs來建立和管理 Amazon EKS叢集。另一個可讓您使用 Kubernetes 與叢集互動,API並在應用程式的工作流程中執行任務。
您可以使用 Kubernetes API整合與使用 Step Functions 建立的 Amazon EKS叢集、eksctl 工具或 Amazon EKS主控台
若要了解如何在 Step Functions 中整合 AWS 服務,請參閱 整合 服務和 將參數傳遞至 Step Functions API中的服務。
Optimized Amazon EKS整合的主要功能
-
支援執行任務 (.sync)整合模式。
-
請求回應 整合模式沒有最佳化。
-
不支援使用任務權杖等待回呼整合模式。
注意
Step Functions EKS整合僅支援APIs具有公有端點存取的 Kubernetes。根據預設,EKS叢集API伺服器端點具有公有存取。如需詳細資訊,請參閱《Amazon 使用者指南》中的 Amazon EKS叢集端點存取控制。 EKS
如果停止執行,Step Functions 不會自動終止 Amazon EKS叢集。如果您的狀態機器在 Amazon EKS叢集終止之前停止,您的叢集可能會無限期地繼續執行,並可能產生額外費用。若要避免這種情況,請確定您建立的任何 Amazon EKS叢集都已正確終止。如需詳細資訊,請參閱:
-
Amazon EKS使用者指南中的刪除叢集。
-
執行任務 (.sync) 服務整合模式。
注意
Step Functions 中任務的最大輸入或結果資料大小有配額。當您向另一個 服務傳送或接收資料時,這會限制您將 256 KiB 的資料做為 UTF-8 編碼字串。請參閱 狀態機器執行的相關配額。
Kubernetes API整合
Step Functions 支援下列 KubernetesAPIs:
RunJob
eks:runJob
服務整合可讓您在 Amazon EKS叢集上執行任務。eks:runJob.sync
變體可讓您等待任務完成,以及選擇性地擷取日誌。
您的 Kubernetes API 伺服器必須將許可授予狀態機器所使用的IAM角色。如需詳細資訊,請參閱許可。
對於執行任務 (.sync
) 模式,任務的狀態取決於輪詢。Step Functions 一開始會以每分鐘大約 1 個輪詢的速率輪詢。此速率最終會減慢到每 5 分鐘大約 1 次輪詢。如果您需要更頻繁的輪詢,或需要對輪詢策略進行更多控制,您可以使用 eks:call
整合來查詢任務的狀態。
eks:runJob
整合專屬於 batch/v1
Kubernetes 任務。如需詳細資訊,請參閱 Kubernetes 文件中的任務eks:call
服務整合。您可以使用 Step Functions 來建置輪詢迴圈,如使用 Lambda 和 輪詢任務狀態 AWS Batch範例專案所示。
支援的參數包括:
-
ClusterName
:您要呼叫的 Amazon EKS叢集名稱。-
Type
:String
-
必要:是
-
-
CertificateAuthority
:與您的叢集通訊所需的 Base64-encoded憑證資料。您可以從 Amazon EKS主控台或使用 Amazon EKS DescribeCluster 取得此值API。 -
Type
:String
-
必要:是
-
-
Endpoint
:Kubernetes URL API伺服器的端點。您可以從 Amazon EKS主控台或使用 Amazon EKS DescribeCluster 取得此值API。 -
Type
:String
-
必要:是
-
-
Namespace
:要在其中執行任務的命名空間。如果未提供,default
則會使用 命名空間。-
Type
:String
-
必要:否
-
-
Job
:Kubernetes 任務的定義。請參閱 Kubernetes 文件中的任務。 -
Type
:JSON
或String
-
必要:是
-
-
LogOptions
:控制日誌選用擷取的一組選項。只有在使用執行任務 (.sync) 服務整合模式等待任務完成時才適用。-
Type
:JSON
-
必要:否
-
日誌包含在金鑰 下的回應中
logs
。任務中可能有多個 Pod,每個 Pod 都有多個容器。{ ... "logs": { "pods": { "pod1": { "containers": { "container1": { "log":
<log>
}, ... } }, ... } } -
日誌擷取會盡最大努力執行。如果擷取日誌時發生錯誤,則會有欄位
error
和 取代log
欄位cause
。
-
-
LogOptions.RetrieveLogs
:在任務完成後啟用日誌擷取。根據預設,不會擷取日誌。-
Type
:Boolean
-
必要:否
-
-
LogOptions.RawLogs
:如果RawLogs
設為 true,日誌將傳回為原始字串,而不會嘗試將它們剖析為 JSON。根據預設,JSON日誌會盡可能還原序列化為 。在某些情況下,這類剖析可能會導致不必要的變更,例如限制包含許多數字的數字精確度。-
Type
:Boolean
-
必要:否
-
-
LogOptions.LogParameters
:Kubernetes API的讀取日誌API支援查詢參數來控制日誌擷取。例如,您可以使用tailLines
或limitBytes
來限制擷取日誌的大小,並保留在 Step Functions 資料大小配額內。如需詳細資訊,請參閱 Kubernetes API參考的讀取日誌一節。 -
Type:
的映射String
至List of Strings
-
必要:否
-
範例:
"LogParameters": { "tailLines": [ "6" ] }
-
下列範例包含執行任務、等待任務完成,然後擷取任務日誌Task
的狀態:
{
"StartAt": "Run a job on EKS",
"States": {
"Run a job on EKS": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:runJob.sync",
"Parameters": {
"ClusterName": "MyCluster",
"CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE",
"Endpoint": "https://AKIAIOSFODNN7EXAMPLE.yl4.us-east-1.eks.amazonaws.com",
"LogOptions": {
"RetrieveLogs": true
},
"Job": {
"apiVersion": "batch/v1",
"kind": "Job",
"metadata": {
"name": "example-job"
},
"spec": {
"backoffLimit": 0,
"template": {
"metadata": {
"name": "example-job"
},
"spec": {
"containers": [
{
"name": "pi-2000",
"image": "perl",
"command": [ "perl" ],
"args": [
"-Mbignum=bpi",
"-wle",
"print bpi(2000)"
]
}
],
"restartPolicy": "Never"
}
}
}
}
},
"End": true
}
}
}
Call
eks:call
服務整合可讓您使用 Kubernetes 透過 Kubernetes API端點API讀取和寫入 Kubernetes 資源物件。
您的 Kubernetes API 伺服器必須將許可授予狀態機器所使用的IAM角色。如需詳細資訊,請參閱許可。
如需可用操作的詳細資訊,請參閱 Kubernetes API參考
支援的參數Call
包括:
-
ClusterName
:您要呼叫的 Amazon EKS叢集名稱。-
Type
:String -
必要:是
-
-
CertificateAuthority
:與您的叢集通訊所需的 Base64-encoded憑證資料。您可以從 Amazon EKS主控台或使用 Amazon EKS DescribeCluster 取得此值API。 -
Type
:String
-
必要:是
-
-
Endpoint
:Kubernetes URL API伺服器的端點。您可以在 Amazon EKS主控台或使用 Amazon EKS的 找到此值 DescribeCluster API。 -
Type
:String
-
必要:是
-
-
Method
:請求HTTP的方法。下列其中一項:GET
、POST
、PUT
、DELETE
、HEAD
或PATCH
。-
Type
:String
-
必要:是
-
-
Path
:Kubernetes RESTAPI操作的HTTP路徑。-
Type
:String
-
必要:是
-
-
QueryParameters
:Kubernetes RESTAPI操作的HTTP查詢參數。-
Type:
的映射String
至List of Strings
-
必要:否
-
範例:
"QueryParameters": { "labelSelector": [ "job-name=example-job" ] }
-
-
RequestBody
:Kubernetes RESTAPI操作HTTP的訊息內文。-
Type
:JSON
或String
-
必要:否
-
下列包含使用 eks:call
來列出屬於任務 之 Pod Task
的狀態example-job
。
{
"StartAt": "Call EKS",
"States": {
"Call EKS": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:call",
"Parameters": {
"ClusterName": "MyCluster",
"CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE",
"Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com",
"Method": "GET",
"Path": "/api/v1/namespaces/default/pods",
"QueryParameters": {
"labelSelector": [
"job-name=example-job"
]
}
},
"End": true
}
}
}
下列包含使用 eks:call
刪除任務 Task
的狀態example-job
,並設定 propagationPolicy
以確保任務的 Pod 也遭到刪除。
{
"StartAt": "Call EKS",
"States": {
"Call EKS": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:call",
"Parameters": {
"ClusterName": "MyCluster",
"CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE",
"Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com",
"Method": "DELETE",
"Path": "/apis/batch/v1/namespaces/default/jobs/example-job",
"QueryParameters": {
"propagationPolicy": [
"Foreground"
]
}
},
"End": true
}
}
}
支援的 Amazon EKS APIs
支援的 Amazon EKSAPIs和語法包括:
-
-
使用
eks:createCluster
服務整合建立 Amazon EKS叢集時,IAM角色會以管理員身分新增至 Kubernetes RBAC授權表 (具有 system:masters 許可)。一開始,只有該IAM實體可以呼叫 Kubernetes API 伺服器。如需詳細資訊,請參閱:-
Amazon EKS使用者指南中的管理叢集的使用者或IAM角色
-
許可 區段
Amazon EKS使用服務連結角色,其中包含 Amazon 代表您呼叫其他服務EKS所需的許可。如果這些服務連結角色尚未存在於您的帳戶中,您必須將
iam:CreateServiceLinkedRole
許可新增至 Step Functions 所使用的IAM角色。如需詳細資訊,請參閱《Amazon EKS使用者指南》中的使用服務連結角色。Step Functions 使用IAM的角色必須具有將叢集IAM角色傳遞至 Amazon 的
iam:PassRole
許可EKS。如需詳細資訊,請參閱《Amazon 使用者指南》中的 Amazon EKS叢集IAM角色。 EKS -
-
-
Amazon EKS使用服務連結角色,其中包含 Amazon 代表您呼叫其他服務EKS所需的許可。如果這些服務連結角色尚未存在於您的帳戶中,您必須將
iam:CreateServiceLinkedRole
許可新增至 Step Functions 所使用的IAM角色。如需詳細資訊,請參閱《Amazon EKS使用者指南》中的使用服務連結角色。Amazon EKS on Fargate 可能並非所有區域都提供。如需區域可用性的詳細資訊,請參閱《Amazon EKS使用者指南》中的 Fargate 一節。
Step Functions 使用IAM的角色必須具有將 Pod 執行IAM角色傳遞至 Amazon 的
iam:PassRole
許可EKS。如需詳細資訊,請參閱《Amazon EKS使用者指南》中的 Pod 執行角色。
下列包含Task
可建立 Amazon EKS叢集的 。
{
"StartAt": "CreateCluster.sync",
"States": {
"CreateCluster.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:createCluster.sync",
"Parameters": {
"Name": "MyCluster",
"ResourcesVpcConfig": {
"SubnetIds": [
"subnet-053e7c47012341234",
"subnet-027cfea4b12341234"
]
},
"RoleArn": "arn:aws:iam::123456789012:role/MyEKSClusterRole"
},
"End": true
}
}
}
下列包含刪除 Amazon EKS叢集Task
的狀態。
{
"StartAt": "DeleteCluster.sync",
"States": {
"DeleteCluster.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:deleteCluster.sync",
"Parameters": {
"Name": "MyCluster"
},
"End": true
}
}
}
下列包含建立 Fargate 設定檔Task
的狀態。
{
"StartAt": "CreateFargateProfile.sync",
"States": {
"CreateFargateProfile.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:createFargateProfile.sync",
"Parameters": {
"ClusterName": "MyCluster",
"FargateProfileName": "MyFargateProfile",
"PodExecutionRoleArn": "arn:aws:iam::123456789012:role/MyFargatePodExecutionRole",
"Selectors": [{
"Namespace": "my-namespace",
"Labels": { "my-label": "my-value" }
}]
},
"End": true
}
}
}
下列包含刪除 Fargate 設定檔Task
的狀態。
{
"StartAt": "DeleteFargateProfile.sync",
"States": {
"DeleteFargateProfile.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:deleteFargateProfile.sync",
"Parameters": {
"ClusterName": "MyCluster",
"FargateProfileName": "MyFargateProfile"
},
"End": true
}
}
}
下列包含建立節點群組Task
的狀態。
{
"StartAt": "CreateNodegroup.sync",
"States": {
"CreateNodegroup.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:createNodegroup.sync",
"Parameters": {
"ClusterName": "MyCluster",
"NodegroupName": "MyNodegroup",
"NodeRole": "arn:aws:iam::123456789012:role/MyNodeInstanceRole",
"Subnets": ["subnet-09fb51df01234", "subnet-027cfea4b1234"]
},
"End": true
}
}
}
下列包含刪除節點群組Task
的狀態。
{
"StartAt": "DeleteNodegroup.sync",
"States": {
"DeleteNodegroup.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:deleteNodegroup.sync",
"Parameters": {
"ClusterName": "MyCluster",
"NodegroupName": "MyNodegroup"
},
"End": true
}
}
}
許可
使用 eks:createCluster
服務整合建立 Amazon EKS叢集時,IAM角色會以管理員身分新增至 Kubernetes RBAC授權資料表,並具有 system:masters
許可。一開始,只有該IAM實體可以呼叫 Kubernetes API 伺服器。例如,除非您擔任與 Step Functions 狀態機器相同的角色,或設定 Kubernetes 將許可授予其他IAM實體,否則您將無法使用 kubectl 與 Kubernetes API 伺服器互動。如需詳細資訊,請參閱《Amazon EKS使用者指南》中的管理叢集的使用者或IAM角色。
您可以新增其他IAM實體的許可,例如使用者或角色,方法是將其新增至 kube-system 命名空間aws-auth
ConfigMap
中的 。如果您要從 Step Functions 建立叢集,請使用 eks:call
服務整合。
下列包含建立 aws-auth
ConfigMap
並授予system:masters
許可給使用者 arn:aws:iam::123456789012:user/my-user
和IAM角色 Task
的狀態arn:aws:iam::123456789012:role/my-role
。
{
"StartAt": "Add authorized user",
"States": {
"Add authorized user": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:call",
"Parameters": {
"ClusterName": "MyCluster",
"CertificateAuthority": "LS0tLS1CRUd...UtLS0tLQo=",
"Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com",
"Method": "POST",
"Path": "/api/v1/namespaces/kube-system/configmaps",
"RequestBody": {
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "aws-auth",
"namespace": "kube-system"
},
"data": {
"mapUsers": "[{ \"userarn\": \"arn:aws:iam::123456789012:user/my-user\", \"username\": \"my-user\", \"groups\": [ \"system:masters\" ] } ]",
"mapRoles": "[{ \"rolearn\": \"arn:aws:iam::123456789012:role/my-role\", \"username\": \"my-role\", \"groups\": [ \"system:masters\" ] } ]"
}
}
},
"End": true
}
}
注意
您可能會看到IAM角色ARN的 顯示格式,其中包含路徑 /service-role/,例如 arn:aws:iam::123456789012:role/
。在 中列出角色時,不應包含此服務角色路徑字符service-role
/my-roleaws-auth
。
當您的叢集初次建立時, aws-auth
ConfigMap
將不存在,但會在您建立 Fargate 設定檔時自動新增。您可以擷取 的目前值aws-auth
、新增其他許可PUT
和新版本。在 Fargate 設定檔aws-auth
之前建立 通常比較容易。
如果您的叢集是在 Step Functions 之外建立的,您可以設定 kubectl 以與您的 Kubernetes API 伺服器通訊。然後,aws-auth
ConfigMap
使用 建立新的 kubectl apply -f aws-auth.yaml
,或使用 編輯已存在的 kubectl edit -n kube-system configmap/aws-auth
。如需詳細資訊,請參閱:
-
Amazon EKS使用者指南中的管理叢集的使用者或IAM角色。
如果您的IAM角色在 Kubernetes 中沒有足夠的許可, eks:call
eks:runJob
或服務整合將會失敗,並出現下列錯誤:
Error:
EKS.401
Cause:
{
"ResponseBody": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
},
"StatusCode": 401,
"StatusText": "Unauthorized"
}
IAM 呼叫 Amazon 的政策 EKS
下列範例範本顯示 如何根據您狀態機器定義中的資源 AWS Step Functions 產生IAM政策。如需詳細資訊,請參閱 Step Functions 式如何為整合式服務產生IAM原則 和 探索 Step Functions 中的服務整合模式。
CreateCluster
資源
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:CreateCluster"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"eks:DescribeCluster",
"eks:DeleteCluster"
],
"Resource": "arn:aws:eks:sa-east-1:444455556666:cluster/*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::444455556666:role/StepFunctionsSample-EKSClusterManag-EKSServiceRole-ANPAJ2UCCR6DPCEXAMPLE"
],
"Condition": {
"StringEquals": {
"iam:PassedToService": "eks.amazonaws.com"
}
}
}
]
}
CreateNodeGroup
資源
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeSubnets",
"eks:CreateNodegroup"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"eks:DescribeNodegroup",
"eks:DeleteNodegroup"
],
"Resource": "arn:aws:eks:sa-east-1:444455556666:nodegroup/*"
},
{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:ListAttachedRolePolicies"
],
"Resource": "arn:aws:iam::444455556666:role/*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::444455556666:role/StepFunctionsSample-EKSClusterMan-NodeInstanceRole-ANPAJ2UCCR6DPCEXAMPLE"
],
"Condition": {
"StringEquals": {
"iam:PassedToService": "eks.amazonaws.com"
}
}
}
]
}
DeleteCluster
資源
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:DeleteCluster",
"eks:DescribeCluster"
],
"Resource": [
"arn:aws:eks:sa-east-1:444455556666:cluster/ExampleCluster"
]
}
]
}
DeleteNodegroup
資源
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:DeleteNodegroup",
"eks:DescribeNodegroup"
],
"Resource": [
"arn:aws:eks:sa-east-1:444455556666:nodegroup/ExampleCluster/ExampleNodegroup/*"
]
}
]
}
如需EKS搭配 Step Functions 使用 Amazon 的詳細資訊,請參閱 使用 Step Functions 建立和管理 Amazon EKS叢集。