使用 Step Functions 创建和管理亚马逊EKS集群 - AWS Step Functions

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Step Functions 创建和管理亚马逊EKS集群

了解如何将 Step Functions 与亚马逊集成EKS,以管理 Kubernetes 集群。Step Functions 提供了两种类型的服务集成,APIs用于与亚马逊 Elastic Kubernetes Service 集成。一种允许您使用 Amazon EKS APIs 来创建和管理亚马逊EKS集群。另一个允许您使用 Kubernetes 与集群进行交互,API并作为应用程序工作流程的一部分运行作业。

您可以将 Kubernetes API 集成与使用 Step Functions 创建的EKS亚马逊集群、由 eksctl 工具或EKS亚马逊控制台创建的EKS亚马逊集群或类似方法使用。有关更多信息,请参阅《亚马逊EKS用户指南》中的创建亚马逊EKS集群

要了解如何与集成 AWS Step Functions 中的服务,参见集成 服务和。在 Step Functions API 中向服务传递参数

优化 Amazon EKS 集成的关键功能
注意

Step Functions EKS 集成仅支持APIs具有公共端点访问权限的 Kubernetes。默认情况下,EKS集群API服务器终端节点具有公共访问权限。有关更多信息,请参阅《亚马逊EKS用户指南》中的 Amaz on EKS 集群终端节点访问控制

如果执行停止,Step Functions 不会自动终止亚马逊EKS集群。如果您的状态机在 Amazon EKS 集群终止之前停止,则您的集群可能会无限期地继续运行,并且可能会产生额外费用。为避免这种情况,请确保正确终止您创建的任何 Amazon EKS 集群。有关更多信息,请参阅:

注意

在 Step Functions 中,任务的最大输入或结果数据大小有一个配额。这样,当您向其他服务发送数据或从其他服务接收数据时,您只能使用 256 KB 的数据作为 UTF -8 编码的字符串。请参阅 与状态机执行相关的配额

Kubernetes 集成 API

Step Functions 支持以下 KubernetesAPIs:

RunJob

eks:runJob服务集成允许您在 Amazon EKS 集群上运行作业。您可以是使用 eks:runJob.sync 变体等待任务完成,也可以选择检索日志。

您的 Kubernetes API 服务器必须向状态机使用的IAM角色授予权限。有关更多信息,请参阅 权限

对于运行任务 (.sync) 模式,作业的状态由轮询确定。Step Functions 最初的轮询速度约为每分钟 1 次。这个速度最终会减慢到大约每 5 分钟进行一次。如果您需要更频繁地进行轮询,或者需要对轮询策略进行更多控制,则可以使用 eks:call 集成来查询作业的状态。

eks:runJob 集成特定于 batch/v1 Kubernetes 作业。有关更多信息,请参阅 Kubernetes 文档中的作业。如果您想管理其他 Kubernetes 资源,包括自定义资源,请使用 eks:call 服务集成。您可以使用 Step Functions 来构建轮询循环,如使用 Lambda 轮询任务状态以及 AWS Batch示例项目所示。

支持的参数包括:

  • ClusterName:您要调用的 Amazon EKS 集群的名称。

    • Type: String

    • 必需:是

  • CertificateAuthority:检索与集群通信所需的 Base64 编码证书数据。您可以从亚马逊EKS控制台或使用亚马逊获取此值EKSDescribeClusterAPI。

    • Type: String

    • 必需:是

  • Endpoint:你的 Kubernetes API 服务器URL的终端节点。您可以从亚马逊EKS控制台或使用亚马逊获取此值EKSDescribeClusterAPI。

    • Type: String

    • 必需:是

  • Namespace:运行作业的命名空间。如果未提供,则使用 default 命名空间。

    • Type: String

    • 必需:否

  • Job: Kubernetes 作业的定义。请参阅 Kubernetes 文档中的作业

    • TypeJSONString

    • 必需:是

  • LogOptions:一组用于控制日志可选检索的选项。仅当使用运行作业 (.sync) 服务集成模式来等待作业完成时才适用。

    • Type: JSON

    • 必需:否

    • 日志包含在密钥 logs 下的响应中。任务中可能有多个容器组,每个容器组都有多个容器。

      { ... "logs": { "pods": { "pod1": { "containers": { "container1": { "log": <log> }, ... } }, ... } }
    • 将尽最大努力执行日志检索。如果检索日志时出错,则将使用 errorcause 字段代替 log 字段。

  • LogOptions.RetrieveLogs:在任务完成后启用日志检索。默认情况下,不会检索日志。

    • Type: Boolean

    • 必需:否

  • LogOptions.RawLogs: 如果设置RawLogs为 true,则日志将作为原始字符串返回,而无需尝试将其JSON解析为。默认情况下,JSON如果可能,日志会反序列化为。在某些情况下,此类解析可能会带来不必要的更改,例如限制包含多位数的数字精确度。

    • Type: Boolean

    • 必需:否

  • LogOptions.LogParameters:Kubernetes API 的读取日志API支持用于控制日志检索的查询参数。例如,您可以使用 tailLineslimitBytes 来限制检索到的日志的大小,并保持在 Step Functions 的数据大小配额之内。有关更多信息,请参阅《Kubernetes API 参考》的 “读取日志” 部分。

    • Type: StringList 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取和写入 Kubernetes 资源对象。API

您的 Kubernetes API 服务器必须向状态机使用的IAM角色授予权限。有关更多信息,请参阅 权限

有关可用操作的更多信息,请参阅 Kubernetes API 参考。

Call 支持的参数包括:

  • ClusterName:您要调用的 Amazon EKS 集群的名称。

    • Type:字符串

    • 必需:是

  • CertificateAuthority:检索与集群通信所需的 Base64 编码证书数据。您可以从亚马逊EKS控制台或使用亚马逊获取此值EKSDescribeClusterAPI。

    • Type: String

    • 必需:是

  • Endpoint:你的 Kubernetes API 服务器URL的终端节点。你可以在亚马逊EKS控制台上找到这个值,也可以使用 Ama zon EKS '来找到 DescribeCluster API。

    • Type: String

    • 必需:是

  • Method:您的请求HTTP方法。以下值之一:GETPOSTPUTDELETEHEADPATCH

    • Type: String

    • 必需:是

  • Path: Kubernetes REST API 操作的HTTP路径。

    • Type: String

    • 必需:是

  • QueryParameters:Kubernetes REST API 操作的HTTP查询参数。

    • Type: StringList of Strings 的映射

    • 必需:否

    • 例如:

      "QueryParameters": { "labelSelector": [ "job-name=example-job" ] }
  • RequestBody: Kubernetes REST API 操作的HTTP消息正文。

    • TypeJSONString

    • 必需:否

下面包含一个 Task 状态,它使用 eks:call 列出属于作业 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 } } }

