

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 安裝 Kubeflow 管道
<a name="kubernetes-sagemaker-components-install"></a>

[Kubeflow 管道 (KFP)](https://www.kubeflow.org/docs/components/pipelines/v2/introduction/) 是 Kubeflow 的管道協調流程元件。

您可以在現有的 Amazon Elastic Kubernetes Service (Amazon EKS) 上部署 Kubeflow 管道 (KFP) 或建立新的 Amazon EKS 叢集。使用閘道節點與叢集互動。閘道節點可以是您的本機機器或 Amazon EC2 執行個體。

以下部分將引導您完成設置和設定這些資源的步驟。

**Topics**
+ [選擇安裝選項](#choose-install-option)
+ [設定您的管道許可以存取 SageMaker AI](#configure-permissions-for-pipeline)
+ [存取 KFP 使用者介面 (Kubeflow 儀表板)](#access-the-kfp-ui)

## 選擇安裝選項
<a name="choose-install-option"></a>

Kubeflow 管道可作為 Kubeflow 在 上完整分佈的核心元件 AWS 或獨立安裝。

選取適用於您使用案例的選項：

1. [AWS 部署時的完整 Kubeflow](#full-kubeflow-deployment)

   若要使用 Kubeflow 管道以外的其他 Kubeflow 元件，請選擇完整的 [AWS Kubeflow 發行版](https://awslabs.github.io/kubeflow-manifests)部署。

1. [獨立 Kubeflow 管道部署](#kubeflow-pipelines-standalone)

   若要在不使用 Kubeflow 的其他元件的情況下使用 Kubeflow 管道，請獨立安裝 Kubeflow 管道。

### AWS 部署時的完整 Kubeflow
<a name="full-kubeflow-deployment"></a>

若要在 上安裝 Kubeflow 的完整版本 AWS，請從部署[指南上的 Kubeflow 或任何其他支援與各種服務 (Amazon S3、Amazon RDS、Amazon Cognito) 整合的部署選項中選擇 vanilla AWS](https://awslabs.github.io/kubeflow-manifests/docs/deployment/) 部署選項。 AWS Amazon S3 Amazon Cognito

### 獨立 Kubeflow 管道部署
<a name="kubeflow-pipelines-standalone"></a>

本節假設您的使用者具有建立角色和定義角色政策的權限。

#### 設定閘道節點
<a name="set-up-a-gateway-node"></a>

您可以使用本機機器或 Amazon EC2 執行個體作為閘道節點。閘道節點可用來建立 Amazon EKS 叢集並存取 Kubeflow 管道使用者介面。

完成以下步驟以設定節點。

1. 

**建立閘道節點。**

   您可以使用現有的 Amazon EC2 執行個體，也可以使用[啟動和設定 DLAMI](https://docs.aws.amazon.com/dlami/latest/devguide/launch-config.html) 中的步驟，使用最新的 Ubuntu 18.04 DLAMI 版本建立新執行個體。

1. 

**建立 IAM 角色以授予閘道節點對 AWS 資源的存取權。**

   建立具有下列資源許可的 IAM 角色：CloudWatch CloudFormation、IAM、Amazon EC2、Amazon S3、Amazon EKS。

   將下列內嵌政策連接到角色：
   + 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)
   + IAMFullAccess 
   + AmazonS3FullAccess 
   + AmazonEC2FullAccess 
   + AmazonEKSAdminPolicy (使用 [Amazon 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 管道
<a name="install-kubeflow-pipelines"></a>

從閘道節點的終端機執行下列步驟，以在叢集上安裝 Kubeflow 管道。

1. 安裝所有[憑證管理員元件](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 管道。

   ```
   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 管道服務和其他相關資源正在執行中。

   ```
   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 管道 Pod 存取 SageMaker AI 服務的許可。

### SageMaker AI 元件版本 2 組態
<a name="permissions-for-SM-v2"></a>

若要執行適用於 Kubeflow 管道的 SageMaker AI 元件版本 2，您需要安裝 [SageMaker AI Operator for Kubernetes](https://github.com/aws-controllers-k8s/sagemaker-controller)，並設定角色型存取控制 (RBAC)，允許 Kubeflow 管道 Pod 在您的 Kubernetes 叢集中建立 SageMaker AI 自訂資源。

**重要**  
如果您使用 Kubeflow 管道獨立部署，請遵循本節的指示操作。如果您使用的是 AWS Kubeflow 版本 1.6.0-aws-b1.0.0 或更高版本，SageMaker AI 元件版本 2 已設定。

1. 安裝 SageMaker AI Operator for Kubernetes，以使用 SageMaker AI 元件版本 2。

   遵循[使用 ACK SageMaker AI 控制器進行機器學習教學課程](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/#setup)的*設定*一節。

1. 針對 Kubeflow 管道 Pod 所使用的執行角色 (服務帳戶) 設定 RBAC 許可。在 Kubeflow 管道獨立部署中，管道執行會使用 `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 管道的 SageMaker AI 元件版本 1，Kubeflow 管道 Pod 需要存取 SageMaker AI。

**重要**  
無論您是在 AWS 部署上使用完整的 Kubeflow，還是獨立使用 Kubeflow Pilepines，請遵循本節。

若要建立 IAM 執行角色，將 Kubeflow 管道 Pod 存取權授予 SageMaker AI，請遵循下列步驟：

1. 匯出您的叢集名稱 (例如*my-cluster-name*) 和叢集區域 (例如 *us-east-1*)。

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

1. 根據安裝類型，匯出命名空間和服務帳戶名稱。
   + 如需 AWS 安裝時的完整 Kubeflow，請將您的設定檔 `namespace`（例如 *kubeflow-user-example-com*) 和 *default-editor* 匯出為服務帳戶。

     ```
     export NAMESPACE=kubeflow-user-example-com
     export KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT=default-editor
     ```
   + 對於獨立管道部署，請將 *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 Pod 建立 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 版，請遵循[AWS 文件上 Kubeflow 上 Kubeflow](https://awslabs.github.io/kubeflow-manifests/docs/amazon-sagemaker-integration/sagemaker-components-for-kubeflow-pipelines/) 管道的 SageMaker AI 元件指南。

## 存取 KFP 使用者介面 (Kubeflow 儀表板)
<a name="access-the-kfp-ui"></a>

Kubeflow 管道使用者介面可用來管理和追蹤叢集上的實驗、工作和執行。如需有關如何從閘道節點存取 Kubeflow 管道使用者介面的指示，請遵循本節中與您的部署選項對應的步驟。

### AWS 部署時的完整 Kubeflow
<a name="access-kfp-ui-full-kubeflow-deployment"></a>

遵循[AWS 網站上的 Kubeflow](https://awslabs.github.io/kubeflow-manifests/docs/deployment/connect-kubeflow-dashboard/) 上的指示，連接到 Kubeflow 儀表板並導覽至管道索引標籤。

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

遵循以下步驟，使用連接埠轉遞功能，從閘道節點存取 Kubeflow 管道使用者介面。

#### 設定連接埠轉送至 KFP 使用者介面服務
<a name="set-up-port-forwarding-to-the-kfp-ui-service"></a>

從閘道節點的命令列執行下列命令。

1. 使用以下命令驗證 KFP 使用者介面服務是否正在執行。

   ```
   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 使用者介面服務的連接埠轉送。這會將 KFP 使用者介面轉送到閘道節點上的連接埠 8080，並允許您從瀏覽器存取 KFP 使用者介面。

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

   如果沒有任何活動，遠端機器的連接埠轉發會停止。如果儀表板無法取得日誌或更新，請再次執行此命令。如果命令傳回錯誤，請確保您嘗試使用的連接埠上沒有任何進程已在執行。

#### 存取 KFP 使用者介面服務
<a name="set-up-port-forwarding-to-the-kfp-ui-service-access"></a>

您存取 KFP 使用者介面的方法取決於閘道節點類型。
+ 本地機器作為閘道節點：

  1. 在瀏覽器中存取儀表板，如下所示：

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

  1. 選擇**管道**以存取管道使用者介面。
+ 作為閘道節點的 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 使用者介面。

#### (選用) 授予 SageMaker AI 筆記本執行個體存取 Amazon EKS 的權限，並從您的筆記本執行 KFP 管道。
<a name="add-access-to-additional-iam-users-or-roles"></a>

SageMaker 筆記本執行個體屬於全受管的 Amazon EC2 運算執行個體，其可執行 Jupyter 筆記本應用程式。您可以使用筆記本執行個體來建立和管理 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. 執行此命令將以下政策 (AmazonSageMakerFullAccess、AmazonEKSWorkerNodePolicy、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
   ```