1. 기본 환경 배포
이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.
IAM 사용자 생성 및 액세스 키 생성
1.1. Terraform을 통한 기본 인프라 배포
Terraform을 통한 기본 인프라 배포에 앞서 SSH 키 페어, IAM User Access Key ID, IAM User Secret Access Key를 미리 확인하고 메모해 둡니다.
Terraform으로 기본 인프라 배포
cd cnaee_class_tf/ch4
Bash
복사
# 실습 디렉터리 경로 진입
export TF_VAR_KeyName=[각자 ssh keypair]
export TF_VAR_MyIamUserAccessKeyID=[각자 iam 사용자의 access key id]
export TF_VAR_MyIamUserSecretAccessKey=[각자 iam 사용자의 secret access key]
export TF_VAR_SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32
Bash
복사
# Terraform 환경 변수 저장
terraform init
terraform plan
terraform apply -auto-approve
Bash
복사
# Terraform 배포
Terraform을 통한 기본 인프라 배포가 완료되면 관리 콘솔에서 생성된 인프라들을 확인합니다.
Note:
AWS 관리 콘솔에 로그인 할 땐 IAM 사용자 계정으로 진행합니다.
1.2. 기본 정보 확인 및 설정
Terraform 배포가 완료 후 출력되는 Output 정보에서 bastion_1_ip의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-bastion-1)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.
Note:
myeks-bastion-1의 OS 변경으로 SSH 접근에 대한 계정을 ubuntu로 지정합니다.
(ssh -i ~/.ssh/XXXX.pem ubuntu@X.X.X.X)
[Bastion-1] 기본 설정 및 확인
aws eks update-kubeconfig \
--region $AWS_DEFAULT_REGION \
--name $CLUSTER_NAME
Shell
복사
# EKS 클러스터 인증 정보 업데이트
kubens default
Bash
복사
# kubens default 설정
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PublicSubnet1,$PublicSubnet2,$PublicSubnet3
echo $PrivateSubnet1,$PrivateSubnet2,$PrivateSubnet3
Bash
복사
# 변수 호출 종합
eksctl get cluster
Bash
복사
# eksctl을 통한 eks cluster 정보 확인
eksctl get nodegroup \
--cluster $CLUSTER_NAME \
--name ${CLUSTER_NAME}-node-group
Bash
복사
# eksctl을 통한 노드 그룹 정보 확인
kubectl get node -owide
Bash
복사
# kubectl을 통한 노드 정보 확인
IAM_USER=$(aws iam get-user --query 'User.UserName' --output text)
echo "export IAM_USER=$IAM_USER" >> /etc/profile
echo $IAM_USER
Bash
복사
# 각자의 IAM User 이름 변수 선언
Note:
실습에 사용할 IAM User 이름이 가이드에 따르면 admin이겠지만, 다른 이름이라면 해당 이름으로 선언됩니다.
PublicN1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
PublicN2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
PublicN3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo "export PublicN1=$PublicN1" >> /etc/profile
echo "export PublicN2=$PublicN2" >> /etc/profile
echo "export PublicN3=$PublicN3" >> /etc/profile
echo $PublicN1, $PublicN2, $PublicN3
Bash
복사
# 노드 IP 변수 선언
for node in $PublicN1 $PublicN2 $PublicN3; \
do \
ssh -i ~/.ssh/kp_node.pem -o StrictHostKeyChecking=no ec2-user@$node hostname; \
done
Bash
복사
# 노드에 ssh 접근 확인
2. EKS 사용자 인증 & 인가 확인 및 구성
EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.
2.1. EKS 사용자 인증 및 인가 확인
[Bastion-1] krew 도구 설치 및 확인
curl -L https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz -o /root/krew-linux_amd64.tar.gz
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
export PATH="$PATH:/root/.krew/bin"
echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile
Bash
복사
# krew 설치
kubectl krew install access-matrix rbac-tool rolesum whoami rbac-view
kubectl krew list
Bash
복사
# RBAC 관련 도구 설치 및 리스트
kubectl whoami
Bash
복사
# Kubernetes에 현재 인증된 주체의 정보 확인
kubectl access-matrix
Bash
복사
# Kubernetes 클러스터 리소스에 대한 접근 권한을 매트릭스 형태로 시각화
kubectl access-matrix --namespace default
Bash
복사
# Kubernetes 네임스페이스 리소스에 대한 접근 권한을 매트릭스 형태로 시각화
kubectl rbac-tool lookup
Bash
복사
# 모든 Subject에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rbac-tool lookup system:masters
Bash
복사
# system:masters 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -h
Bash
복사
# Subject에 대한 RBAC 정보와 리소스 권한을 시각화 (help)
kubectl rolesum -k User system:kube-proxy
Bash
복사
# 특정 User에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl rolesum -k Group system:masters
Bash
복사
# 특정 Group에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl rolesum aws-node -n kube-system
Bash
복사
# aws-node SA에 대한 RBAC 정보와 연결된 리소스의 권한 확인
echo -e "rbac-view URL http://$(curl -s ipinfo.io/ip):8800"
Bash
복사
# rbac-view 접근 URL 확인
kubectl rbac-view
Bash
복사
# Kubernetes RBAC 권한을 시각화하는 GUI 도구 실행 (2~3분 대기)
Note:
rbac-view를 실행한 후 rbac-view URL로 접근합니다.
[Bastion-1] 사용자 인증/인가 분석 - 클러스터 인증 정보 확인
aws sts get-caller-identity --query Arn
Bash
복사
# sts caller id의 ARN 확인
cat ~/.kube/config | yh
Bash
복사
# kubeconfig 정보 확인
[Bastion-1] 사용자 인증/인가 분석 - STS 임시 자격 증명 토큰
aws eks get-token --cluster-name $CLUSTER_NAME | jq
Bash
복사
# 임시 STS 토큰 확인
aws eks get-token --cluster-name $CLUSTER_NAME --debug | jq
Bash
복사
# 임시 STS 토큰 확인(디버깅)
[Bastion-1] 사용자 인증/인가 분석 - 토큰 리뷰
kubectl api-resources | grep authentication
Bash
복사
# tokenreviews api 리소스 확인
kubectl explain tokenreviews
Bash
복사
# tokenreviews api 리소스 상세 설명
TEMP_TOKEN=$(aws eks get-token --cluster-name $CLUSTER_NAME | jq -r '.status.token'); echo $TEMP_TOKEN
Bash
복사
# 임시 토큰 변수 선언
cat > token-review.yaml << EOF
apiVersion: authentication.k8s.io/v1
kind: TokenReview
metadata:
creationTimestamp: null
spec:
token: ${TEMP_TOKEN}
status: {}
EOF
cat token-review.yaml | yh
Bash
복사
# 토큰 리뷰 파일 생성 및 확인
kubectl create -f token-review.yaml -v=8
Bash
복사
# 토큰 리뷰 생성(디버깅)
[Bastion-1] 사용자 인증/인가 분석 - eks 액세스 인증 검토
aws eks describe-cluster --name $CLUSTER_NAME \
--query 'cluster.accessConfig.authenticationMode' \
--region $AWS_DEFAULT_REGION
Bash
복사
# eks 액세스 인증 모드 확인
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:role/${CLUSTER_NAME}-node-group-eks-node-group | jq
Bash
복사
# node-group role에 대한 access-entry
aws eks list-associated-access-policies \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:role/${CLUSTER_NAME}-node-group-eks-node-group | jq
Bash
복사
# node-group role에 대한 access-policy
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:user/${IAM_USER} | jq
Bash
복사
# 현재 eks 사용자에 대한 access-entry
aws eks list-associated-access-policies \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/${IAM_USER} | jq
Bash
복사
# 현재 eks 사용자에 대한 access-policy
kubectl rbac-tool whoami
Bash
복사
# 현재 eks 사용자에 대한 권한 확인
[Bastion-1] 사용자 인증/인가 분석 - kubernetes RBAC 확인
kubectl rbac-tool lookup system:nodes
Bash
복사
# system:nodes 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -k Group system:nodes
Bash
복사
# system:nodes 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl describe clusterrolebinding eks:node-bootstrapper
Bash
복사
# eks:node-bootstrapper ClusterRoleBinding 확인
kubectl describe clusterrole eks:node-bootstrapper
Bash
복사
# eks:node-bootstrapper ClusterRole 확인
kubectl rbac-tool lookup system:authenticated
Bash
복사
# system:authenticated 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -k Group system:authenticated
Bash
복사
# system:authenticated 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl describe clusterrolebinding system:basic-user
Bash
복사
# system:basic-user ClusterRoleBinding 확인
kubectl describe clusterrole system:basic-user
Bash
복사
# system:basic-user ClusterRole 확인
kubectl describe ClusterRole system:discovery
Bash
복사
# system:discovery ClusterRole 확인
kubectl describe ClusterRole system:public-info-viewer
Bash
복사
# system:public-info-viewer ClusterRole 확인
kubectl describe ClusterRole cluster-admin
Bash
복사
# system:public-info-viewer ClusterRole 확인
2.2. 신규 EKS 사용자의 인증 및 인가 구성 (ConfigMap 방식)
myeks-bastion-2에 신규 EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.
이번에 액세스 인증 모드는 ConfigMap을 활용한 이전 방식으로 테스트합니다.
[Bastion-1] IAM 사용자 생성 및 설정
aws iam create-user --user-name testuser
Shell
복사
# testuser IAM 사용자 생성
aws iam create-access-key --user-name testuser
Bash
복사
# testuser에 프로그래밍 방식 액세스 권한 부여
aws iam attach-user-policy \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess \
--user-name testuser
Bash
복사
# testuser에 AdministratorAccess 정책을 추가
Warning:
신규 IAM 사용자인 testuser에 대한 AccessKeyID와 SecretAccessKey 값을 메모해두고 아래 실습 환경 구성 시에 활용합니다. 실습이 종료되면 해당 IAM 사용자는 반드시 삭제해 주세요. (마지막 실습 자원 삭제에 명시)
[Bastion-2] krew 도구 설치 및 확인
curl -L https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz -o /root/krew-linux_amd64.tar.gz
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
export PATH="$PATH:/root/.krew/bin"
echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile
Bash
복사
# krew 설치
kubectl krew install access-matrix rbac-tool rolesum whoami rbac-view
Bash
복사
# RBAC 관련 도구 설치
[Bastion-2] IAM 사용자 자격 증명 설정
aws sts get-caller-identity --query Arn
Bash
복사
# get-caller-identity 확인
aws configure
Bash
복사
# testuser 자격증명 설정
Note:
위에서 생성한 testuser에 대한 AccessKeyID와 SecretAccessKey 값을 입력합니다.
aws sts get-caller-identity --query Arn
Bash
복사
# get-caller-identity 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
ls ~/.kube
Bash
복사
# .kube 디렉터리 확인
aws eks update-kubeconfig \
--name $CLUSTER_NAME \
--user-alias testuser
Bash
복사
# testuser의 EKS 클러스터 인증 정보 업데이트
cat ~/.kube/config | yh
Bash
복사
# kubeconfig 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
[Bastion-1] aws-auth ConfigMap 작성
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
eksctl create iamidentitymapping \
--cluster $CLUSTER_NAME \
--username testuser \
--group system:masters \
--arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# aws-auth에 testuser와 system:master 그룹 매핑
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
kubectl rolesum -k Group system:masters
Bash
복사
# system:masters 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
[Bastion-2] IAM 사용자의 kubectl 동작 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces
kubectl auth can-i create ns --all-namespaces
kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
kubectl rbac-tool whoami
Bash
복사
# 현재 eks testuser 사용자에 대한 권한 확인
[Bastion-1] iamidentitymapping 삭제
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
eksctl delete iamidentitymapping \
--cluster $CLUSTER_NAME \
--arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# aws-auth에 testuser와 system:master 그룹 매핑 삭제
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
[Bastion-2] kubectl 명령 수행 및 kubeconfig 삭제
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces
kubectl auth can-i create ns --all-namespaces
kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
rm ~/.kube/config
Bash
복사
# kubeconfig 삭제
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
2.3. 신규 EKS 사용자의 인증 및 인가 구성 (EKS API 방식)
myeks-bastion-2에 신규 EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.
이번 액세스 인증 모드는 access-entry에 access-policy를 연결하는 신규 방식으로 테스트합니다.
[Bastion-1] access-entries와 access-policies 확인
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks list-access-policies --output table
Bash
복사
# eks access-policies 리스트 확인
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:user/${IAM_USER} | jq
Bash
복사
# admin 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/${IAM_USER} | jq
Bash
복사
# admin 사용자에 대한 access-policy 확인
[Bastion-1] testuser의 access-entry와 access-policy 설정
aws eks create-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# testuser 사용자의 access entry 생성
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks associate-access-policy \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \
--policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminViewPolicy \
--access-scope type=cluster
Bash
복사
# testuser 사용자의 access-policy 연결
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-policy 확인
[Bastion-2] IAM 사용자의 kubeconfig 업데이트 및 권한 확인
aws eks update-kubeconfig \
--name $CLUSTER_NAME \
--user-alias testuser
Bash
복사
# testuser의 EKS 클러스터 인증 정보 업데이트
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl create ns testns -v=6
Bash
복사
# kubectl create ns 명령어 시도
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces
kubectl auth can-i create ns --all-namespaces
kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
이번에는 access-entry에 대한 연결을 kubernetes-group으로 연결하여 커스터마이징 합니다.
[Bastion-1] kubernetes group 생성
cat <<EoF> pod-viewer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-viewer-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch"]
EoF
kubectl apply -f pod-viewer-role.yaml
Bash
복사
# pod-viewer-role ClusterRole 생성
cat <<EoF> pod-admin-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-admin-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["*"]
EoF
kubectl apply -f pod-admin-role.yaml
Bash
복사
# pod-admin-role ClusterRole 생성
kubectl create clusterrolebinding pod-viewer-role-binding \
--clusterrole=pod-viewer-role \
--group=pod-viewer
Bash
복사
# pod-viewer-role-binding ClusterRoleBinding 생성(pod-viewer group)
kubectl create clusterrolebinding pod-admin-role-binding \
--clusterrole=pod-admin-role \
--group=pod-admin
Bash
복사
# pod-admin-role-binding ClusterRoleBinding 생성(pod-admin group)
kubectl rolesum -k Group pod-viewer
kubectl rolesum -k Group pod-admin
Bash
복사
# pod-viewer와 pod-admin group에 대한 RBAC 정보와 연결된 리소스의 권한 확인
[Bastion-1] acccess-entry 생성(pod-viewer group 연결)
aws eks delete-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# testuser 사용자의 기존 access-entry 삭제
aws eks create-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \
--kubernetes-group pod-viewer
Bash
복사
# testuser 사용자의 신규 access-entry 생성(pod-viewer group 연결)
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-policy 확인
[Bastion-2] kubectl 권한 확인
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces
kubectl auth can-i create ns --all-namespaces
kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
[Bastion-1] acccess-entry 업데이트(pod-admin group 연결)
aws eks update-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \
--kubernetes-group pod-admin
Bash
복사
# testuser 사용자의 access-entry 업데이트(pod-admin group 연결)
aws eks describe-access-entry \
--cluster-name $CLUSTER_NAME \
--principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
[Bastion-2] kubectl 권한 확인
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces
kubectl auth can-i create ns --all-namespaces
kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
3. EKS IRSA & Pod Identity 구성
EKS 클러스터 내에 파드가 AWS 자원을 사용하기 위한 권한을 정의하는 방식을 실습합니다.
3.1. EKS Instance Profile 확인
[Bastion-1] Instance Profile IAM 확인
aws iam list-attached-role-policies \
--role-name ${CLUSTER_NAME}-node-group-eks-node-group \
--output table
Bash
복사
# 노드의 Instance Profile에 정의된 IAM Policy 확인
aws iam get-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy | jq
Bash
복사
# IAM Role에 정의된 IAM Policy 확인(AmazonEKS_CNI_Policy)
aws iam get-policy-version \
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
--version-id v5 | jq
Bash
복사
# AmazonEKS_CNI_Policy 정보 확인
Note:
Instance Profile을 정의하면 노드에 구성된 모든 파드에 반영됩니다.
이는 최소 권한 부여 원칙에 위배되어 권고하지 않습니다.
[Bastion-1] Instance Profile 테스트용 파드 2대 생성 및 확인
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-red
labels:
app: same-node
spec:
containers:
- name: red-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-blue
labels:
app: same-node
spec:
containers:
- name: blue-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl exec -it eks-iam-red \
-- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \
-- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
[Bastion-1] Instance Profile IAM Policy 추가
aws iam attach-role-policy \
--role-name ${CLUSTER_NAME}-node-group-eks-node-group \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
Bash
복사
# IAM Role에 IAM Policy 추가(s3 readonly)
aws iam list-attached-role-policies \
--role-name ${CLUSTER_NAME}-node-group-eks-node-group \
--output table
Bash
복사
# 노드의 Instance Profile에 정의된 IAM Role
kubectl exec -it eks-iam-red \
-- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \
-- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
[Bastion-1] 자원 삭제
aws iam detach-role-policy \
--role-name ${CLUSTER_NAME}-node-group-eks-node-group \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
Bash
복사
# IAM Role에 IAM Policy 해제(s3 readonly)
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
3.2. EKS IRSA 확인
[Bastion-1] ServiceAccount 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl get sa -n kube-system
Bash
복사
# kube-system 네임스페이스의 ServiceAccount 확인
kubectl describe sa default
Bash
복사
# default ServiceAccount 정보 확인
[Bastion-1] IRSA 테스트용 파드 2대 생성 및 확인 - 1
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-red
labels:
app: same-node
spec:
containers:
- name: red-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
automountServiceAccountToken: false
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-blue
labels:
app: same-node
spec:
containers:
- name: blue-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-red -o yaml | yh
Bash
복사
# red 파드 설정 정보 확인
kubectl get pod eks-iam-blue -o yaml | yh
Bash
복사
# blue 파드 설정 정보 확인
kubectl exec -it eks-iam-red \
-- ls /var/run/secrets/kubernetes.io/serviceaccount
kubectl exec -it eks-iam-red \
-- cat /var/run/secrets/kubernetes.io/serviceaccount/token ;echo
Bash
복사
# red 파드 토큰 정보 확인
kubectl exec -it eks-iam-blue \
-- ls /var/run/secrets/kubernetes.io/serviceaccount
kubectl exec -it eks-iam-blue \
-- cat /var/run/secrets/kubernetes.io/serviceaccount/token ;echo
Bash
복사
# blue 파드 토큰 정보 확인
BLUE_SA_TOKEN=$(kubectl exec -it eks-iam-blue -- cat /var/run/secrets/kubernetes.io/serviceaccount/token); echo $BLUE_SA_TOKEN
Bash
복사
# blue 파드의 ServiceAccount 토큰 확인
echo $BLUE_SA_TOKEN | cut -d '.' -f2 | base64 -d | jq .
Bash
복사
# BLUE_SA_TOKEN jwt decode
aws eks describe-cluster --name $CLUSTER_NAME \
--query "cluster.identity.oidc.issuer" \
--output text
Bash
복사
# eks 클러스터 OIDC 공급자 URL 확인
kubectl exec -it eks-iam-red \
-- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \
-- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
[Bastion-1] IRSA 생성
eksctl create iamserviceaccount \
--name red-sa \
--namespace default \
--cluster $CLUSTER_NAME \
--approve \
--attach-policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn' --output text)
Bash
복사
# eksctl을 통한 IRSA 생성 (S3 ReadOnly)
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 IRSA 확인
Note:
eksctl을 통해 IRSA를 생성하면 CloudFormation 스택에 의해 자원이 생성됩니다.
ROLE_NAME=$(eksctl get iamserviceaccount --cluster $CLUSTER_NAME | awk 'NR>1 {print $3}' | awk -F'/' '{print $2}'); echo $ROLE_NAME
Bash
복사
# 생성된 IAM Role 이름을 변수 선언
aws iam get-role --role-name $ROLE_NAME | jq
Bash
복사
# 생성된 IAM Role의 신뢰 관계 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl describe sa red-sa
Bash
복사
# red-sa ServiceAccount 정보 확인
[Bastion-1] IRSA 테스트용 파드 2대 생성 및 확인 - 2
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-red
labels:
app: same-node
spec:
serviceAccountName: red-sa
containers:
- name: red-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-blue
labels:
app: same-node
spec:
containers:
- name: blue-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-red -o yaml | yh
Bash
복사
# red 파드 설정 정보 확인
kubectl exec -it eks-iam-red \
-- ls /var/run/secrets/eks.amazonaws.com/serviceaccount
kubectl exec -it eks-iam-red \
-- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token ;echo
Bash
복사
# red 파드 토큰 정보 확인
RED_SA_TOKEN=$(kubectl exec -it eks-iam-red -- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token); echo $RED_SA_TOKEN
Bash
복사
# red 파드의 ServiceAccount 토큰 확인
echo $RED_SA_TOKEN | cut -d '.' -f2 | base64 -d | jq .
Bash
복사
# RED_SA_TOKEN jwt decode
kubectl exec -it eks-iam-red \
-- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \
-- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-red \
-- aws ec2 describe-instances --region ap-northeast-2
Bash
복사
# red 파드에서 ec2 조회
kubectl exec -it eks-iam-red \
-- aws ec2 describe-vpcs --region ap-northeast-2
Bash
복사
# red 파드에서 vpc 조회
[Bastion-1] 자원 삭제
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
3.3. EKS Pod Identity 확인
[Bastion-1] pod identity agent 설치 확인
aws eks describe-addon-versions \
--addon-name eks-pod-identity-agent \
--kubernetes-version 1.30 \
--query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
--output text
Bash
복사
# Kubernetes 버전에 pod identity addon 버전 확인
eksctl get addon --cluster $CLUSTER_NAME
Bash
복사
# eks 클러스터 addon 확인
kubectl get ds eks-pod-identity-agent -n kube-system
Bash
복사
# eks-pod-identity-agent 데몬셋 확인
kubectl get ds eks-pod-identity-agent -n kube-system -o yaml | yh
Bash
복사
# eks-pod-identity-agent 데몬셋 상세 정보
kubectl get pod -l app.kubernetes.io/name=eks-pod-identity-agent -n kube-system -owide
Bash
복사
# eks-pod-identity-agent 파드 확인
for node in $PublicN1 $PublicN2 $PublicN3; \
do \
ssh -i ~/.ssh/kp_node.pem ec2-user@$node sudo ss -tnlp | grep eks-pod-identit; \
echo "-----"; \
done
Bash
복사
# eks-pod-identity-agent 파드에 오픈된 포트 정보
aws iam get-policy-version \
--policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
--version-id v3 | jq
Bash
복사
# Instance Profile의 IAM Role - AmazonEKSWorkerNodePolicy 확인
[Bastion-1] pod identity association 생성 및 확인
eksctl create podidentityassociation \
--cluster $CLUSTER_NAME \
--namespace default \
--service-account-name blue-sa \
--role-name ec2-eks-pod-identity-role \
--permission-policy-arns arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess \
--region $AWS_DEFAULT_REGION
Bash
복사
# eksctl을 통한 pod-identity-association 생성(EC2 ReadOnly)
eksctl get podidentityassociation --cluster $CLUSTER_NAME
Bash
복사
# pod-identity-association 확인
aws iam get-role --role-name ec2-eks-pod-identity-role | jq
Bash
복사
# 생성된 IAM Role의 신뢰 관계 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl create sa blue-sa
kubectl get sa
Bash
복사
# blue-sa ServiceAccount 생성 후 확인
kubectl describe sa red-sa
Bash
복사
# red-sa ServiceAccount 정보 확인
kubectl describe sa blue-sa
Bash
복사
# blue-sa ServiceAccount 정보 확인
[Bastion-1] Pod Identity 테스트용 파드 2대 생성 및 확인
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-red
labels:
app: same-node
spec:
serviceAccountName: red-sa
containers:
- name: red-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-blue
labels:
app: same-node
spec:
serviceAccountName: blue-sa
containers:
- name: blue-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: same-node
topologyKey: "kubernetes.io/hostname"
restartPolicy: Never
terminationGracePeriodSeconds: 0
EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-blue -o yaml | yh
Bash
복사
# blue 파드 설정 정보 확인
kubectl get mutatingwebhookconfigurations pod-identity-webhook -o yaml | yh
Bash
복사
# Pod-Identity Mutating Webhook으로 Env와 Volume 추가
kubectl exec -it eks-iam-blue \
-- env | grep AWS
Bash
복사
# blue 파드에서 env 정보 확인
kubectl exec -it eks-iam-blue \
-- ls /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/
kubectl exec -it eks-iam-blue \
-- cat /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token; echo
Bash
복사
# blue 파드 토큰 정보 확인
kubectl exec -it eks-iam-red \
-- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \
-- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-red \
-- aws ec2 describe-instances --region ap-northeast-2 | grep Architecture
Bash
복사
# red 파드에서 ec2 조회
kubectl exec -it eks-iam-blue \
-- aws ec2 describe-instances --region ap-northeast-2 | grep Architecture
Bash
복사
# blue 파드에서 ec2 조회
4. 실습 환경 삭제
4장 Amazon EKS 인증 및 인가 실습 환경 삭제와 Terraform 삭제 작업 모두를 진행합니다.
4.1. 실습 자원 삭제
[Bastion-1] 실습 애플리케이션 삭제
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
[Bastion-1] IRSA와 Pod Identity Association 삭제
eksctl delete iamserviceaccount \
--name red-sa \
--namespace default \
--cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 IRSA 삭제 (S3 ReadOnly)
eksctl delete podidentityassociation \
--service-account-name blue-sa \
--namespace default \
--cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 pod-identity-association 삭제 (EC2 ReadOnly)
[관리 콘솔] IAM 사용자 삭제
•
IAM → 사용자 → testuser 대상 선택 → 삭제 버튼 → testuser 입력
4.2. Terraform 자원 삭제
Terraform 자원 삭제
terraform destroy -auto-approve
Bash
복사
# terraform 자원 삭제
Warning:
Terraform 삭제 동안 터미널을 유지하고 Terraform 삭제가 완료되면 정상적으로 자원 삭제 되었는지 꼭 확인을 합니다.
여기까지 4장의 첫 번째 실습인 Amazon EKS 인증 및 인가 실습을 마칩니다.
수고하셨습니다 :)