Flyte工作流平台调研(四)——服务部署
系列文章:
Flyte工作流平台调研(一)——整体架构
Flyte工作流平台调研(二)——核心概念说明
Flyte工作流平台调研(三)——核心组件原理
Flyte工作流平台调研(四)——服务部署
Flyte工作流平台调研(五)——扩展集成
Flyte工作流平台调研(六)——跟Ray框架对比
Flyte工作流平台调研(七)——核心源码走读
正文:
Flyte部署模式简介
Flyte有如下几种部署模式:(注意,这里提到的集群是指K8S集群)
0. 直接访问Flyte的SaaS服务,
有一个免费的Flyte Sandbox提供用户使用,访问地址:https://sandbox.union.ai/
1. 沙盒部署模式
Flyte提供了一个沙盒的镜像,将Flyte 的所有模块和依赖项(如关系型数据库、持久对象存储)都打包在了一起。通过这个镜像,直接启动的容器,就能直接提供Flyte的所有功能。容器里还启动了一个小的K3S集群,来代替K8S执行工作流任务。
对于对象存储的需求,Flyte Sandbox 使用 Minio,它提供了兼容 S3 的接口;对于 Postgres,使用的是标准的 Postgres Docker 镜像和 Helm chart。
但是沙盒部署不适合生产环境使用。只能用于测试。
2. 单集群和简单云依赖模式
是指部署单个K8S集群,依赖一些基础的云服务的一种部署方式。也可以本地部署K8S集群,然后服务部署在本地,依赖一些基础的云服务
3. 单机群和生产级云依赖模式
这种模式跟单集群和简单云依赖模式没有本质的区别,是在单集群和简单云依赖的基础上,增加对云的更多依赖,满足生产环境的使用。
4. 多集群模式
是指Flyte依赖多个K8S集群运行工作流任务。
沙盒部署详细方法
Flyte 提供了一种创建 Flyte 集群的方法,将其作为一个自包含的 Docker 镜像运行。这个沙盒环境是一个完整 Flyte 部署的小型复制版本,不具有可扩展性,仅包含最少的扩展功能。
Flyte Sandbox 可以运行在任何支持容器的环境中,让 Flyte 用户非常方便地试用平台,体验用户界面,而无需了解 Kubernetes 或复杂的配置。
相关的helm chart的详情可以参考:flyte/charts/flyte-sandbox at master · flyteorg/flyte · GitHub
注意:单容器沙盒环境也被 Flyte 团队用于运行持续集成测试,并在用户指南、教程和集成文档中使用。
1. 部署前置要求
- 安装
kubectl
。 - 安装
docker
或其他兼容 OCI 的工具(如 Podman 或 LXD)。 - 安装
flytectl
,这是 Flyte 的官方命令行工具。
Flyte 可以使用默认 Kubernetes 容器运行时(如 containerd
)运行任何兼容 OCI 的任务镜像,但 Flyte 核心维护团队通常使用 Docker。注意,flytectl demo
命令依赖于 Docker API,但因为此演示环境仅是一个自包含镜像,你也可以使用其他运行时直接运行该镜像。
在单容器环境中,通过 k3s 安装了一个迷你 Kubernetes 集群。k3s 使用容器内的 Docker 守护进程,通过 docker-in-docker
配置来协调用户容器。
2. 安装 flytectl
flytectl是Flyte官方提供的命令行工具,安装方式可以参考:GitHub - flyteorg/flytectl: A cross platform CLI for Flyte. Written in Golang. Offers an intuitive interface to Flyte https://docs.flyte.org/projects/flytectl/en/latest/
通过bash或者脚本安装:
bash:
$ brew install flyteorg/homebrew-tap/flytectl
脚本:
$ curl -sL https://ctl.flyte.org/install | bash
flytectl还可以通过upgrade命令升级。
3. 启动 Flyte Sandbox
运行以下命令来启动 Flyte Sandbox:
$ flytectl sandbox start
此命令会运行一个 Docker 容器,该容器内置一个本地 Docker 注册表(localhost:30000),因此你可以在 docker-in-docker 容器外部构建镜像,使用 localhost:30000/imgname:tag
对镜像进行标记并推送。
本地 Postgres 安装也可以通过端口 30001 访问,供希望深入了解存储层的用户使用。
预期输出:
Flyte 准备就绪!Flyte UI 可通过 http://localhost:30080/console 访问
❇️ 运行以下命令以导出 sandbox 环境变量,便于访问 flytectl:
export FLYTECTL_CONFIG=~/.flyte/config-sandbox.yaml
Flyte Sandbox 配备了 Docker 注册表。标记并推送自定义工作流镜像至 localhost:30000
Minio API 托管在 localhost:30002 上。使用 http://localhost:30080/minio/login 访问 Minio 控制台
4. 配置
config-sandbox.yaml
文件包含 FlyteAdmin 的配置。FlyteAdmin 是处理所有客户端请求(如工作流执行)的 Flyte 集群后端组件。默认值已经足够让你连接和使用 Flyte:
admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.comendpoint: localhost:30080 authType: Pkce insecure: true console: endpoint: http://localhost:30080
logger: show-source: true
level: 0
注意
你也可以通过运行flytectl config init
创建你自己的配置文件,该命令会在~/.flyte/config.yaml
路径下生成配置文件。
现在,沙盒集群已经运行,你可以访问用户指南或 教程 来运行使用 Flytekit(Flyte 的 Python SDK)编写的任务和工作流。
单集群和简单云依赖部署详细方法
相关的helm chart的详情可以参考:flyte/charts/flyte-binary at master · flyteorg/flyte · GitHub
1. 前置条件
为了安装 Flyte,你需要以下资源:
- Kubernetes 集群: 例如 EKS、GKE 等。
- 至少一个对象存储桶: 例如 S3、GCS 等。
- Postgres 数据库: 例如 RDS、CloudSQL 等。
- 至少一个云服务的 IAM 角色: AWS、GCP 等平台的角色,Flyte 后端服务需要通过该角色授权运行。你也可以为用户代码另行配置一个 IAM 角色。
注意: 由于 Flyte 文档可能无法跟上云服务商 API 的更新速度,请参考各云服务商的官方文档获取最新信息。
提示
Union.ai 提供了一组 Terraform 脚本,可以自动化配置前置条件并在 AWS、GCP 或 Azure 上安装 Flyte。
社区维护 的手动配置 EKS 环境并部署 Flyte 的指南可以 在这里查看。
2. 安装步骤
Flyte 是通过 Helm chart 安装的,以下是具体操作步骤:
1)将 Flyte 的 chart 仓库添加到 Helm:
helm repo add flyteorg https://flyteorg.github.io/flyte
2)下载并更新配置文件:
curl -sL https://raw.githubusercontent.com/flyteorg/flyte/master/charts/flyte-binary/eks-starter.yaml
3)安装 Helm chart:
helm install flyte-backend flyteorg/flyte-binary \ --dry-run --namespace flyte --values eks-starter.yaml
如果确定无误,可以去掉 --dry-run 参数正式安装。
3. 验证安装
eks-starter.yaml
文件提供了 Flyte 的最简单安装方式。虽然核心功能和可扩展性都具备,但以下内容不包括:
- 插件(例如 Spark 任务无法运行)。
- DNS 或 SSL。
- 身份验证机制。
1)端口转发 Flyte 服务
为了验证安装,你需要通过端口转发访问 Kubernetes 服务:
kubectl -n flyte port-forward service/flyte-binary 8088:8088 8089:8089
你可以通过浏览器访问 http://localhost:8088/console。
Flyte 服务运行在两个不同的端口上,一个用于 HTTP 流量,另一个用于 gRPC 流量,因此需要同时转发这两个端口。
2.)配置 Flytectl
保存现有配置文件的备份,并生成一个新的配置:
mv ~/.flyte/config.yaml ~/.flyte/bak.config.yaml
flytectl config init --host localhost:8088
生成的配置文件如下:
~/.flyte/config.yaml
:
admin:# For GRPC endpoints you might want to use dns:///flyte.myexample.comendpoint: dns:///localhost:8088authType: Pkceinsecure: true
logger:show-source: truelevel: 0
4. 测试工作流
你可以通过克隆 flytesnacks
仓库并运行 Hello World 示例来测试工作流:
git clone https://github.com/flyteorg/flytesnacks
cd flytesnacks/examples/basics
pyflyte run --remote basics/hello_world.py hello_world_wf
5. 在本地或自托管基础设施中运行 Flyte
有时,在本地 Kubernetes 环境甚至在笔记本电脑上设置 Flyte 环境进行测试和开发会很有帮助。
可以参考社区维护的教程,了解如何设置所需依赖并将 flyte-binary
chart 部署到本地 Kubernetes 集群中。
单机群和生产级云依赖模式详细部署方法
假设您已经成功完成了单集群简单云依赖部署的部署操作。
这里说明的是将 Flyte 部署生产环境的额外步骤。这些步骤并非强制要求,但建议将它们纳入到部署流程中。
相关的helm chart的详情可以参考:flyte/charts/flyte-binary at master · flyteorg/flyte · GitHub
1. Ingress/DNS
假设您的集群已经配置了一个 Ingress 控制器,Flyte 将可以在不需要端口转发的情况下访问。之前指南中安装的基础 Chart 已包含了 Ingress 规则,但默认情况下未启用。
要启用 Ingress,请更新您的 values.yaml
文件,添加以下配置块:
- flyte-binary 在 EKS 使用 Nginx
charts/flyte-binary/eks-starter.yaml
create: true##-- 如果您计划使用 NGINX Ingress 控制器,请取消注释以下部分#ingressClassName: nginx#commonAnnotations:# ingress.kubernetes.io/rewrite-target: /# nginx.ingress.kubernetes.io/ssl-redirect: "true"#httpAnnotations:# nginx.ingress.kubernetes.io/app-root: /console#grpcAnnotations:
- flyte-binary 在 EKS 使用 ALB
charts/flyte-binary/eks-starter.yaml
#This section assumes you are using the ALB Ingress controller.ingressClassName: albcommonAnnotations:alb.ingress.kubernetes.io/certificate-arn: 'arn:aws:acm:<AWS-REGION>:<AWS-ACCOUNT-ID>:certificate/<CERTIFICATE-ID>'alb.ingress.kubernetes.io/group.name: flytealb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'alb.ingress.kubernetes.io/scheme: internet-facingalb.ingress.kubernetes.io/ssl-redirect: '443'alb.ingress.kubernetes.io/target-type: iphttpAnnotations:alb.ingress.kubernetes.io/actions.app-root: '{"Type": "redirect", "RedirectConfig": {"Path": "/console", "StatusCode": "HTTP_302"}}'grpcAnnotations:
- flyte-binary 在 GCP 使用 Nginx
charts/flyte-core/values-gcp.yaml
#
# COMMON
#
common:ingress:host: "{{ .Values.userSettings.hostName }}"tls:enabled: true
2. 认证
Flyte 内置了基于 OAuth 2.0 的认证功能。有关设置认证的具体说明,请参阅认证指南。
注意
Flyte 默认不支持授权功能。这是因为不同组织使用的授权需求差异很大且种类繁多。
3. 升级路径
要升级 Flyte,只需对相关 Chart 执行 helm upgrade
即可。
在升级过程中需要注意的一点是,Flyte 会根据语义化版本控制(Semantic Versioning)进行定期发布。
由于 Flyte 1.0.0 会长期维护,您应预期次版本升级中可能会有较大变化,但大多数情况下会保持向后兼容性。
如果您使用的是 Flyte 的多集群部署模型,请确保相关组件同步升级。
多集群模式详细部署方法
部署架构
1. 整体说明
在Flyte整体架构中提到,用户使用Flyte的用户层面(比如FlyteConsole/Flytekit/Flytectl)给Flyte 的控制平面(FlyteAdmin),控制平面再将工作流发送到数据平面(FlytePropeller),在 Kubernetes 中启动 Pod 来完成这些工作流的执行。
所以如果要使用多个K8S集群,就不能将所有 Flyte 服务作为一个单一的二进制文件部署,而是单独部署Flyte的各个组件。下图是一个多集群基本的部署架构:
2. 核心思想
- 多集群需求:
- 出于安全、成本或计算资源扩展的需要,可能需要多个 Kubernetes 集群。
- Flyte 的控制平面负责提交工作流至多个数据平面集群,管理员可以通过项目和域等简单的抽象来管理工作流分配。
- 基本架构:
- 控制平面(FlyteAdmin):运行管理和协调逻辑。
- 数据平面(FlytePropeller 和 Task Pods):处理实际任务执行。
- 两者通过 API 和身份认证(OIDC 和 IAM)互联。
部署前置条件
为了确保多集群部署能够成功扩展和处理请求,应满足以下特定于环境的要求:
注意:这里是以AWS为例进行说明。
1. 定义Flyte所需权限的IAM策略。最低权限集包括:
"Action": ["s3:DeleteObject*","s3:GetObject*","s3:ListBucket","s3:PutObject*"],
"Resource": ["arn:aws:s3:::<your-S3-bucket>*","arn:aws:s3:::<your-S3-bucket>*/*"],
2. 配置了两个IAM角色:一个用于控制平面组件,另一个用于工作Pod和flytepropeller运行的数据平面。
注意:使用本文档中的指导,确保遵循您自己AWS组织的策略来配置IAM资源。
3. 每个 EKS 集群都需要关联 OIDC 提供商,可以使用以下命令为每个 EKS 集群创建并关联一个 OIDC 提供商:
eksctl utils associate-iam-oidc-provider --cluster <Name-EKS-Cluster> --app
4. 需要为每种 EKS 集群类型(控制平面或数据平面)设置 IAM 信任关系,以关联系统运行所在的服务账户和命名空间。
按照以下步骤完成上述要求:
1)控制平面(Control plane)角色
a. 使用以下命令创建一个 IAM 角色并配置初始的信任关系:
eksctl create iamserviceaccount --cluster=<controlplane-cluster-name> --name=flyteadmin --role-only --role-name=flyte-controlplane-role --attach-policy-arn <ARN-of-your-IAM-policy> --approve --region <AWS-REGION-CODE> --namespace flyte
b. 前往 AWS 管理控制台的 IAM 部分,选择刚创建的角色。
c. 进入 Trust Relationships(信任关系)选项卡,编辑信任策略。
d. 在信任策略中添加 datacatalog 服务账户。
注意:启用缓存后,数据目录服务将工作流输入的哈希值与输出一起存储在blob存储中。在 此处了解更多信息。配置示例:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::<ACCOUNT-ID>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<CONTROLPLANE-OIDC-PROVIDER>"},"Action": "sts:AssumeRoleWithWebIdentity","Condition": {"StringEquals": {"oidc.eks.<REGION>.amazonaws.com/id/<CONTROLPLANE-OIDC-PROVIDER>:aud": "sts.amazonaws.com","oidc.eks.<REGION>.amazonaws.com/id/<CONTROLPLANE-OIDC-PROVIDER>:sub": ["system:serviceaccount:flyte:flyteadmin","system:serviceaccount:flyte:datacatalog"]}}}] }
2)数据平面(Data plane)角色
a. 创建数据平面角色和信任关系
eksctl create iamserviceaccount --cluster=<dataplane1-cluster-name> --name=flytepropeller --role-only --role-name=flyte-dataplane-role --attach-policy-arn <ARN-of-your-IAM-policy> --approve --region <AWS-REGION-CODE> --namespace flyte
b. 编辑数据平面角色的信任关系
注意:默认情况下,每个用于任务执行的 Pod 都会使用其所在命名空间中的默认服务账户。在您的集群中,命名空间的数量将与项目和域的组合数量相同。因此,在信任策略中使用StringLike
条件并为命名空间名称使用通配符可能会很有用。c. 添加默认服务账户:
以下是一个数据平面集群的示例配置:
注意:为了进一步优化信任关系,请考虑使用StringEquals条件,并仅为Flyte任务将运行的项目域命名空间添加默认服务帐户,而不是使用通配符。{ "Version": "2012-10-17", "Statement": [ {"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::<AWS-ACCOUNT-ID>:oidc-provider/oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>"},"Action": "sts:AssumeRoleWithWebIdentity","Condition": {"StringLike": {"oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>.:aud": "sts.amazonaws.com","oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>.:sub": ["system:serviceaccount:flyte:flytepropeller","system:serviceaccount:*:default"]}} }
数据平面(Data plane)部署
假设有两个 K8S 集群,并且可以通过 kubectl
访问它们。我们将这两个集群分别称为 dataplane1 和 dataplane2。本节中,仅准备第一个集群。
相关的helm chart详情可以参考:flyte/charts/flyte-core at master · flyteorg/flyte · GitHub
1. 添加 Flyte 的 Helm 仓库
helm repo add flyteorg https://flyteorg.github.io/flyte
helm repo update
# Get flyte-core helm chart
helm fetch --untar --untardir . flyteorg/flyte-core
cd flyte-core
2. 打开 values-dataplane.yaml
文件,并添加以下内容:
configmap:admin:admin:endpoint: <your-Ingress-FQDN>:443 #indicate the URL you're using to connect to Flyteinsecure: false #enables secure communication over SSL. Requires a signed certificatecatalog:catalog-cache:endpoint: <your-datacatalog-address>insecure: false
注意:
此步骤的目的是使数据平面集群中的flytepropeller
实例能够向控制平面的flyteadmin
服务发送通知。
控制平面的 Catalog 服务用于缓存,但默认情况下不会通过 Ingress 暴露,也没有独立的身份验证机制。如果多个集群使用相同的 VPC 网络,可通过内部负载均衡器(例如 GKE 文档或 AWS Load Balancer Controller)将控制平面的 Catalog 服务提供给数据平面集群中的flytepropeller
服务。
3. 安装 Flyte 数据平面 Helm Chart
使用部署控制平面时使用的 values-eks.yaml
或 values-gcp.yaml
文件。
在AWS上通过values-eks.yaml
helm install flyte-core-data flyteorg/flyte-core -n flyte \
--values values-eks.yaml --values values-dataplane.yaml \
--create-namespace
在GCP上通过values-gcp.yaml
helm install flyte-core-data -n flyte flyteorg/flyte-core \--values values-gcp.yaml \--values values-dataplane.yaml \--create-namespace flyte
控制平面(Control plane)配置
为了让 flyteadmin
访问并在一个或多个 Flyte 数据平面集群中创建 Kubernetes 资源,需要每个集群的凭据。Flyte 使用 Kubernetes 服务账户来实现控制平面对数据平面 Kubernetes API Server 的认证请求。
默认情况下,Helm Chart 会在每个数据平面集群中创建一个服务账户。为了验证请求,Kubernetes API Server 需要附加到服务账户上的签名令牌。从 Kubernetes 1.24 开始,令牌需要手动生成。
1. 在数据平面集群中为 flyteadmin
服务账户创建长效令牌
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:name: dataplane1-tokennamespace: flyteannotations:kubernetes.io/service-account.name: flyteadmin
type: kubernetes.io/service-account-token
EOF
2. 创建一个名为 secrets.yaml
的新文件,内容如下:
apiVersion: v1
kind: Secret
metadata:name: cluster-credentialsnamespace: flyte
type: Opaque
data:
注意:凭据包括两个部分(CA 证书和令牌)。
3. 复制第一个数据平面集群的 Secret 中的令牌到剪贴板:
kubectl get secret -n flyte dataplane1-token \-o jsonpath='{.data.token}' | pbcopy
4. 将令牌粘贴到 secrets.yaml
的 stringData
部分:
apiVersion: v1
kind: Secret
metadata:name: cluster-credentialsnamespace: flyte
type: Opaque
data:dataplane_1_token: <your-dataplane1-token>
5. 获取相应的证书:
kubectl get secret -n flyte dataplane1-token \-o jsonpath='{.data.ca\.crt}' | pbcopy
6. 在secrets.yaml文件中为证书添加另一个条目:
apiVersion: v1
kind: Secret
metadata:name: cluster-credentialsnamespace: flyte
type: Opaque
data:dataplane_1_token: <your-dataplane1-token>dataplane_1_cacert: <your-dataplane1-token-certificate>
7. 连接到控制平面群集并创建群集凭据密钥:
kubectl apply -f secrets.yaml
8. 创建一个名为values-override.yaml的文件,并向其中添加以下配置:
flyteadmin:additionalVolumes:- name: cluster-credentialssecret:secretName: cluster-credentialsadditionalVolumeMounts:- name: cluster-credentialsmountPath: /var/run/credentialsinitContainerClusterSyncAdditionalVolumeMounts:- name: cluster-credentialsmountPath: /etc/credentials
configmap:clusters:labelClusterMap:label1:- id: dataplane_1weight: 1clusterConfigs:- name: "dataplane_1"endpoint: https://<your-dataplane1-kubeapi-endpoint>:443enabled: trueauth:type: "file_path"tokenPath: "/var/run/credentials/dataplane_1_token"certPath: "/var/run/credentials/dataplane_1_cacert"
注意:通常,您可以使用以下命令获取Kubernetes API端点URL:
kubectl cluster-info
在此配置中,label1
和 label2
只是标签,稍后将在流程中用于配置映射,以便将匹配这些标签的工作流执行分配到一个或多个集群中,具体取决于权重(例如,label1
对应 dataplane_1
)。权重表示特定集群相对于 labelClusterMap
条目中其他集群的优先级。在某个标签下,所有权重的总和必须等于 1。
9. 将flyte数据平面角色IAM角色添加为values-eks.yaml文件中的默认IamRole。请参阅此处。
10. 使用Helm升级控制平面:
此步骤将禁用控制平面集群中的flytepropeller,从而无法在那里运行工作流。如果需要控制平面运行工作流,请编辑values-contrololplane.yaml文件,将flytepropeller.enabled设置为true,并为控制平面集群本身添加一个额外的集群配置:
configmap:clusters:clusterConfigs:- name: "dataplane_1"...- name: "controlplane"enabled: trueinCluster: true # Use in-cluster credentials
然后执行升级操作:helm upgrade
AWS上的命令:
helm upgrade flyte-core flyteorg/flyte-core \
--values values-eks-controlplane.yaml --values values-override.yaml \
--values values-eks.yaml -n flyte
GCP上的命令:
helm upgrade flyte -n flyte flyteorg/flyte-core values.yaml \--values values-gcp.yaml \--values values-controlplane.yaml \--values values-override.yaml
11. 验证flyte命名空间中的所有Pod是否都在运行:
kubectl get pods -n flyte
样例输出:
NAME READY STATUS RESTARTS AGE
datacatalog-86f6b9bf64-bp2cj 1/1 Running 0 23h
datacatalog-86f6b9bf64-fjzcp 1/1 Running 0 23h
flyteadmin-84f666b6f5-7g65j 1/1 Running 0 23h
flyteadmin-84f666b6f5-sqfwv 1/1 Running 0 23h
flyteconsole-cdcb48b56-5qzlb 1/1 Running 0 23h
flyteconsole-cdcb48b56-zj75l 1/1 Running 0 23h
flytescheduler-947ccbd6-r8kg5 1/1 Running 0 23h
syncresources-6d8794bbcb-754wn 1/1 Running 0 23h
配置执行群集标签
下一步是配置项目-域或工作流标签,以便在特定的 Kubernetes 集群上进行调度。
1. 配置项目-域映射
1)创建一个名为 ecl.yaml
的文件,内容如下:
domain: development
project: project1
value: label1
注意:根据您的环境修改domain
和project
。value
必须与values-override.yaml
文件中labelClusterMap
下的条目一致。
2)对需要配置的每个项目-域映射,重复第 1 步,为每个映射创建一个 YAML 文件。
3)更新项目和域的执行集群标签,运行以下命令更新执行集群标签:
flytectl update execution-cluster-label --attrFile ecl.yaml
样例输出:
Updated attributes from team1 project and domain development
4)指定项目和域执行工作流,运行以下命令来执行工作流,同时指定项目和域:
pyflyte run --remote --project team1 --domain development example.py training_workflow \ ✔ ╱ docs-development-env
--hyperparameters '{"C": 0.1}'
2. 配置特定工作流映射
1)创建 workflow-ecl.yaml
文件,以下是文件内容示例:
domain: development
project: project1
workflow: example.training_workflow
value: project1
2)更新项目和域的执行集群标签,运行以下命令更新指定工作流的执行集群标签:
flytectl update execution-cluster-label \-p project1 -d development \example.training_workflow \--attrFile workflow-ecl.yaml
3)指定项目和域执行工作流,运行以下命令执行工作流,同时指定项目和域:
pyflyte run --remote --project team1 --domain development example.py training_workflow \ ✔ ╱ docs-development-env
--hyperparameters '{"C": 0.1}'
通过以上配置,属于特定项目-域或单个特定工作流的执行将被调度到目标标签的集群上。
增加一个 Kubernetes 集群
在本部分中,将介绍扩展部署以添加一个 Kubernetes 集群的必要步骤。此过程可重复以添加更多K8S集群。
以AWS上为例:
1. 创建新集群:
eksctl create cluster --name flyte-dataplane-2 --region <AWS-REGION-CODE> --version 1.25 --vpc-private-subnets <subnet-ID-1>,<subnet-ID-2> --without-nodegroup
注意:此步骤仅为创建 EKS 集群的多种方式之一。请根据实际的组织内的策略完成此步骤。
2. 向集群添加节点组:通常,t3.xlarge
实例可提供足够的资源开始使用。请根据您组织的政策选择配置。
3. 为新集群创建 OIDC 提供商:
eksctl utils associate-iam-oidc-provider --cluster flyte-dataplane-2 --region <AWS-REGION-CODE> --approve
4. 记录 OIDC 提供商 ID:
aws eks describe-cluster --region <AWS-REGION-CODE> --name flyte-dataplane-2 --query "cluster.identity.oidc.issuer" --output text
5. 进入AWS管理控制台中的IAM部分,编辑flyte-dataplane-role角色的信任策略
6. 添加一个新的主体(Principal),使用新集群的 OIDC 提供商 ID,并包含 Action 和 Conditions 部分:
{
"Version": "2012-10-17",
"Statement": [
{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::<AWS-ACCOUNT-ID>:oidc-provider/oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>"},"Action": "sts:AssumeRoleWithWebIdentity","Condition": {"StringLike": {"oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>:aud": "sts.amazonaws.com","oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE1-OIDC-PROVIDER>:sub": ["system:serviceaccount:flyte:flytepropeller","system:serviceaccount:*:default"]}}},{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::<AWS-ACCOUNT-ID>:oidc-provider/oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE2-OIDC-PROVIDER>"},"Action": "sts:AssumeRoleWithWebIdentity","Condition": {"StringLike": {"oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE2-OIDC-PROVIDER>:aud": "sts.amazonaws.com","oidc.eks.<AWS-REGION-CODE>.amazonaws.com/id/<DATAPLANE2-OIDC-PROVIDER>:sub": ["system:serviceaccount:flyte:flytepropeller","system:serviceaccount:*:default"]}}}]
}
7. 按照数据平面(Data plane)部署部分中的步骤来安装数据平面的Helm chart。
8. 按照前面控制平面配置部分的第1-3步操作,在secrets.yaml
文件中生成并填充一个新部分。
apiVersion: v1
kind: Secret
metadata:
name: cluster-credentials
namespace: flyte
type: Opaque
data:
dataplane_1_token: <your-dataplane1-token>
dataplane_1_cacert: <your-dataplane1-token-certificate>
dataplane_2_token: <your-dataplane2-token>
dataplane_2_cacert: <your-dataplane2-token-certificate>
9. 连接到控制平面集群并更新 cluster-credentials
Secret:
kubect apply -f secrets.yaml
10. 打开 values-override.yaml
文件,添加新集群的信息。虽然添加新标签并非必需,但以下示例中创建了一个新标签,以展示 Flyte 根据用户定义的项目、域和标签映射,在不同集群上调度工作负载的能力:
... #all the above content remains the sameconfigmap:clusters:labelClusterMap:label1:- id: dataplane_1weight: 1label2:- id: dataplane_2weight: 1clusterConfigs:- name: "dataplane_1"endpoint: https://<DATAPLANE-1-K8S-API-ENDPOINT>.com:443enabled: trueauth:type: "file_path"tokenPath: "/var/run/credentials/dataplane_1_token"certPath: "/var/run/credentials/dataplane_1_cacert"- name: "dataplane_2"endpoint: https://<DATAPLANE-1-K8S-API-ENDPOINT>:443enabled: trueauth:type: "file_path"tokenPath: "/var/run/credentials/dataplane_2_token"certPath: "/var/run/credentials/dataplane_2_cacert"
11. 在控制平面集群中升级 Helm 部署:
helm upgrade flyte-core-control flyteorg/flyte-core -n flyte --values values-controlplane.yaml --values values-eks.yaml --values values-override.yaml
12. 创建一个新的执行集群标签文件,内容如下:
domain: production
project: team1
value: label2
13. 更新项目的集群执行标签:
flytectl update execution-cluster-label --attrFile ecl-production.yaml
14. 最后,提交一个符合新集群标签的工作流执行:
pyflyte run --remote --project team1 --domain production example.py \training_workflow --hyperparameters '{"C": 0.1}'
15. 在 UI 上应可以看到执行成功,确认其在新集群中运行: