Amazon EKS의 교차 계정 IAM roles에 대하여, IAM 역할 변경 후 kubeflow 설치 과정

노하람·2021년 10월 13일
0
post-thumbnail

사전 배경

  1. 타 팀에서 aws EKS 클러스터를 구성해 놓았고, 우리 팀에 environment-predict 컨텍스트를 이용하면 된다고 알려주었다.
  2. 컨텍스트와 프로파일 등의 지식이 없던 상황에서 무작정 EKS 접속해서 kubeflow를 구축하려다보니 IAM 역할 오류가 발생했다.
  3. IAM 역할 변경을 하지 않고, kubeflow를 설치하려다 실패한 뒤, 삭제하려고 하니 잔여 파일들이 삭제되지 않는 문제가 발생했다.
  4. 디폴트 arn role을 변경 후 정상적으로 kubeflow를 설치하려고 하니, 이미 잘못 설치되어있던 kubeflow 때문에 오류가 발생했고, 삭제되지도 않는다. (삭제 문제 관련 깃 이슈)

기존에 kubeflow를 잘못 설치한 경우

kubeflow 관련 namespace를 삭제했지만 Terminating 상태에 빠진 경우

  1. Terminating 상태에 빠진 NS(namespaces)을 확인합니다.

    • kubectl get namespace
  2. 여러 방법을 시도해봤지만, 아래 코드가 제일 리소스들을 확실하게 지워주는 방법인 것 같습니다.

    • 보통 해당 ns 관련된 모든 리소스를 삭제하고 삭제를 진행하면 정상적으로 삭제됩니다.
    • 먼저 네임스페이스를 모두 삭제하고, Terminating 상태에 빠진 것을 확인하면 아래의 두번째 코드블럭을 이용해 관련 리소스를 모두 지워주신다고 생각해주시면 되겠습니다.
    • "stucked-namespace" 부분을 삭제하고자 하는 ns 이름을 넣고 실행하시면 됩니다.
      $ kubectl get namespace "stucked-namespace" -o json \
        | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
        | kubectl replace --raw /api/v1/namespaces/"stucked-namespace"/finalize -f -
    • kubeflow 관련 리소를 삭제합니다! 주석의 내용도 필히 확인하면서 진행하시기 바랍니다.
    $ kfctl delete -f kfctl_istio-blah.yaml
    # 실행하면 namespace가 finalizer 때문에 Terminating 상태로 멈추어 있습니다.
    # 그래서 아래와 같이 finalizer를 해제 해주어야 합니다.
    
    $ kubectl proxy &
    $ NAMESPACE=kubeflow
    $ kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
    $ curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
    
    # 그리고 그 외의 남아있는 리소스들을 처리해주어야 하는데요. 아래와 같이 순서대로 정리해 줍니다.
    # 진행하다보면 순서에 따라서 finalizer로 보호되어 있는 리소스들이 발생합니다. 
    # 그럴 경우 해당 리소스를 edit하여 finalizer의 값을 []로 바꾸어준 후 다시 실행시키면 됩니다 :>
    
    $ kubectl delete clusterroles        katib-controller katib-ui ml-pipeline-persistenceagent ml-pipeline-viewer-controller-role pipeline-runner
    $ kubectl delete clusterrolebindings katib-controller katib-ui ml-pipeline-persistenceagent ml-pipeline-scheduledworkflow ml-pipeline-viewer-crd-role-binding pipeline-runner
    $ kubectl delete admission-webhook-mutating-webhook-configuration experiment-mutating-webhook-config istio-sidecar-injector mutating-webhook-configuration
    
    $ for labels in app.kubernetes.io/part-of=kubeflow kustomize.component; do
      kubectl api-resources --verbs=list -o name  | grep -v '^componentstatuses$' \
        | xargs -n 1 kubectl delete --all-namespaces --ignore-not-found -l app.kubernetes.io/part-of=kubeflow
    done
    $ kubectl delete crd applications.app.k8s.io
    $ kubectl get configmap -o name -n kube-system | egrep 'cert-manager'|xargs kubectl delete -n kube-system
    
    $ kubectl get mutatingwebhookconfiguration -o name | egrep 'kubeflow|katib'|xargs kubectl delete
    
    # 만약 쿠브플로우를 설치하시면서 istio-system 도 같이 설치하셨다면 'kubeflow|dex|istio'로 변경
    
    $ kubectl get crd -o name| egrep 'kubeflow|dex|istio|certmanager|cert-manager|applications.app.k8s.io'|xargs kubectl delete
    $ kubectl get clusterrole -o name| egrep 'kubeflow|dex|istio'|xargs kubectl delete
    $ kubectl get clusterrolebinding -o name| egrep 'kubeflow|dex|istio'|xargs kubectl delete
  3. Terminating 상태에 빠져있던 NS들이 정상적으로 사라진 것을 확인합니다!

  4. 제대로 삭제되지 않았다면 kubeflow를 설치한 폴더에서 설치파일을 기반으로 다시 삭제 명령을 진행해봅니다.

    • kfctl delete -V -f kfctl_aws.yaml

