brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 12. 2021

EKS 4탄-11. EKS IRSA 실습-11/17

실습 4탄 =  11/17

<0> IRSA (IAM role for Service Account ) ?

<1> 실습1 - 서비스 어카운트를 위한 role생성

<2> 실습2 - job(Pod) 생성후 확인

<3> 실습3 - Pod를 생성하고, shell 접근해서, aws s3 조회해 보자~

<4>  다른 IAM 유저에도 마스터 권한 부여 

<5> 리소스 삭제

<6> 다음 보기




<0> IRSA (IAM role for Service Account ) ?


EKS에 있는 Pod가 IAM role을 얻어서 , AWS 리소스를  사용할수 있게 하는것이다.

예) Pod가  role을 얻어 AWS S3를 사용하는것


                                        이미지 출처 https://wrapitup.tistory.com/4


방법

 iam-test 라는 iamserviceaccount 를 만들고 , 정책을 매칭하자.

Pod만들때,  iam-test 라는 serviceaccount를 지정해 사용한다.


eksctl create iamserviceaccount  --name iam-test  --namespace default --cluster $CLUSTER_NAME  --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess  --approve  --override-existing-serviceaccounts




<1> 실습1 - 서비스 어카운트를 위한 role생성


1

EC2 에 role 을 주어 권한을 줄수 있다. 

같은 방법이다.

EKS EC2에 권한을 주면  모든 pod가 사용한다.

따라서 EKS EC2  에 권한을 주지 않고,  Pod 단위로 권한을 주는 방식이다.!!!


EC2(pod가 배포되어 있다)가 role을 얻어 사용하면, 다른 Pod도 권한을 사용할수 있게 된다.

Pod레벨 단위로 AWS 권한을 주자.


AWS에 있는 Pod가 IAM권한을 사용할수 있도록 해주면 된다.

Pod가 S3에 권한을 사용할수 있도록 해보자.


                                        이미지 출처 https://wrapitup.tistory.com/4



eks에서 클러스터 이름 확인

echo $CLUSTER_NAME 



2

정책 확인

aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn'

[

    "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"

]




3

IAM Role(S3Read) 생성과  EKS에 SA 생성과 맵핑

// Now you will create a IAM role bound to a service account with read-only access to S3

//서비스 어카운트도  만들어준다.

AWS 에서는 IAM Role 을 만들고,  EKS에서는  iam-test 라는 서비스 어카운트를 만든다.


eksctl create iamserviceaccount  --name iam-test  --namespace default --cluster $CLUSTER_NAME  --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess  --approve  --override-existing-serviceaccounts

// cloudfomation이 생성됨.



4

IRSA 확인

eksctl get iamserviceaccount --cluster $CLUSTER_NAME

// iam-test 라는 서비스 어카운트가  role에 매칭해 사용함.

NAMESPACE    NAME    ROLE ARN

default    iam-test  arn:aws:iam::4785:role/eksctl-myeks-addon-iamserviceaccount-default-Role1-1MUGIGPXSRKHM



5

// AWS 콘솔에서 role 확인

eksctl-myeks-addon-iamserviceaccount-default-Role1-1MUGIGPXSRKHM

부여된 권한 확인



6

// 부여된 role 확인

aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-addon-iamserviceaccount-default-iam-test --query 'Stacks[*].Outputs[0].OutputValue' --output text

role/eksctl-first-eks-addon-iamserviceaccount-def-Role1-xxxxxxxx


AddIamRoleArn=`aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-addon-iamserviceaccount-default-iam-test --query 'Stacks[*].Outputs[0].OutputValue' --output text`


aws iam get-role --role-name `echo $AddIamRoleArn | cut -d "/" -f 2`





<2> 실습2 - job(Pod) 생성후 확인


테스트 1


1

잡 생성해서 테스트 해보자~

잡을 만들때  서비스 어카운트(iam-test) 매칭해서 테스트하자.


aws-cli 컨테이너로 s3 ls 로 조회하는 테스트

# Let’s start by testing if the service account can list the S3 buckets


cat <<EoF> irsa-job-s3.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: eks-iam-test-s3

spec:

  template:

    metadata:

      labels:

        app: eks-iam-test-s3

    spec:

      serviceAccountName: iam-test

      containers:

      - name: eks-iam-test

        image: amazon/aws-cli:latest

        args: ["s3", "ls"]

      restartPolicy: Never

EoF




2

잡 생성 및 확인

kubectl apply -f irsa-job-s3.yaml && kubectl get pod -w

kubectl get job -l app=eks-iam-test-s3

kubectl logs -l app=eks-iam-test-s3



3

확인 ?

kubectl apply -f irsa-job-s3.yaml && kubectl get pod -w

job.batch/eks-iam-test-s3 created

NAME                    READY   STATUS              RESTARTS   AGE

