

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

# 安装 Kubeflow Pipelines
<a name="kubernetes-sagemaker-components-install"></a>

[Kubeflow Pipelines (KFP)](https://www.kubeflow.org/docs/components/pipelines/v2/introduction/) 是 Kubeflow 的管道编排组件。

您可以在现有 Amazon Elastic Kubernetes Service (Amazon EKS) 上部署 Kubeflow Pipelines (KFP)，也可以创建新的 Amazon EKS 集群。使用网关节点与您的集群进行交互。网关节点可以是您的本地计算机，也可以是 Amazon EC2 实例。

以下部分将指导您完成设置和配置这些资源的步骤。

**Topics**
+ [

## 选择安装选项
](#choose-install-option)
+ [

## 配置您的管道权限以访问 SageMaker AI
](#configure-permissions-for-pipeline)
+ [

## 访问 KFP UI（Kubeflow 控制面板）
](#access-the-kfp-ui)

## 选择安装选项
<a name="choose-install-option"></a>

Kubeflow Pipelines 可用作 Kubeflow 完整发行版的核心组件， AWS 也可以作为独立安装使用。

选择适用于您的使用案例的选项：

1. [部署时已完成 Kubeflow AWS](#full-kubeflow-deployment)

   要使用 Kubeflow Pipelines 之外的其他 Kubeflow 组件，请选择完整的 [Kubeflow on AWS 分发版](https://awslabs.github.io/kubeflow-manifests)部署。

1. [独立 Kubeflow Pipelines 部署](#kubeflow-pipelines-standalone)

   要在不使用 Kubeflow 其他组件的情况下使用 Kubeflow Pipelines，请独立安装 Kubeflow Pipelines。

### 部署时已完成 Kubeflow AWS
<a name="full-kubeflow-deployment"></a>

要在上安装 Kubeflow 的完整版本 AWS，请从部署[指南上的 Kubeflow 中选择普通 AWS 部署](https://awslabs.github.io/kubeflow-manifests/docs/deployment/)选项或任何其他支持与各种服务（ AWS 亚马逊 S3、亚马逊 RDS、亚马逊 Cognito）集成的部署选项。

### 独立 Kubeflow Pipelines 部署
<a name="kubeflow-pipelines-standalone"></a>

本节假设您的用户有权创建角色并为该角色定义策略。

#### 设置网关节点
<a name="set-up-a-gateway-node"></a>

您可以使用本地计算机或 Amazon EC2 实例作为网关节点。网关节点用于创建 Amazon EKS 集群并访问 Kubeflow Pipelines UI。

完成以下步骤以设置节点。

1. 

**创建网关节点。**

   您可以使用现有 Amazon EC2 实例，也可以按照[启动和配置 DLAMI](https://docs.aws.amazon.com/dlami/latest/devguide/launch-config.html) 中的步骤使用最新 Ubuntu 18.04 DLAMI 版本创建一个新实例。

1. 

**创建 IAM 角色以授予网关节点对 AWS 资源的访问权限。**

   创建具有以下资源权限的 IAM 角色： CloudWatch、、IAM、Amazon EC2 CloudFormation、Amazon S3、Amazon EKS。

   将以下策略附加到 IAM 角色：
   + CloudWatchLogsFullAccess 
   + [https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess)
   + IAMFull访问权限 
   + 亚马逊 3 FullAccess 
   + Amazon EC2 FullAccess 
   + 亚马逊EKSAdmin政策（使用 A [mazon EKS 基于身份的策略示例中的架构创建此策略](https://docs.aws.amazon.com/eks/latest/userguide/security_iam_id-based-policy-examples.html)） 

   有关将 IAM 权限添加到 IAM 角色的信息，请参阅[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

1. 

**安装以下工具和客户端**

   在您的网关节点上安装和配置以下工具和资源，以访问 Amazon EKS 集群和 KFP 用户界面 (UI)。
   + [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)：用于处理 AWS 服务的命令行工具。有关 AWS CLI 配置信息，请参阅[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
   + [aws-iam-authenticator](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html)0.1.31 及更高版本：一种使用 AWS IAM 凭证对 Kubernetes 集群进行身份验证的工具。
   + [https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html) 0.15 以上的版本：用于处理 Amazon EKS 集群的命令行工具。
   + [https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl)：用于与 Kubernetes 集群一起使用的命令行工具。该版本需要在一个次要版本中与您的 Kubernetes 版本相匹配。
   + [https://aws.amazon.com/sdk-for-python/](https://aws.amazon.com/sdk-for-python/).

     ```
     pip install boto3
     ```

#### 设置 Amazon EKS 集群
<a name="set-up-anamazon-eks-cluster"></a>

1. 如果您没有现有 Amazon EKS 集群，请在网关节点的命令行中运行以下步骤，否则请跳过此步骤。

   1. 运行以下命令创建 1.17 或更高版本的 Amazon EKS 集群。将 `<clustername>` 替换为您的任何集群名称。

      ```
      eksctl create cluster --name <clustername> --region us-east-1 --auto-kubeconfig --timeout=50m --managed --nodes=1
      ```

   1. 集群创建完成后，通过列出集群的节点来确保您可以访问集群。

      ```
      kubectl get nodes
      ```

1. 使用以下命令确保当前 `kubectl` 上下文指向您的集群。当前上下文在输出中以星号 (\$1) 标记。

   ```
   kubectl config get-contexts
   
   CURRENT NAME     CLUSTER
   *   <username>@<clustername>.us-east-1.eksctl.io   <clustername>.us-east-1.eksctl.io
   ```

1. 如果所需的集群未配置为当前的默认集群，请使用以下命令更新默认集群。

   ```
   aws eks update-kubeconfig --name <clustername> --region us-east-1
   ```

#### 安装 Kubeflow Pipelines
<a name="install-kubeflow-pipelines"></a>

从网关节点的终端运行以下步骤，以在集群上安装 Kubeflow Pipelines。

1. 安装所有 [cert-manager 组件](https://cert-manager.io/docs/installation/kubectl/)。

   ```
   kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml
   ```

1. 安装 Kubeflow Pipelines。

   ```
   export PIPELINE_VERSION=2.0.0-alpha.5
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/cert-manager/cluster-scoped-resources?ref=$KFP_VERSION"
   kubectl wait --for condition=established --timeout=60s crd/applications.app.k8s.io
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/cert-manager/dev?ref=$KFP_VERSION"
   ```

1. 确保 Kubeflow Pipelines 服务和其他相关资源正在运行。

   ```
   kubectl -n kubeflow get all | grep pipeline
   ```

   您的输出应与以下内容类似。

   ```
   pod/ml-pipeline-6b88c67994-kdtjv                      1/1     Running            0          2d
   pod/ml-pipeline-persistenceagent-64d74dfdbf-66stk     1/1     Running            0          2d
   pod/ml-pipeline-scheduledworkflow-65bdf46db7-5x9qj    1/1     Running            0          2d
   pod/ml-pipeline-ui-66cc4cffb6-cmsdb                   1/1     Running            0          2d
   pod/ml-pipeline-viewer-crd-6db65ccc4-wqlzj            1/1     Running            0          2d
   pod/ml-pipeline-visualizationserver-9c47576f4-bqmx4   1/1     Running            0          2d
   service/ml-pipeline                       ClusterIP   10.100.170.170   <none>        8888/TCP,8887/TCP   2d
   service/ml-pipeline-ui                    ClusterIP   10.100.38.71     <none>        80/TCP              2d
   service/ml-pipeline-visualizationserver   ClusterIP   10.100.61.47     <none>        8888/TCP            2d
   deployment.apps/ml-pipeline                       1/1     1            1           2d
   deployment.apps/ml-pipeline-persistenceagent      1/1     1            1           2d
   deployment.apps/ml-pipeline-scheduledworkflow     1/1     1            1           2d
   deployment.apps/ml-pipeline-ui                    1/1     1            1           2d
   deployment.apps/ml-pipeline-viewer-crd            1/1     1            1           2d
   deployment.apps/ml-pipeline-visualizationserver   1/1     1            1           2d
   replicaset.apps/ml-pipeline-6b88c67994                      1         1         1       2d
   replicaset.apps/ml-pipeline-persistenceagent-64d74dfdbf     1         1         1       2d
   replicaset.apps/ml-pipeline-scheduledworkflow-65bdf46db7    1         1         1       2d
   replicaset.apps/ml-pipeline-ui-66cc4cffb6                   1         1         1       2d
   replicaset.apps/ml-pipeline-viewer-crd-6db65ccc4            1         1         1       2d
   replicaset.apps/ml-pipeline-visualizationserver-9c47576f4   1         1         1       2d
   ```

## 配置您的管道权限以访问 SageMaker AI
<a name="configure-permissions-for-pipeline"></a>

在本节中，您将创建一个 IAM 执行角色，授予 Kubeflow Pipeline 容器对 SageMaker AI 服务的访问权限。

### SageMaker AI 组件版本 2 的配置
<a name="permissions-for-SM-v2"></a>

要运行适用于 Kubeflow Pipelines 的 SageMaker AI 组件版本 2，你需要安装适用于 K [ubernetes 的 SageMaker AI Operator](https://github.com/aws-controllers-k8s/sagemaker-controller) 并配置基于角色的访问控制 (RBAC)，允许 Kubeflow Pipelines pod 在你的 Kubernetes 集群中创建 AI 自定义资源。 SageMaker 

**重要**  
如果您使用的是 Kubeflow Pipelines 独立部署，请按照本节进行操作。如果你使用的是 Kubeflow 版本 1.6.0-aws-b1.0.0 或更高版本的 AWS 发行版，那么人工智能组件版本 2 已经设置好了。 SageMaker 

1. 安装适用于 Kubernetes 的 SageMaker AI Operator 以使用 SageMaker 人工智能组件版本 2。

   按照使用 [ACK SageMaker AI 控制器的 Machine Learning 教程](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/#setup)中的*设置*部分进行操作。

1. 为 Kubeflow Pipelines Pod 使用的执行角色（服务账号）配置 RBAC 权限。在 Kubeflow Pipelines 独立部署中，使用 `pipeline-runner` 服务账号在命名空间 `kubeflow` 中执行管道运行。

   1. 创建一个 [RoleBinding](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-example)，向服务帐号授予管理 SageMaker AI 自定义资源的权限。

      ```
      cat > manage_sagemaker_cr.yaml <<EOF
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
      name: manage-sagemaker-cr  
      namespace: kubeflow
      subjects:
      - kind: ServiceAccount
      name: pipeline-runner
      namespace: kubeflow
      roleRef:
      kind: ClusterRole
      name: ack-sagemaker-controller 
      apiGroup: rbac.authorization.k8s.io
      EOF
      ```

      ```
      kubectl apply -f manage_sagemaker_cr.yaml
      ```

   1. 确保 RoleBinding 是通过运行以下命令创建：

      ```
      kubectl get rolebinding manage-sagemaker-cr -n kubeflow -o yaml
      ```

### SageMaker AI 组件版本 1 的配置
<a name="permissions-for-SM-v1"></a>

要运行适用于 Kubeflow Pipelines 的 SageMaker AI 组件版本 1，Kubeflow Pipeline 容器需要访问人工智能。 SageMaker 

**重要**  
无论你是在 AWS 部署时使用完整的 Kubeflow 还是独立的 Kubeflow Pilepines，都要遵循本节。

要创建授予 Kubeflow 管道容器访问 A SageMaker I 的 IAM 执行角色，请按照以下步骤操作：

1. 导出您的集群名称（例如 *my-cluster-name*）和集群区域（例如 us-ea *st-1*）。

   ```
   export CLUSTER_NAME=my-cluster-name
   export CLUSTER_REGION=us-east-1
   ```

1. 根据您的安装导出命名空间和服务账户名称。
   + 要在 AWS 安装时获得完整的 Kubeflow，请将您的配置文件`namespace`（例如 *kubeflow-user-example-com*）和*默认编辑器导*出为服务账号。

     ```
     export NAMESPACE=kubeflow-user-example-com
     export KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT=default-editor
     ```
   + 要独立部署 Pipelines，请将 *kubeflow* 导出为 `namespace`，将 *pipeline-runner* 导出为服务账户。

     ```
     export NAMESPACE=kubeflow
     export KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT=pipeline-runner
     ```

1. 使用以下命令创建[适用于 Amazon EKS 集群的 IAM OIDC 提供商](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   ```
   eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
               --region ${CLUSTER_REGION} --approve
   ```

1. 为 KFP 容器创建一个 IAM 执行角色以访问 AWS 服务 (SageMaker AI、 CloudWatch)。

   ```
   eksctl create iamserviceaccount \
   --name ${KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT} \
   --namespace ${NAMESPACE} --cluster ${CLUSTER_NAME} \
   --region ${CLUSTER_REGION} \
   --attach-policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess \
   --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
   --override-existing-serviceaccounts \
   --approve
   ```

[将管道权限配置为访问 SageMaker AI 组件版本 1 后，请按照 Kubeflow 上的 Kubeflow 管道 SageMaker 人工智能组件指南中的文档进行操作。 AWS](https://awslabs.github.io/kubeflow-manifests/docs/amazon-sagemaker-integration/sagemaker-components-for-kubeflow-pipelines/)

## 访问 KFP UI（Kubeflow 控制面板）
<a name="access-the-kfp-ui"></a>

Kubeflow Pipelines UI 用于管理和跟踪集群上的实验、作业和运行。有关如何从网关节点访问 Kubeflow Pipelines UI 的说明，请按照本节中适用于您的部署选项的步骤进行操作。

### 部署时已完成 Kubeflow AWS
<a name="access-kfp-ui-full-kubeflow-deployment"></a>

按照[AWS 网站上 Kubeflow 上的](https://awslabs.github.io/kubeflow-manifests/docs/deployment/connect-kubeflow-dashboard/)说明连接到 Kubeflow 控制面板并导航到 “管道” 选项卡。

### 独立 Kubeflow Pipelines 部署
<a name="access-kfp-ui-standalone-kubeflow-pipelines-deployment"></a>

按照以下步骤使用端口转发从您的网关节点访问 Kubeflow Pipelines UI。

#### 设置到 KFP UI 服务的端口转发
<a name="set-up-port-forwarding-to-the-kfp-ui-service"></a>

从网关节点的命令行运行以下命令。

1. 请使用以下命令验证 KFP UI 服务是否正在运行。

   ```
   kubectl -n kubeflow get service ml-pipeline-ui
   
   NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
   ml-pipeline-ui   ClusterIP   10.100.38.71   <none>        80/TCP    2d22h
   ```

1. 运行以下命令以设置到 KFP UI 服务的端口转发。这会将 KFP UI 转发到网关节点上的端口 8080，并允许您从浏览器访问 KFP UI。

   ```
   kubectl port-forward -n kubeflow service/ml-pipeline-ui 8080:80
   ```

   如果没有活动，则远程计算机的端口转发就会停止。如果您的控制面板无法获取日志或更新，请再次运行此命令。如果命令返回错误，请确保您尝试使用的端口上没有正在运行的进程。

#### 访问 KFP UI 服务
<a name="set-up-port-forwarding-to-the-kfp-ui-service-access"></a>

您访问 KFP UI 的方法取决于网关节点类型。
+ 本地计算机作为网关节点：

  1. 在浏览器中访问控制面板，如下所示：

     ```
     http://localhost:8080
     ```

  1. 选择**管道**以访问管道 UI。
+ Amazon EC2 实例作为网关节点：

  1. 您需要在 Amazon EC2 实例上设置 SSH 隧道，才能从本地计算机的浏览器访问 Kubeflow 控制面板。

     在本地计算机上的新终端会话中，运行以下命令。将 `<public-DNS-of-gateway-node>` 替换为 Amazon EC2 控制台上找到的实例的 IP 地址。您也可以使用公有 DNS。将 `<path_to_key>` 替换为用于访问网关节点的 PEM 密钥的路径。

     ```
     public_DNS_address=<public-DNS-of-gateway-node>
     key=<path_to_key>
     
     on Ubuntu:
     ssh -i ${key} -L 9000:localhost:8080 ubuntu@${public_DNS_address}
     
     or on Amazon Linux:
     ssh -i ${key} -L 9000:localhost:8080 ec2-user@${public_DNS_address}
     ```

  1. 在浏览器中访问控制面板。

     ```
     http://localhost:9000
     ```

  1. 选择**管道**以访问 KFP UI。

#### （可选）授予 SageMaker AI 笔记本实例访问 Amazon EKS 的权限，并从您的笔记本运行 KFP 管道。
<a name="add-access-to-additional-iam-users-or-roles"></a>

 SageMaker 笔记本实例是运行 Jupyter 笔记本应用程序的完全托管的 Amazon EC2 计算实例。您可以使用笔记本实例来创建和管理 Jupyter 笔记本，然后使用 适用于 Python (Boto3) 的 AWS SDK 或 KFP CLI 定义、编译、部署和运行 KFP 管道。

1. 按照创建[ SageMaker 笔记本实例中的步骤创建您的笔记本实](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-setup-working-env.html)例，然后将`S3FullAccess`策略附加到其 IAM 执行角色。

1. 在网关节点的命令行中，运行以下命令以检索您创建的笔记本实例的 IAM 角色 ARN。将 `<instance-name>` 替换为实例的名称。

   ```
   aws sagemaker describe-notebook-instance --notebook-instance-name <instance-name> --region <region> --output text --query 'RoleArn'
   ```

   此命令将输出采用 `arn:aws:iam::<account-id>:role/<role-name>` 格式的 IAM 角色 ARN。记下此 ARN。

1. 运行此命令将以下策略（Amazon AmazonSageMakerFullAccess EKSWorker NodePolicy、AmazonS3FullAccess）附加到此 IAM 角色。将 `<role-name>` 替换为 ARN 中的 `<role-name>`。

   ```
   aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
   aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
   aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
   ```

1. Amazon EKS 集群使用 IAM 角色来控制对集群的访问权限。这些规则是在名为 `aws-auth` 的配置映射中实施。`eksctl` 提供了读取和编辑 `aws-auth` 配置映射的命令。只有有权访问集群的用户才能编辑此配置映射。

   `system:masters` 是具有集群超级用户权限的默认用户组之一。将您的用户添加到此组，或创建具有更严格权限的组。

1. 运行以下命令以将角色绑定到您的集群。将 `<IAM-Role-arn>` 替换为 IAM 角色的 ARN。`<your_username>` 可以是任何唯一的用户名。

   ```
   eksctl create iamidentitymapping \
   --cluster <cluster-name> \
   --arn <IAM-Role-arn> \
   --group system:masters \
   --username <your-username> \
   --region <region>
   ```

1. 在你的 SageMaker AI 实例上打开 Jupyter 笔记本并运行以下命令以确保它可以访问集群。

   ```
   aws eks --region <region> update-kubeconfig --name <cluster-name>
   kubectl -n kubeflow get all | grep pipeline
   ```