kubeflow 설치

IAM roles 변경

  1. 이미 aws EKS 클러스터가 구성되어 있고, 권한을 위임받은 IAM(컨텍스트, 프로파일)이 있다는 조건 하에 진행됩니다.

  2. ~/.aws/credentials 를 수정합니다.

    • 루트 사용자이여야 합니다. aws-config에서 이 설정(키 값)을 받아서 사용하기 때문입니다. 그래야 여러 명령 권한을 가지고 정상적으로 운용할 수 있습니다.
    • vim ~/.aws/credentials - 익숙한 편집기를 사용해서 수정해주세요. value값에 루트 사용자의 액세스 키와 시크릿 액세스 키를 입력하면 됩니다.
    [default]
    aws_access_key_id =
    aws_secret_access_key =
  3. ~/.aws/config를 수정합니다.

    • 디폴트는 리전(region)만 사용하시는 리전으로 변경해서 작성하면 되겠습니다. output도 자유롭게 해주세요.
    • profile 부분은 사용할 profile명으로 작성해주시면 됩니다. role_arn은 해당 프로파일의 arn을, source_profile은 ~/.aws/credentials의 default에서 받아옵니다. 마찬가지로 리전과 아웃풋을 수정해주세요.
    [default]
    sts_regional_endpoints=regional
    region = ap-northeast-2
    output = yaml
    
    [profile <사용할 프로파일명>]
    role_arn = <해당 arn>
    source_profile = default
    region = ap-northeast-2
    output = yaml
  4. 컨텍스트를 받아옵니다.(kubeconfig를 업데이트합니다.)

    • 별칭과 프로파일명을 무엇으로 설정했는지 잘 기억해둡시다.
    aws eks update-kubeconfig \
      --name environment-predict \
      --alias env-predict \
      --profile environment-predict
  5. kubectl default context를 설정한 컨텍스트로 변경합니다. 내용을 잘 받아오는지 확인합니다.

    • export AWS_DEFAULT_PROFILE=<설정한 프로파일명>
    • aws sts get-caller-identity
    • 저는 이 과정을 수행하고 나서 context가 user/moey920 -> role/admin으로 변경되었습니다.
  6. 이제 EKS에 kubeflow 설치 과정에서 IAM 권한이 없어 발생하는 이슈는 사라졌을 것입니다. 이제껏 실패했던 kubeflow 설치과정을 다시 천천히 따라가볼까요?

쿠브플로우 설치

  • Amazon EKS의 Kubernetes 버전 1.15+는 Kubeflow 버전 1.2와 호환됩니다.
  1. 일단 namespace에 kubeflow와 관련되어 설치되어 있는 것이 없는지 확인합니다.

EKS Cluster

cluster가 없다면 다음과 같이 설정합니다.

Kubeflow 설치를 진행하기 전에 Amazon EKS에 Kubernetes 클러스터가 필요합니다. 클러스터가 이미 있는 경우 현재 kubectl컨텍스트가 설정 되었는지 확인 하고 다음 단계로 이동합니다.

  1. 아래 단계에 따라 kfctl바이너리 를 다운로드하고 몇 가지 편리한 환경 변수를 설정하십시오.
    • Kubeflow 릴리스 페이지 에서 kfctl v1.2.0 릴리스를 다운로드 하십시오 .
    • wget https://github.com/kubeflow/kfctl/releases/download/v1.2.0/kfctl_v1.2.0-0-gbc038f9_linux.tar.gz
    • tar 볼의 압축을 풀고 현재 작업 디렉토리를 셸 경로에 추가하여 kfctl.

  2. 구성 파일에 대한 환경 변수를 설정합니다.
    • Dex를 사용한 인증에 기본 구성 파일 사용
    • export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.2-branch/kfdef/kfctl_aws.v1.2.0.yaml"
  3. Amazon EKS 클러스터의 이름으로 환경 변수를 설정합니다.
    • EKS 클러스터 이름을 모른다면 AWS 콘솔에서 확인 바랍니다. 생성자가 아니라서 확인할 수 없다면 생성자에게 물어봅시다. 그 후 aws eks describe-cluster --name <클러스터명>으로 제대로 된 클러스터명인지 확인해보세요!
    • export AWS_CLUSTER_NAME=<YOUR EKS CLUSTER NAME>
  4. 마지막으로 클러스터에 대한 배포 디렉터리를 만들고 변경한 다음 kfctl구성 파일을 다운로드 합니다.
    mkdir ${AWS_CLUSTER_NAME} && cd ${AWS_CLUSTER_NAME}
    wget -O kfctl_aws.yaml $CONFIG_URI
  5. IAM OIDC 공급자를 생성합니다.

  1. aws cli를 사용할 때는 --profile을 붙여서 사용한다!!
  2. kubectl은 --context를 붙여서 사용한다!!
profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글