본문으로 건너뛰기
버전: docs v25.02

Manage Workspace

Updated 2024.10.02

Topics



자세한 단계

{변수}의 자세한 설명은 Terminology 페이지를 참고하세요

  • Workspace 설명
    • Workspace는 프로젝트 별로 구분된 논리적 공간이며, 프로젝트에 소속된 사용자만 접근 가능합니다. (admin 은 모든 Workspace 에 접근 가능)
      • 사용자는 시스템 사용자(Edge Conductor 용)와 일반 사용자로 구분됩니다.
    • Workspace는 Kubeflow의 Namespace와 매칭되며, Namespace에 접근 가능한 User는 1개 입니다.

1. 사전 준비

설치를 위한 환경 설정이 완료 되어야 합니다. (1. 설치 환경 셋업하기 참고)

export AWS_CLUSTER_NAME=
export AWS_DEFAULT_REGION=
export AWS_DEFAULT_REGION_ALIAS=
export INFRA_NAME=
export DEPLOY_ENV=
export PROJECT_NAME=
export AIC_FRONTEND_URL=
export WORKSPACE_NAME=${PROJECT_NAME}-ws
export PROJECT_DASHBOARD_HASH=
export PROJECT_KUBEFLOW_NAMESPACE_NAME=aic-ns-${WORKSPACE_NAME}
export PROJECT_KUBEFLOW_USER_NAME=aic-user-${WORKSPACE_NAME}
export PROJECT_KUBEFLOW_USER_PASSWD='$2a$12$A6GAI7xf1CjfPCF3MnycvuDcXUdP4O.Ruo7PvQUFUkmKGSYcCiieS'
export PROJECT_KUBEFLOW_USER_UNIQUE_ID=`$(echo date +"%Y%m%d%H%M%S")`
export PROJECT_S3_BUCKET_NAME=s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-${PROJECT_NAME}
export PROJECT_NODEGROUP_SPEC=standard
export PROJECT_NODEGROUP_LABEL=${PROJECT_NAME}-ws-${PROJECT_NODEGROUP_SPEC}
export PROJECT_NODEGROUP_NAME=ng-${AWS_DEFAULT_REGION_ALIAS}-aicond-${PROJECT_NAME}-ws-${PROJECT_NODEGROUP_SPEC}
export PROJECT_NODEGROUP_DESIRED_SIZE=
export PROJECT_NODEGROUP_MIN=0
export PROJECT_NODEGROUP_MAX=
export PROJECT_NODEGROUP_EC2_NAME=
export PROJECT_NODEGROUP_EC2_VCPU=
export PROJECT_NODEGROUP_EC2_MEM=
export PROJECT_NODEGROUP_EC2_GPU=


2. Workspace 추가

Workspace 추가는 아래의 순서로 설치합니다.

  • Project 인프라 설치
    • Kubernetes : Namespace 와 Profile 설치
    • Kubeflow : User 생성
    • Resource : S3 Bucket 생성, Policy 에 S3 Bucket 권한 추가, Nodegroup 생성
  • AI Conductor 에 Workspace 생성
  • AI Conductor 에 Workspace 시스템 계정 생성

2-1. Project 인프라 설치

  • Namespace 와 Profile 생성
    • NOTE : Project에서 사용할 Namespace 는 생성되어 있으면 안됩니다.

    • Namespace 와 Profile 생성을 정의한 create-profile-namespace.yaml 을 생성합니다.

      [Expand create-profile-namespace.yaml]
      cat <<EOT > create-profile-namespace.yaml
      apiVersion: kubeflow.org/v1beta1
      kind: Profile
      metadata:
      name: ${PROJECT_KUBEFLOW_NAMESPACE_NAME}
      spec:
      owner:
      kind: User
      name: ${PROJECT_KUBEFLOW_USER_NAME}@aic.com
      EOT
    • 아래 명령어로 Namespace 와 Profile 생성합니다.

      kubectl apply -f create-profile-namespace.yaml
    • Namespace 와 Profile 생성 확인

      • Annotaion 에서 owner 확인
      kubectl describe namespace ${PROJECT_KUBEFLOW_NAMESPACE_NAME}

      # 출력
      Name:         ${PROJECT_KUBEFLOW_NAMESPACE_NAME}
      Labels: app.kubernetes.io/part-of=kubeflow-profile
      istio-injection=enabled
      katib.kubeflow.org/metrics-collector-injection=enabled
      kubernetes.io/metadata.name=${PROJECT_KUBEFLOW_NAMESPACE_NAME}
      pipelines.kubeflow.org/enabled=true
      serving.kubeflow.org/inferenceservice=enabled
      Annotations: owner: ${PROJECT_KUBEFLOW_USER_NAME}@aic.com
      Status: Active

      No resource quota.

      No LimitRange resource.

  • Kubeflow 사용자 계정 생성
    • dex 에서 사용자 정보 획득

      kubectl get configmap dex -n auth -o jsonpath='{.data.config\.yaml}' > dex-config.yaml
    • dex 에 사용자 계정 추가

      • dex-config.yaml : 생성할 Kubeflow 사용자 계정 정보를 추가합니다.
      yq e -i '.staticPasswords += {"email" : env(PROJECT_KUBEFLOW_USER_NAME)+"@aic.com"}' dex-config.yaml
      yq e -i '.staticPasswords[-1] += {"hash" : env(PROJECT_KUBEFLOW_USER_PASSWD)}' dex-config.yaml
      yq e -i '.staticPasswords[-1] += {"username" : env(PROJECT_KUBEFLOW_USER_NAME)}' dex-config.yaml
      yq e -i '.staticPasswords[-1] += {"userID" : "\"" + env(PROJECT_KUBEFLOW_USER_UNIQUE_ID) + "\""}' dex-config.yaml
    • dex 에 사용자 계정 적용

      kubectl create configmap dex --from-file=config.yaml=dex-config.yaml -n auth --dry-run -oyaml | kubectl apply -f -
      kubectl rollout restart deployment dex -n auth


  • Service Account 추가 업데이트
    • 참고 : Amazon Web Services 설정 가이드|5. Kubernetes Service Account 생성하기

    • Kubeflow deploy user 가 사용하는 Service Account에 생성된 S3 Bucket 컨트롤 권한을 추가 합니다.

      export POLICY_UPDATE_NAME=policy-s3-kubeflow-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}
    • {POLICY_UPDATE_NAME} 추가 업데이트 방법

      • 현재 적용된 Policy를 JSON 형태의 yaml 파일로 저장합니다.
        # 가장 최신 Policy Version
        policy_version_id=$(aws iam get-policy --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} | jq -r '.Policy' | jq -r '.DefaultVersionId')

        # Policy JSON 파일(yaml)로 저장
        aws iam get-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --version-id ${policy_version_id} | jq -r '.PolicyVersion' | jq -r '.Document' > ${POLICY_UPDATE_NAME}.yaml
      • {POLICY_UPDATE_NAME}.yaml의 Resource에 {PROJECT_S3_BUCKET_NAME} 을 아래와 같이 추가 합니다.
        yq e -i '.Statement[0].Resource += "arn:aws:s3:::"+env(PROJECT_S3_BUCKET_NAME)' ${POLICY_UPDATE_NAME}.yaml
        yq e -i '.Statement[0].Resource += "arn:aws:s3:::"+env(PROJECT_S3_BUCKET_NAME)+"/*"' ${POLICY_UPDATE_NAME}.yaml
      • {POLICY_UPDATE_NAME}의 Policy Version을 추가합니다.
        aws iam create-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --set-as-default --policy-document file://${POLICY_UPDATE_NAME}.yaml
        • Policy Version 추가 중 에러 발생 시 아래와 같이 해결합니다.

          [Expand Policy Version Error]

          Policy Version 은 최대 5개만 지원하므로, 가장 오래된 Policy Version 을 삭제해야 합니다.

          # Error Message
          An error occurred (LimitExceeded) when calling the CreatePolicyVersion operation: A managed policy can have up to 5 versions. Before you create a new version, you must delete an existing version.

          Policy Version #2 삭제 명령어 예제

          aws iam delete-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --version-id v2
    • AI Conductor Namespace에서 사용하는 Service에 생성된 S3 Bucket 컨트롤 권한을 추가 합니다.

      export POLICY_UPDATE_NAME=policy-s3-aia-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}
    • {POLICY_UPDATE_NAME} 추가 업데이트 (위 방법과 동일)


  • Nodegroup 생성
    • Nodegroup 생성 페이지를 참고

    • Nodegroup 생성을 정의한 create-nodegroup.yaml 을 생성합니다.
      GPU instance 이용을 원하는 경우 {PROJECT_NODEGROUP_EC2_NAME}에 gpu instance name을 입력하세요

      [Expand create-nodegroup.yaml]

      NOTE : "propagateASGTags: true" 필수 설정

      NOTE : availabilityZones 은 {PROJECT_NODEGROUP_EC2_NAME}에 의해 정의됩니다.

      cat <<EOT > create-nodegroup.yaml
      apiVersion: eksctl.io/v1alpha5
      kind: ClusterConfig
      managedNodeGroups:
      - amiFamily: AmazonLinux2
      desiredCapacity: ${PROJECT_NODEGROUP_DESIRED_SIZE}
      disableIMDSv1: false
      disablePodIMDS: false
      iam:
      withAddonPolicies:
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: true
      awsLoadBalancerController: false
      certManager: false
      cloudWatch: false
      ebs: false
      efs: false
      externalDNS: false
      fsx: false
      imageBuilder: false
      xRay: false
      instanceSelector: {}
      instanceType: ${PROJECT_NODEGROUP_EC2_NAME}
      labels:
      aic-role: ${PROJECT_NODEGROUP_LABEL}
      alpha.eksctl.io/cluster-name: ${AWS_CLUSTER_NAME}
      alpha.eksctl.io/nodegroup-name: ${PROJECT_NODEGROUP_NAME}
      maxSize: ${PROJECT_NODEGROUP_MAX}
      minSize: ${PROJECT_NODEGROUP_MIN}
      name: ${PROJECT_NODEGROUP_NAME}
      availabilityZones: ["${AWS_DEFAULT_REGION}a", "${AWS_DEFAULT_REGION}c"]
      privateNetworking: true
      releaseVersion: ""
      securityGroups:
      withLocal: null
      withShared: null
      ssh:
      allow: false
      publicKeyPath: ""
      tags:
      alpha.eksctl.io/nodegroup-name: ${PROJECT_NODEGROUP_NAME}
      alpha.eksctl.io/nodegroup-type: managed
      volumeIOPS: 3000
      volumeSize: 50
      volumeThroughput: 125
      volumeType: gp3
      propagateASGTags: true
      metadata:
      name: ${AWS_CLUSTER_NAME}
      region: ${AWS_DEFAULT_REGION}
      EOT
    • 아래 명령어로 Nodegroup을 생성합니다.

      eksctl create nodegroup --config-file=create-nodegroup.yaml
      [Expand Trouble Shooting : 'AccessConfig']
      error getting cluster stack template: failed to parse GetStackTemplate response: json: unknown field "AccessConfig

      eksctl 업데이트 후 실행