eks-iam-test-s3-x5xj6   0/1     ContainerCreating   0          1s

eks-iam-test-s3-x5xj6   1/1     Running             0          8s

eks-iam-test-s3-x5xj6   0/1     Completed           0          9s



4

kubectl logs -l app=eks-iam-test-s3

로그를 보자 ~ s3 버킷들 리스트가 나온다.



5

테스트 2 ?

echo $ACCOUNT_ID

AWS_DEFAULT_REGION=ap-northeast-1

echo $AWS_DEFAULT_REGION


테스트를 위해서 S3 버킷을 추가로 생성

aws s3 mb s3://akos-$ACCOUNT_ID --region $AWS_DEFAULT_REGION



6

잡 리소스를 강제 교체, 삭제 후 재생성함. 이것은 서비스를 중단시킴. >> 이후 확인!

kubectl replace --force -f irsa-job-s3.yaml && kubectl get pod -w

kubectl logs -l app=eks-iam-test-s3



7

잡 삭제

kubectl delete jobs eks-iam-test-s3



8

테스트3 ?


잡 생성 : 서비스 어카운트(iam-test) 지정

aws-cli 컨테이너로 ec2 조회하는것을 확인해보자~


# List EC2 Instances

# Now Let’s confirm that the service account cannot list the EC2 instances


cat <<EoF> irsa-job-ec2.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: eks-iam-test-ec2

spec:

  template:

    metadata:

      labels:

        app: eks-iam-test-ec2

    spec:

      serviceAccountName: iam-test

      containers:

      - name: eks-iam-test

        image: amazon/aws-cli:latest

        args: ["ec2", "describe-instances", "--region", "${AWS_DEFAULT_REGION}"]

      restartPolicy: Never

  backoffLimit: 0

EoF



9

확인 >> IAM Role 맵핑 권한이 없어서 실패!

kubectl apply -f irsa-job-ec2.yaml && kubectl get pod -w

kubectl logs -l app=eks-iam-test-ec2


kubectl apply -f irsa-job-ec2.yaml && kubectl get pod -w

job.batch/eks-iam-test-ec2 created

NAME                     READY   STATUS              RESTARTS   AGE

eks-iam-test-ec2-kg4tx   0/1     ContainerCreating   0          1s

eks-iam-test-ec2-kg4tx   1/1     Running             0          4s

eks-iam-test-ec2-kg4tx   0/1     Error               0          5s


에러 내용

kubectl logs -l app=eks-iam-test-ec2

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.



10

(참고) IAM Role 에 EC2Readonly 정책 연결 후 잡 다시 실행 >> 성공!


RoleName=`aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-addon-iamserviceaccount-default-iam-test --query 'Stacks[*].Outputs[0].OutputValue' --output text | cut -d "/" -f 2`

echo $RoleName


aws iam attach-role-policy --role-name $RoleName --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess


kubectl replace --force -f irsa-job-ec2.yaml && kubectl get pod -w


kubectl logs -l app=eks-iam-test-ec2



11

상세 내용

kubectl replace --force -f irsa-job-ec2.yaml && kubectl get pod -w

job.batch "eks-iam-test-ec2" deleted

job.batch/eks-iam-test-ec2 replaced

NAME                     READY   STATUS              RESTARTS   AGE

eks-iam-test-ec2-m5v8x   0/1     ContainerCreating   0          1s

eks-iam-test-ec2-m5v8x   1/1     Running             0          4s

eks-iam-test-ec2-m5v8x   0/1     Completed           0          5s



kubectl logs -l app=eks-iam-test-ec2

EC2 조회 됨


{

    "Reservations": []

}




12

잡 삭제

kubectl delete jobs eks-iam-test-ec2





<3> 실습3 - Pod를 생성하고, shell 접근해서, aws s3 조회해 보자~  (추천)



Pod를 생성하고, shell 접근해서, aws s3 조회


1

파드 파일 생성


cat <<EoF> irsa-awscli.yaml

apiVersion: v1

kind: Pod

metadata:

  name: awscli-pod

  labels:

    app: pod

spec:

  serviceAccountName: iam-test

  containers:

  - name: awscli-pod

    image: amazon/aws-cli

    command: ["tail"]

    args: ["-f", "/dev/null"]

  terminationGracePeriodSeconds: 0

EoF


파드 생성 및 확인

kubectl apply -f irsa-awscli.yaml && kubectl get pod -w



2

파드 Shell 접속 ?

kubectl exec -it awscli-pod -- /bin/bash

bash-4.2#

aws s3 ls

aws ec2 describe-vpcs

exit



3

파드 정보 확인 ?

kubectl describe pod awscli-pod | grep Environment: -A7


 AWS_ROLE_ARN:                 arn:aws:iam::xxxxx:role/eksctl-first-eks-addon-iamserviceaccount-def-Role1-3UFA1QZY5E