下面包含一个 Task 状态,它使用 eks:call 删除作业 example-job,并设置 propagationPolicy 以确保作业的容器组也被删除。

{ "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 EKS APIs 和语法包括:

  • CreateCluster

    • 请求语法

    • 响应语法

      使用eks:createCluster服务集成创建 Amazon EKS 集群时,该IAM角色将以管理员身份添加到 Kubernetes RBAC 授权表中(具有系统:masters 权限)。最初,只有该IAM实体可以调用 Kubernetes 服务器API。有关更多信息,请参阅:

      Amazon EKS 使用服务相关角色,其中包含亚马逊代表您调用其他服务EKS所需的权限。如果您的账户中尚不存在这些服务相关角色,则必须向 Step Function IAM s 使用的角色添加iam:CreateServiceLinkedRole权限。有关更多信息,请参阅 Amazon EKS 用户指南中的使用服务相关角色

      Step Functions 使用的IAM角色必须具有将集群IAM角色传递给亚马逊的iam:PassRole权限EKS。有关更多信息,请参阅《亚马逊EKS用户指南》中的 Amazon EKS 集群IAM角色

  • DeleteCluster

  • CreateFargateProfile

    • 请求语法

    • 响应语法

      Amazon EKS 使用服务相关角色,其中包含亚马逊代表您调用其他服务EKS所需的权限。如果您的账户中尚不存在这些服务相关角色,则必须向 Step Function IAM s 使用的角色添加iam:CreateServiceLinkedRole权限。有关更多信息,请参阅 Amazon EKS 用户指南中的使用服务相关角色

      Fargate EKS 上的 Amazon 可能并非在所有地区都可用。有关区域可用性的信息,请参阅《亚马逊EKS用户指南》中有关 Fargate 的部分。

      Step Functions 使用的IAM角色必须iam:PassRole有权将容器执行IAM角色传递给亚马逊EKS。有关更多信息,请参阅 Amazon EKS 用户指南中的 Pod 执行角色

  • DeleteFargateProfile

  • CreateNodegroup

    • 请求语法

    • 响应语法

      Amazon EKS 使用服务相关角色,其中包含亚马逊代表您调用其他服务EKS所需的权限。如果您的账户中尚不存在这些服务相关角色,则必须向 Step Function IAM s 使用的角色添加iam:CreateServiceLinkedRole权限。有关更多信息,请参阅 Amazon EKS 用户指南中的使用服务相关角色

      Step Functions 使用的IAM角色必须具有将节点IAM角色传递给亚马逊的iam:PassRole权限EKS。有关更多信息,请参阅 Amazon EKS 用户指南中的使用服务相关角色

  • DeleteNodegroup

以下内容包括用于创建 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 Fun ctions 状态机相同的角色,或者你将 Kubernetes 配置为向其他实体授予权限,否则你将无法使用 kubectl 与 Kubernetes API 服务器进行交互。IAM有关更多信息,请参阅 Amazon 用户指南中的管理集群的EKS用户或IAM角色

您可以通过将其他IAM实体(例如用户或角色)添加到 kube-system 命名aws-authConfigMap空间中的来添加权限。如果您通过 Step Functions 创建集群,请使用 eks:call 服务集成。

以下内容包括创建并向用户aws-authConfigMaparn:aws:iam::123456789012:user/my-user和IAM角色授予system:masters权限的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 } }
注意

您可能会看到ARN以包含路径 /s IAM ervice-role/ 的格式显示的角色,例如arn:aws:iam::123456789012:role/service-role/my-roleaws-auth 中列出角色时,不应包含此服务角色路径令牌。

首次创建集群时,aws-auth ConfigMap 并不存在,但如果创建了 Fargate 配置文件,则会自动添加。您可以检索 aws-auth 的当前值、添加其他权限和 PUT 一个新版本。通常,在 Fargate 配置文件之前创建 aws-auth 会更容易。

如果你的集群是在 Step Functions 之外创建的,你可以将 kubectl 配置为与你的 Kubern API etes 服务器通信。然后,使用 kubectl apply -f aws-auth.yaml 创建新的 aws-auth ConfigMap 或使用 kubectl edit -n kube-system configmap/aws-auth 编辑已存在的 aws-auth ConfigMap。有关更多信息,请参阅:

如果您的IAM角色在 Kubernetes 中没有足够的权限,则eks:calleks: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 配合使用的更多信息,请参阅使用 Step Functions 创建和管理亚马逊EKS集群