2-2. Project의 Grafana 대시보드 생성

모니터링 인프라가 사전 설치완료 되어야 합니다. (Resource Monitoring 설치 참고) 대시보드 설정의 자세한 방법은 Manage Monitoring Dashboard 페이지를 참고해서 진행합니다.

  • 대시보드의 hash 값 확인
    • Import 된 대시보드의 URL에 해당 대시보드의 구분자인 hash값이 포함되어있습니다. 아래 스크립트로 workspace 추가에 필요한 대시보드 hash 값을 가져올 수 있습니다.
    url="Import 된 대시보드의 URL"
    PROJECT_DASHBOARD_HASH=$(echo "$url" | grep -o '[a-zA-Z0-9]\{13\}' | head -n 1)

2-3. Project의 Workspace 생성

  • {AIC_FRONTEND_URL} 접속
  • admin 권한의 계정으로 로그인
    • ID : {AIC_ADMIN_USER}
    • Password : {AIC_ADMIN_PASSWD}
  • 오른쪽 상단에서 설정 클릭
  • 왼쪽 상단 Workspace 클릭
  • Workspace 생성
    • 우측 상단 + New Workspace 클릭
      • Workspace Name : {PROJECT_NAME}
      • Bucket Name : {PROJECT_S3_BUCKET_NAME}
      • Dashboard Hash : {PROJECT_DASHBOARD_HASH}
      • Resources : (생성된 Nodegroup에 맞춰서 입력)
        • {PROJECT_NODEGROUP_SPEC}
        • vcpu : {PROJECT_NODEGROUP_EC2_VCPU}
        • ram_gb : {PROJECT_NODEGROUP_EC2_MEM}
        • gpu : {PROJECT_NODEGROUP_EC2_GPU}

