실습 4탄 = 11/17
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
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`
테스트 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
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
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/
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
https://brunch.co.kr/@topasvga/1886
감사합니다.