本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Step Functions 致电亚马逊 EKS
Step Functions 可以控制某些Amazon直接来自 Amazon 状态语言的服务。有关使用的更多信息。Amazon Step Functions及其集成,请参阅以下内容:
-
这些区域有:运行作业 (.sync)支持集成模式。
-
没有针对请求响应集成模式。
-
这些区域有:等待具有任务令牌的回调不支持集成模式。
有关在将 Step Functions 与其他结合使用时如何配置 IAM 的信息。Amazon服务,请参阅集成服务的 IAM 政策.
Step Functions 提供了两种类型的服务集成 API,用于与 Amazon Elastic Kubernetes Service 集成。您可以使用 Amazon EKS API 来创建和管理 Amazon EKS 集群。另一个允许您使用 Kubernetes API 与集群进行交互,并将作为应用程序工作流程的一部分运行作业。您可以将 Kubernetes API 集成与使用 Step Functions 创建的 Amazon EKS 集群一起使用,而 Amazon EKS 集群由eksctl工具或Amazon EKS 控制台
如果停止执行,Step Functions 不会自动终止 Amazon EKS 群集。如果您的状态机在 Amazon EKS 集群终止之前停止,则您的集群可能会无限期地继续运行,并可能产生额外费用。为避免这种情况,请确保正确终止您创建的任何 Amazon EKS 集群。有关更多信息,请参阅:
-
删除集群Amazon EKS 用户指南中的。
-
运行作业 (.sync)服务集成模式中的。
Step Functions 中的任务的最大输入或结果数据大小有配额。当您向另一个服务发送或接收其他服务的数据时,这限制了您作为 UTF-8 编码字符串的 262,144 字节的数据。请参阅 与状态机执行相关的配额。
Kubernetes API 集成
Step Functions 支持以下 Kubernetes API:
runJob
这些区域有:eks:runJob
服务集成允许您在 Amazon EKS 群集上运行作业。这些区域有:eks:runJob.sync
变体允许您等待作业完成,还可以选择检索日志。
您的 Kubernetes API 服务器必须向状态机使用的 IAM 角色授予权限。有关更多信息,请参阅 权限。
对于运行作业(.sync
) 模式,任务的状态由轮询决定。Step Functions 最初以大约每分钟 1 次民意调查的速度进行民意调查。这个速度最终会减缓至大约每 5 分钟进行 1 次民意调查。如果您需要更频繁的轮询,或者需要对投票策略进行更多控制,则可以使用eks:call
集成以查询作业的状态。
这些区域有:eks:runJob
集成特定于batch/v1
Kubernetes Job。有关更多信息,请参阅 。作业eks:call
服务集成。您可以使用 Step Functions 来构建轮询循环,如轮询任 Job 状态(Lambda、Amazon Batch) 示例项目。
支持的参数包括:
-
ClusterName
:要调用的 Amazon EKS 群集的名称。-
Type
:String
-
必需:是
-
-
CertificateAuthority
:与集群通信所需的 Base64 编码证书数据。您可以从获取此值。Amazon EKS 控制台或使用 Amazon EKSDescribeClusterAPI。 -
Type
:String
-
必需:是
-
-
Endpoint
:Kubernetes API 服务器的终端节点 URL。您可以从获取此值。Amazon EKS 控制台或使用 Amazon EKSDescribeClusterAPI。 -
Type
:String
-
必需:是
-
-
Namespace
:运行作业的命名空间。如果未提供,则命名空间default
已使用。-
Type
:String
-
必需:否
-
-
Job
: Kubernetes Job 的定义。请参阅作业在 Kubernetes 文档中。 -
Type
:JSON
或String
-
必需:是
-
-
LogOptions
:用于控制日志的可选检索的一组选项。仅当使用运行作 Job (.sync) 服务集成模式等待作业完成时才适用。-
Type
:JSON
-
必需:否
-
日志包含在密钥下的响应中
logs
. 作业中可能有多个 pod,每个 pod 都有多个容器。{ ... "logs": { "pods": { "pod1": { "containers": { "container1": { "log":
<log>
}, ... } }, ... } } -
将尽最大努力执行日志检索。如果检索日志时出错,请代替
log
字段会有字段error
和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:
的 MapString
到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 API API 通过 Kubernetes API 终端节点读写 Kubernetes 资源对象。
您的 Kubernetes API 服务器必须向状态机使用的 IAM 角色授予权限。有关更多信息,请参阅 权限。
有关可用操作的更多信息,请参阅Kubernetes API 参考
支持的参数Call
包括:
-
ClusterName
:要调用的 Amazon EKS 群集的名称。-
Type
:字符串 -
:必需 是
-
-
CertificateAuthority
:与集群通信所需的 Base64 编码证书数据。您可以从获取此值。Amazon EKS 控制台或使用 Amazon EKSDescribeClusterAPI。 -
Type
:String
-
:必需 是
-
-
Endpoint
:Kubernetes API 服务器的终端节点 URL。您可以在Amazon EKS 控制台或者使用亚马逊 EKS 的描述Cluster API。 -
Type
:String
-
:必需 是
-
-
Method
:请求的 HTTP 方法。以下值之一:GET
、POST
、PUT
、DELETE
、HEAD
或PATCH
。-
Type
:String
-
:必需 是
-
-
Path
:Kubernetes REST API 操作的 HTTP 路径。-
Type
:String
-
:必需 是
-
-
QueryParameters
:Kubernetes REST API 操作的 HTTP 查询参数。-
Type:
的 MapString
到List of Strings
-
:必需 否
-
例如:
"QueryParameters": { "labelSelector": [ "job-name=example-job" ] }
-
-
RequestBody
:Kubernetes REST API 操作的 HTTP 消息正文。-
Type
:JSON
或String
-
:必需 否
-
下面这个Task
使用的状态eks:call
列出属于该作业的 Podexample-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
}
}
}
下面这个Task
使用的状态eks:call
删除作业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 API
支持的 Amazon EKS API 和语法包括:
-
-
创建 Amazon EKS 集群后,请使用
eks:createCluster
服务集成后,IAM 角色将添加到 Kubernetes RBAC 授权表作为管理员(具有系统:master 权限)。最初,仅该 IAM 实体可以调用 Kubernetes API 服务器。有关更多信息,请参阅:-
管理集群的用户或 IAM 角色中的Amazon EKS 用户指南
-
这些区域有:权限部分
Amazon EKS 使用服务相关角色,其中包含 Amazon EKS 代表您调用其他服务所需的权限。如果您的账户中尚不存在这些服务相关角色,则必须添加
iam:CreateServiceLinkedRole
对 Step Functions 使用的 IAM 角色的权限。有关更多信息,请参阅 。使用服务相关角色中的Amazon EKS 用户指南.Step Functions 使用的 IAM 角色必须具有
iam:PassRole
将群集 IAM 角色传递给 Amazon EKS 的权限。有关更多信息,请参阅 。Amazon EKS 集群 IAM 角色中的Amazon EKS 用户指南. -
-
-
Amazon EKS 使用服务相关角色,其中包含 Amazon EKS 代表您调用其他服务所需的权限。如果您的账户中尚不存在这些服务相关角色,则必须添加
iam:CreateServiceLinkedRole
对 Step Functions 使用的 IAM 角色的权限。有关更多信息,请参阅 。使用服务相关角色中的Amazon EKS 用户指南.Fargate 上的 Amazon EKS 可能并未在所有区域提供。有关区域可用性的信息,请参阅Fargate中的Amazon EKS 用户指南.
Step Functions 使用的 IAM 角色必须具有
iam:PassRole
将 pod 执行 IAM 角色传递给 Amazon EKS 的权限。有关更多信息,请参阅 。Pod 执行角色中的Amazon EKS 用户指南.
下面这个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
}
}
}
下面这个Task
状态,删除 Amazon EKS 群集。
{
"StartAt": "DeleteCluster.sync",
"States": {
"DeleteCluster.sync": {
"Type": "Task",
"Resource": "arn:aws:states:::eks:deleteCluster.sync",
"Parameters": {
"Name": "MyCluster"
},
"End": true
}
}
}
下面这个Task
创建 Fargate 配置文件的状态。
{
"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
}
}
}
下面这个Task
状态,删除 Fargate 配置文件。
{
"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
}
}
}
权限
创建 Amazon EKS 集群后,请使用eks:createCluster
服务集成后,IAM 角色将添加到 Kubernetes RBAC 授权表作为管理员,其中包括system:masters
权限。最初,仅该 IAM 实体可以调用 Kubernetes API 服务器。例如,您将无法使用kubectl与 Kubernetes API 服务器进行交互,除非您担任与 Step Functions 状态机相同的角色,或者您将 Kubernetes 配置为向其他 IAM 实体授予权限。有关更多信息,请参阅 。管理集群的用户或 IAM 角色中的Amazon EKS 用户指南.
您可以通过将其他 IAM 实体(例如用户或角色)添加权限,方法是将它们添加到aws-auth
ConfigMap
在 kube-system 命名空间中。如果您正在使用 Step Functions 创建集群,请使用eks:call
服务集成。
下面这个Task
创建一个aws-auth
ConfigMap
和赠款system:masters
对 IAM 用户的权限arn:aws:iam::123456789012:user/my-user
和 IAM 角色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 以包含路径的格式显示/服务角色/之外的压缩算法(例如arn:aws:iam::123456789012:role/
. 该服务角色在中列出角色时不应包含路径令牌service-role
/my-roleaws-auth
.
首次创建集群时aws-auth
ConfigMap
将不存在,但是如果您创建 Fargate 配置文件,则会自动添加。您可以检索的当前值。aws-auth
,添加其他权限,然后PUT
新版本。通常更容易创建aws-auth
在 Fargate 配置文件之前。
如果您的集群是在 Step Functions 之外创建的,则可以配置kubectl与 Kubernetes API 服务器通信。然后,创建新的aws-auth
ConfigMap
使用kubectl apply -f aws-auth.yaml
或者使用编辑已存在的kubectl edit -n kube-system configmap/aws-auth
. 有关更多信息,请参阅:
-
为 Amazon EKS 创建 kubeconfig中的Amazon EKS 用户指南.
-
管理集群的用户或 IAM 角色中的Amazon EKS 用户指南.
如果您的 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"
}