2-4. Project의 Workspace 시스템 계정 생성

자세한 설명은 일반 계정 추가계정 역할 추가 페이지를 참고하세요

  • {AIC_FRONTEND_URL} 접속

  • admin 권한의 계정으로 로그인

    • ID : {AIC_ADMIN_USER}
    • Password : {AIC_ADMIN_PASSWD}
  • {WORKSPACE_NAME} 선택

  • 오른쪽 상단에서 설정 클릭

  • 시스템 계정 생성

    • 왼쪽 상단 Account 클릭
    • 우측 상단에서 + New Account 클릭
      • NOTE : 아래 3개는 고정된 값입니다. 변경하면 안됩니다.
      • ID : {PROJECT_NAME}-edge
      • Password : {PROJECT_NAME}-edge@com
      • Account Type : Developer
      • Save 클릭
  • 생성된 시스템 계정을 {WORKSPACE_NAME}에 할당    - 왼쪽 상단 Workspace 클릭

    • {WORKSPACE_NAME} 클릭
    • 우측 상단에서 Actions -> Manage Members 클릭
    • {PROJECT_NAME}-edge 체크
    • Role in Workspace 는 Manager
    • Save 클릭


3. Workspace 수정 (TBD)

기능 업데이트 예정



4. Workspace 삭제

NOTE : Workspace 와 관련된 모든 데이터가 삭제되어야 합니다.

Workspace 삭제는 아래의 순서로 삭제합니다. ('Workspace 추가' 순서의 반대)

  • AI Conductor 에 Workspace 시스템 계정 삭제
  • AI Conductor 에 Workspace 삭제
  • Project 인프라 삭제
    • Resource : S3 Bucket 삭제, Policy 에 S3 Bucket 권한 삭제, Nodegroup 삭제
    • Kubeflow : User 삭제
    • Kubernetes : Namespace 와 Profile 삭제

4-1. Project의 Workspace 시스템 계정 삭제

자세한 설명은 계정 역할 삭제일반 계정 삭제 페이지를 참고하세요

  • {AIC_FRONTEND_URL} 접속

  • admin 권한의 계정으로 로그인

    • ID : {AIC_ADMIN_USER}
    • Password : {AIC_ADMIN_PASSWD}
  • {WORKSPACE_NAME} 선택

  • 오른쪽 상단 설정 클릭

  • 생성된 시스템 계정을 {WORKSPACE_NAME}에서 할당 해제    - 왼쪽 상단 Workspace 클릭

    • {WORKSPACE_NAME} 클릭
    • 우측 상단에서 Actions -> Manage Members 클릭
    • {PROJECT_NAME}-edge체크박스 클릭
    • 우측 상단에서 - Delete 클릭
    • OK 클릭
  • 생성된 시스템 계정 삭제

    • 왼쪽 상단 Account 클릭
    • {PROJECT_NAME}-edge체크박스 클릭
    • 우측 상단에서 Actions -> Delete Account 클릭
    • OK 클릭

4-2. Project의 Workspace 삭제

  • {AIC_FRONTEND_URL} 접속
  • admin 권한의 계정으로 로그인
    • ID : {AIC_ADMIN_USER}
    • Password : {AIC_ADMIN_PASSWD}
  • 오른쪽 상단에서 설정 클릭
  • 왼쪽 상단 Workspace 클릭
  • Workspace 삭제
    • **{PROJECT_NAME}**에 체크박스 클릭
    • 우측 상단에서 Actions -> Delete 클릭
    • OK 클릭