// pod에  role이 매칭되어 있다!!!  



4

실습 완료 후 파드 삭제

kubectl delete pod awscli-pod


https://dev.classmethod.jp/articles/cloudwatch-container-insights-eks-irsa/



5

// IAM Role(S3Read) 삭제 및 EKS에 SA 삭제와 맵핑 삭제

aws iam detach-role-policy --role-name $RoleName --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess



6

iam-test 라는 서비스 어카운트 삭제

eksctl delete iamserviceaccount --name iam-test --namespace default --cluster $CLUSTER_NAME --wait



7

버킷 삭제

aws s3 rb s3://akos-$ACCOUNT_ID --region $AWS_DEFAULT_REGION --force






<4>  다른 IAM 유저에도 마스터 권한 부여 



1

kubectl describe configmap aws-auth -n kube-system

kubectl edit configmap aws-auth -n kube-system

------------------------------- 

apiVersion: v1

data:

  mapRoles: |

    - groups:

      - system:bootstrappers

      - system:nodes

      rolearn: arn:aws:iam::{account_id}:role/{workernode-role}

      username: system:node:{{EC2PrivateDNSName}}

  mapUsers: |

    - userarn: arn:aws:iam::{account_id}:user/{user_name1}

      username: user_name1

      groups:

        - system:mastsers

    - userarn: arn:aws:iam::{account_id}:user/{user_name2}

      username: user_name2

      groups:

        - system:masters



2

dev-was / dev-batch 네임스페이스에 대해서만 유저가 컨트롤 하게 하고 싶기 때문에 아래와 같이 

Role을 생성


kind: Role

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dev-was

  namespace: dev-was

rules:

  - apiGroups: ["*"]

    resources: ["*"]

    verbs: ["*"]


---

kind: Role

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dev-batch

  namespace: dev-batch

rules:

  - apiGroups: ["*"]

    resources: ["*"]

    verbs: ["*"]



3

롤 바인딩


kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dev-was-rolebinding

  namespace: dev-was

subjects:

- kind: Group

  name: dev

roleRef:

  kind: Role

  name: dev-was

  apiGroup: rbac.authorization.k8s.io



---  

kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dev-batch-rolebinding

  namespace: dev-batch

subjects:

- kind: Group

  name: dev

roleRef:

  kind: Role

  name: dev-batch

  apiGroup: rbac.authorization.k8s.io



4

aws-auth Configmap에서 추가 했던 것 처럼 아래와 같이 추가



5


apiVersion: v1

data:

  mapRoles: |

    - groups:

      - system:bootstrappers

      - system:nodes

      rolearn: arn:aws:iam::{account_id}:role/{workernode-role}

      username: system:node:{{EC2PrivateDNSName}}

  mapUsers: |

    - userarn: arn:aws:iam::{account_id}:user/{user_name1}

      username: user_name1

      groups:

        - system:mastsers

    - userarn: arn:aws:iam::{account_id}:user/{user_name2}

      username: user_name2

      groups:

        - system:masters

    - userarn: arn:aws:iam::{account_id}:user/{dev_user1}

      username: dev_user1

      groups:

        - dev

    - userarn: arn:aws:iam::{account_id}:user/{dev_user2}

      username: dev_user2

      groups:

        - dev



6

CRD 등 Cluster Role 단위에 있는 롤



7


kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: crd-cluster-role

rules:

- apiGroups: ["apiextensions.k8s.io"]

  resources: ["customresourcedefinitions"]

  verbs: ["*"] 


---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: crd-cluster-role-binding

subjects:

- kind: Group

  name: dev

  apiGroup: rbac.authorization.k8s.io

roleRef:

  kind: ClusterRole

  name: crd-cluster-role

  apiGroup: rbac.authorization.k8s.io


참고

https://ssup2.github.io/theory_analysis/AWS_EKS_Service_Account_IAM_Role/





<5> 리소스 삭제


EC2 > Auto Scaling groups 삭제

eks 삭제

vpc 삭제



1. (`EKS 삭제`) **작업용 EC2** - 

`nohup eksctl delete cluster --name $CLUSTER_NAME 1> /root/delete-eks.log 2>&1 &`


2. '사용자를 위한 인스턴스 2대 추가 배포' CloudFormation 에 스택 삭제


3. `IAM 관련 리소스 삭제` 'AWS → IAM'

    - 사용자 그룹 삭제: dev-group, infra-group

    - 사용자 삭제: dev-aws, infra-aws

    - 역할 삭제: dev-role, infra-role


4. (**EKS삭제 후**) CloudFormation 에 **기본 스택** 삭제 - **aws_cli**) 

aws cloudformation delete-stack --stack-name myeks




<6> 다음 보기


https://brunch.co.kr/@topasvga/1886



감사합니다.


        

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari