Manage Workspace
Topics
자세한 단계
{변수}의 자세한 설명은 Terminology 페이지를 참고하세요
- Workspace 설명
- Workspace는 프로젝트 별로 구분된 논리적 공간이며, 프로젝트에 소속된 사용자만 접근 가능합니다. (admin 은 모든 Workspace 에 접근 가능)
- 사용자는 시스템 사용자(Edge Conductor 용)와 일반 사용자로 구분됩니다.
- Workspace는 Kubeflow의 Namespace와 매칭되며, Namespace에 접근 가능한 User는 1개 입니다.
- Workspace는 프로젝트 별로 구분된 논리적 공간이며, 프로젝트에 소속된 사용자만 접근 가능합니다. (admin 은 모든 Workspace 에 접근 가능)
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
-
- S3 Bucket 생성
- 참고 : Amazon Web Services 설정 가이드|3. S3 Bucket 생성하기
- AWS S3 Console 로 이동합니다.
- 우측 상단에서 Create bucket 클릭
- Step 1 : General configuration
- Bucket name : {PROJECT_S3_BUCKET_NAME}
- Step 2 : Create bucket
- 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
-
- 현재 적용된 Policy를 JSON 형태의 yaml 파일로 저장합니다.
-
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}
- 우측 상단 + New Workspace 클릭
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
-
- 현재 적용된 Policy를 JSON 형태의 yaml 파일로 저장합니다.
-
AI Conductor Namespace에서 사용하는 Service에 생성된 S3 Bucket 컨트롤 권한을 삭제 합니다.
export POLICY_UPDATE_NAME=policy-s3-aia-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}
-
{POLICY_UPDATE_NAME} 추가 업데이트 (위 방법과 동일)
-
- S3 Bucket 삭제
- 참고 : Amazon Web Services 설정 가이드|3. S3 Bucket 생성하기
- AWS S3 Console 로 이동합니다. -{PROJECT_S3_BUCKET_NAME} 의 라디오 버튼 클릭
- 우측 상단의 Delete 클릭
- {PROJECT_S3_BUCKET_NAME} 입력
- Delete bucket 클릭
- 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}