4-3. Project 인프라 삭제

  • Nodegroup 삭제
    • Nodegroup 삭제 페이지를 참고
    • create-nodegroup.yaml 을 활용하여 nodegroup을 삭제합니다.
      eksctl delete nodegroup --config-file=create-nodegroup.yaml --approve
    • eksctl 명령어로 nodegroup을 삭제합니다.
      eksctl delete nodegroup --cluster ${AWS_CLUSTER_NAME} --region ${AWS_DEFAULT_REGION} --name ${PROJECT_NODEGROUP_NAME}

  • Service Account 삭제 업데이트
    • 참고 : Amazon Web Services 설정 가이드|5. Kubernetes Service Account 생성하기

    • Kubeflow deploy user 가 사용하는 Service Account에 생성된 S3 Bucket 컨트롤 권한을 삭제 합니다.

      export POLICY_UPDATE_NAME=policy-s3-kubeflow-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}
    • {POLICY_UPDATE_NAME} 삭제 업데이트 방법

      • 현재 적용된 Policy를 JSON 형태의 yaml 파일로 저장합니다.
        # 가장 최신 Policy Version
        policy_version_id=$(aws iam get-policy --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} | jq -r '.Policy' | jq -r '.DefaultVersionId')

        # Policy JSON 파일(yaml)로 저장
        aws iam get-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --version-id ${policy_version_id} | jq -r '.PolicyVersion' | jq -r '.Document' > ${POLICY_UPDATE_NAME}.yaml
      • {POLICY_UPDATE_NAME}.yaml의 Resource에 {PROJECT_S3_BUCKET_NAME} 을 아래와 같이 삭제 합니다.
        yq e -i 'del(.Statement[0].Resource[] | select(. == "arn:aws:s3:::"+env(WORKSPACE_S3_BUCKET)))' {POLICY_UPDATE_NAME}.yaml
        yq e -i 'del(.Statement[0].Resource[] | select(. == "arn:aws:s3:::"+env(WORKSPACE_S3_BUCKET)+"/*"))' {POLICY_UPDATE_NAME}.yaml
      • {POLICY_UPDATE_NAME}의 Policy Version을 추가합니다.
        aws iam create-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --set-as-default --policy-document file://${POLICY_UPDATE_NAME}.yaml
        • Policy Version 추가 중 에러 발생 시 아래와 같이 해결합니다.

          Details

          [Expand Policy Version Error] Policy Version 은 최대 5개만 지원하므로, 가장 오래된 Policy Version 을 삭제해야 합니다.

          # Error Message
          An error occurred (LimitExceeded) when calling the CreatePolicyVersion operation: A managed policy can have up to 5 versions. Before you create a new version, you must delete an existing version.

          Policy Version #2 삭제 명령어 예제

          aws iam delete-policy-version --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${POLICY_UPDATE_NAME} --version-id v2
    • AI Conductor Namespace에서 사용하는 Service에 생성된 S3 Bucket 컨트롤 권한을 삭제 합니다.

      export POLICY_UPDATE_NAME=policy-s3-aia-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}
    • {POLICY_UPDATE_NAME} 추가 업데이트 (위 방법과 동일)



  • Kubeflow 사용자 계정 삭제
    • dex 에서 사용자 정보 획득

      kubectl get configmap dex -n auth -o jsonpath='{.data.config\.yaml}' > dex-config.yaml
    • dex 에 사용자 계정 삭제

      • dex-config.yaml : Kubeflow 사용자 계정 정보를 삭제합니다.
      yq e -i 'del(.staticPasswords[] | select(.email == env(PROJECT_KUBEFLOW_USER_NAME)+"@aic.com"))' dex-config.yaml
    • dex 에 사용자 계정 적용

      kubectl create configmap dex --from-file=config.yaml=dex-config.yaml -n auth --dry-run -oyaml | kubectl apply -f -
      kubectl rollout restart deployment dex -n auth

  • Namespace 와 Profile 삭제
    kubectl delete namespace ${PROJECT_KUBEFLOW_NAMESPACE_NAME}