[Kubernetes] AWS EKS 사용법 - EC2로 인스턴스로 구성하기
🚀 AWS EKS (Elastic Kubernetes Service)
AWS EKS는 컨트롤 플레인 및 워커노드를 직접 구성하지 않고 쿠버네티스를 손쉽게 사용할 수 있도록 도와주는 AWS 완전관리형 서비스이다.
AWS에서 제공하는 VPC, ELB, IAM 등 특정 기능을 같이 활용하고자 할 때 유용하다.
EKS는 오픈소스 쿠버네티스의 최신 버전을 실행하므로 쿠버네티스의 모든 plugin
과 tool
을 사용할 수 있다.
AWS에서 EKS를 사용해 클러스터를 구축하는 방법은 크게 2가지가 있다.
eksctl
+ AWS CLI 사용 (명령줄 사용)- AWS 콘솔
🚀 AWS 콘솔에서 클러스터 생성하기
자주 사용하지 않는 방식이다. 일반적으로 EKS를 명령줄로 사용한다.
클러스터의 이름, 버전 (기본 1.21), 생성해놓은 클러스터 서비스 역할을 지정한다.
CNI는 Amazon VPC를 사용한다.
로깅을 구성할 수 있다.
역할을 별도로 만들어줘야 하는 번거로움이 있고 고급 설정은 eksctl에서만 가능하므로 AWS 콘솔에서 작업하는 경우는 많지 않다.
🚀 eksctl 명령줄 사용하기
aws cli
와 eksctl
명령어가 있어야 한다. 설치 방법은 여기를 참고한다.
eksctleksctl
도구는 Amazon이 만든 도구가 아니다.
weaveworks사가 만들었고 이 오픈소스를 Amazon이 자사 정식 설치 방법으로 채택하였다.
aws configure
IAM으로 사용자를 만들고 .csv 파일로 aws configure을 설정한다.
클러스터 구축
PS C:\Users\Shinsohui> eksctl create cluster --name myeks --nodes=3 --region=ap-northeast-2
클러스터명과 워커 노드의 개수 및 가용 영역을 지정하면 간단하게 명령줄로 클러스터를 구축할 수 있다.
참고로 EKS가 워커 노드에 사용하는 기본 EC2 인스턴스 타입은 m5.large
이다.
만약 클러스터명을 지정하지 않으면 랜덤하게 자동 생성된 이름이 부여된다.
리전을 지정하지 않으면 us-west-2
에 생성되며 별도의 전용 VPC가 생성된다.
클러스터가 구축되는 과정을 살펴보자
2022-05-30 23:01:24 [ℹ] using region ap-northeast-2
2022-05-30 23:01:24 [ℹ] setting availability zones to [ap-northeast-2d ap-northeast-2b ap-northeast-2c]
2022-05-30 23:01:24 [ℹ] subnets for ap-northeast-2d - public:192.168.0.0/19 private:192.168.96.0/19
2022-05-30 23:01:24 [ℹ] subnets for ap-northeast-2b - public:192.168.32.0/19 private:192.168.128.0/19
2022-05-30 23:01:24 [ℹ] subnets for ap-northeast-2c - public:192.168.64.0/19 private:192.168.160.0/19
ap-northeast-2
리전을 사용하고 가용영역은 노드를 3개 지정했기 때문에 2b
, 2c
, 2d
를 선택한 것을 볼 수 있다.
각 노드마다 각각 3개의 public
, private
서브넷을 만들고 있다.
2022-05-30 23:01:24 [ℹ] nodegroup "ng-622f259a" will use "" [AmazonLinux2/1.22]
아마존 리눅스 이미지를 이용해 노드 그룹을 생성한다.
2022-05-30 23:01:24 [ℹ] using Kubernetes version 1.22
eksctl에서는 기본 버전이 1.22이다.
2022-05-30 23:01:54 [ℹ] waiting for CloudFormation stack "eksctl-myeks-cluster"
2022-05-30 23:02:25 [ℹ] waiting for CloudFormation stack "eksctl-myeks-cluster"
2022-05-30 23:03:25 [ℹ] waiting for CloudFormation stack "eksctl-myeks-cluster"
eksctl로 클러스터를 생성하면 스택을 만든다.
AWS 콘솔 창으로 가서 확인해보자
CloudFormation(AWS에서 사용하는 IaC 도구)에 보면 스택이 생성중인 것을 볼 수 있다.
CloudFormation은 Json 형식으로 작성한다.
2022-05-30 23:01:24 [ℹ] building cluster stack "eksctl-myeks-cluster"
2022-05-30 23:01:24 [ℹ] deploying stack "eksctl-myeks-cluster"
자동으로 클러스터 스택을 만들며 deploy
한다.
스택이 모두 만들어지면 CloudFormation 콘솔에서 확인할 수 있다. 이후 컨트롤 플레인을 만드는 작업을 진행한다.
🚀 yaml 파일 사용하기
cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: basic-cluster
region: eu-north-1
nodeGroups:
- name: ng-1
instanceType: m5.large
desiredCapacity: 10
- name: ng-2
instanceType: m5.xlarge
desiredCapacity: 2
클러스터를 생성하기 위한 yaml 파일을 작성할 수 있다.
네비게이션바의 Examples를 클릭하면 다양한 예제 파일이 있는 github 레포지토리가 있다.
Introduction에는 간단한 사용법들이 나와있고 Usage에는 상세한 방법이 나와있다.
Config file schema를 클릭하면 yaml 파일을 작성하는 방법이 구체적으로 나와있다. (kubectl explain과 동일한 기능이다.)
컨트롤 플레인 구성과 워커 노드 구성이다.
즉, 하나의 클러스터를 생성하면 기본적으로 2개의 스택이 만들어진다.
EC2 인스턴스 3개가 ap-northeast-2b, ap-northeast-2c, ap-northeast-2d에 각각 생성됐다.
기본 80G로 세팅된 볼륨이 있다.
시작 템플릿이 생성되어 있다.
앞서 보았던 시작 템플릿이 적용되어 만들어진 오토 스케일링 그룹이며 인스턴스가 3개이다. 인스턴스 값을 조정하면 워커 노드를 스케일링 할 수 있다.
필요하면 편집을 통해 워커 노드 개수를 변경할 수 있다.
하나의 VPC가 생성된 것을 볼 수 있다.
총 6개의 서브넷이 만들어지며 public
, private
각각 3개씩 만들어진다.
인터넷 게이트웨이도 생성되었다.
라우팅 테이블 또한 생성되었다.
2022-05-30 23:18:25 [ℹ] kubectl command should work with "C:\\Users\\Shinsohui\\.kube\\config", try 'kubectl get nodes'
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://C2F21659EFE49B16EEC2866604ECE7D9.sk1.ap-northeast-2.eks.amazonaws.com
name: myeks.ap-northeast-2.eksctl.io
myeks.ap-northeast-2.eksctl.io
이름으로된 클러스터가 자동으로 등록되어있다.
users:
- name: eksadmin@myeks.ap-northeast-2.eksctl.io
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- token
- -i
- myeks
command: aws-iam-authenticator
env:
- name: AWS_STS_REGIONAL_ENDPOINTS
value: regional
- name: AWS_DEFAULT_REGION
value: ap-northeast-2
interactiveMode: IfAvailable
provideClusterInfo: false
하단에는 IAM 계정과 연결되어 있는 부분이 보인다.
- context:
cluster: myeks.ap-northeast-2.eksctl.io
user: eksadmin@myeks.ap-northeast-2.eksctl.io
name: eksadmin@myeks.ap-northeast-2.eksctl.io
context
도 만들어져 있다.
PS C:\Users\Shinsohui> kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* eksadmin@myeks.ap-northeast-2.eksctl.io myeks.ap-northeast-2.eksctl.io eksadmin@myeks.ap-northeast-2.eksctl.io
kubernetes-admin@cluster.local cluster.local kubernetes-admin
minikube minikube minikube default
자동으로 eksadmin@myeks.ap-northeast-2.eksctl.io
이 선택되어 있다.
PS C:\Users\Shinsohui> kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-29-128.ap-northeast-2.compute.internal Ready <none> 32m v1.22.6-eks-7d68063
ip-192-168-40-145.ap-northeast-2.compute.internal Ready <none> 32m v1.22.6-eks-7d68063
ip-192-168-70-53.ap-northeast-2.compute.internal Ready <none> 32m v1.22.6-eks-7d68063
세개의 워커 노드가 생성되었다. 컨트롤 플레인은 노출되지 않는다.
PS C:\Users\Shinsohui> kubectl get ns
NAME STATUS AGE
default Active 42m
kube-node-lease Active 42m
kube-public Active 42m
kube-system Active 42m
eksctl로 구성한 클러스터는 반드시 eksctl 명령으로 삭제해야 한다.
eksctl이라는 도구를 빌려 사용했지만 결국 CloudFormation이라는 IaC 도구를 이용한 것이기 때문이다.
따라서 명령줄을 사용해 클러스터를 구축한했다면 콘솔상에서 직접 클러스터를 삭제하면 안된다.
CloudFormation이 배포한 형태와 실제 형태가 달라지게 되어 eksctl이 삭제시 정보를 파악할 수 없게된다.
이제 eksctl을 사용한 클러스터 구축이 완료되었다. 생성된 리소스를 하나씩 살펴보자
PS C:\Users\Shinsohui\aws-eks> kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system aws-node-5zfqm 1/1 Running 0 39m
kube-system aws-node-sswhj 1/1 Running 0 39m
kube-system aws-node-vfntf 1/1 Running 0 39m
kube-system coredns-556f6dffc4-rw9gc 1/1 Running 0 48m
kube-system coredns-556f6dffc4-xsk4l 1/1 Running 0 48m
kube-system kube-proxy-b27dw 1/1 Running 0 39m
kube-system kube-proxy-nnz9z 1/1 Running 0 39m
kube-system kube-proxy-t9tdh 1/1 Running 0 39m
PS C:\Users\Shinsohui\aws-eks> kubectl get po -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system aws-node-5zfqm 1/1 Running 0 40m 192.168.70.53 ip-192-168-70-53.ap-northeast-2.compute.internal <none> <none>
kube-system aws-node-sswhj 1/1 Running 0 40m 192.168.40.145 ip-192-168-40-145.ap-northeast-2.compute.internal <none> <none>
kube-system aws-node-vfntf 1/1 Running 0 40m 192.168.29.128 ip-192-168-29-128.ap-northeast-2.compute.internal <none> <none>
kube-system coredns-556f6dffc4-rw9gc 1/1 Running 0 49m 192.168.38.89 ip-192-168-40-145.ap-northeast-2.compute.internal <none> <none>
kube-system coredns-556f6dffc4-xsk4l 1/1 Running 0 49m 192.168.34.9 ip-192-168-40-145.ap-northeast-2.compute.internal <none> <none>
kube-system kube-proxy-b27dw 1/1 Running 0 40m 192.168.40.145 ip-192-168-40-145.ap-northeast-2.compute.internal <none> <none>
kube-system kube-proxy-nnz9z 1/1 Running 0 40m 192.168.29.128 ip-192-168-29-128.ap-northeast-2.compute.internal <none> <none>
kube-system kube-proxy-t9tdh 1/1 Running 0 40m 192.168.70.53 ip-192-168-70-53.ap-northeast-2.compute.internal <none> <none>
aws-node
와 kube-proxy
파드가 각 노드마다 하나씩 존재하는 것을 볼 수 있다.
aws-node
파드는 AWS EC2 인스턴스와 연결하기 위한 App을 실행하는 파드이다. 따라서 워커 노드의 개수만큼 존재한다.
apiserver
, scheduler
, etcd
를 볼 수 없는 이유는 EKS가 컨트롤 플레인을 관리해주어 접근할 수 없기 때문이다.
nginx
이미지를 사용해 3개의 파드를 배포해보자
PS C:\Users\Shinsohui\aws-eks> kubectl create deploy myapp --image nginx --replicas 3
deployment.apps/myapp created
PS C:\Users\Shinsohui\aws-eks> kubectl get deploy,rs,po
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 3/3 3 3 18s
NAME DESIRED CURRENT READY AGE
replicaset.apps/myapp-6d8d776547 3 3 3 18s
NAME READY STATUS RESTARTS AGE
pod/myapp-6d8d776547-4c6pz 1/1 Running 0 18s
pod/myapp-6d8d776547-fkjrd 1/1 Running 0 18s
pod/myapp-6d8d776547-n6c77 1/1 Running 0 18s
PS C:\Users\Shinsohui\aws-eks> kubectl expose deploy myapp --name mysvc --port 80 --target-port 80 --type NodePort
service/mysvc exposed
PS C:\Users\Shinsohui\aws-eks> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 53m
mysvc NodePort 10.100.20.104 <none> 80:30027/TCP 7s
PS C:\Users\Shinsohui\aws-eks> kubectl get svc,ep
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 53m
service/mysvc NodePort 10.100.20.104 <none> 80:30027/TCP 12s
NAME ENDPOINTS AGE
endpoints/kubernetes 192.168.159.108:443,192.168.161.176:443 53m
endpoints/mysvc 192.168.55.23:80,192.168.7.56:80,192.168.80.240:80 12s
PS C:\Users\Shinsohui\aws-eks> kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-29-128.ap-northeast-2.compute.internal Ready <none> 44m v1.22.6-eks-7d68063 192.168.29.128 3.37.30.52 Amazon Linux 2 5.4.190-107.353.amzn2.x86_64 docker://20.10.13
ip-192-168-40-145.ap-northeast-2.compute.internal Ready <none> 44m v1.22.6-eks-7d68063 192.168.40.145 15.164.179.36 Amazon Linux 2 5.4.190-107.353.amzn2.x86_64 docker://20.10.13
ip-192-168-70-53.ap-northeast-2.compute.internal Ready <none> 44m v1.22.6-eks-7d68063 192.168.70.53 13.209.96.138 Amazon Linux 2 5.4.190-107.353.amzn2.x86_64 docker://20.10.13
minikube나 kubespray에는 없는 EXTERNAL-IP가 존재한다.
노드 정보를 보면 EC2 인스턴스의 퍼블릭 ip가 EXTERNAL-IP 인 것을 알 수 있다.
PS C:\Users\Shinsohui\aws-eks> kubectl get deploy,rs,po,svc,ep
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 3/3 3 3 4m13s
NAME DESIRED CURRENT READY AGE
replicaset.apps/myapp-6d8d776547 3 3 3 4m13s
NAME READY STATUS RESTARTS AGE
pod/myapp-6d8d776547-4c6pz 1/1 Running 0 4m13s
pod/myapp-6d8d776547-fkjrd 1/1 Running 0 4m13s
pod/myapp-6d8d776547-n6c77 1/1 Running 0 4m13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 56m
service/mysvc NodePort 10.100.20.104 <none> 80:30027/TCP 3m14s
NAME ENDPOINTS AGE
endpoints/kubernetes 192.168.159.108:443,192.168.161.176:443 56m
endpoints/mysvc 192.168.55.23:80,192.168.7.56:80,192.168.80.240:80 3m14s
PS C:\Users\Shinsohui> curl 13.209.96.138:30027
접속 전에 보안 그룹을 설정하는 것을 잊지 말자
PS C:\Users\Shinsohui\aws-eks> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 13m
mysvc LoadBalancer 10.100.68.37 a8390bc24ff5545368a0afffc8ab1985-1246874039.ap-northeast-2.elb.amazonaws.com 80:32659/TCP 29s
서비스 타입을 LoadBalancer
로 변경해보자
AWS 콘솔에서 classic
유형의 로드밸런서가 생성된 것을 확인할 수 있다.
PS C:\Users\Shinsohui\aws-eks> curl a8390bc24ff5545368a0afffc8ab1985-1246874039.ap-northeast-2.elb.amazonaws.com
접속 가능하다.
PS C:\Users\Shinsohui\aws-eks> kubectl create -f .\ing.yaml
ingress.networking.k8s.io/myweb-ing created
PS C:\Users\Shinsohui> kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
myweb-ing <none> *.sohui.xyz 80 43s
Ingress
를 만들었지만 주소 할당이 안되며 사용할 수 없다.
우리가 Ingress
를 사용하기 위해서는 nginx ingress controller
라는 것이 있어야 하는 것처럼 AWS에서는 ALB controller
라는 것이 있어야 한다.
addon으로 설치되어 있어야 하는데 현재는 설치하지 않았으므로 작동하지 않는 것이다.
AWS 콘솔 상에서 계속 새로고침을 해도 생성되지 않는다.
PS C:\Users\Shinsohui\aws-eks> kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 27m
gp2라는 이름의 스토리지 클래스가 있다.WaitForFirstConsumer
모드이므로 컨슈머가 있기 전까지 볼륨을 만들지 않는다.
PS C:\Users\Shinsohui\aws-eks> kubectl describe sc gp2
Name: gp2
IsDefaultClass: Yes
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"gp2"},"parameters":{"fsType":"ext4","type":"gp2"},"provisioner":"kubernetes.io/aws-ebs","volumeBindingMode":"WaitForFirstConsumer"}
,storageclass.kubernetes.io/is-default-class=true
Provisioner: kubernetes.io/aws-ebs
Parameters: fsType=ext4,type=gp2
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: WaitForFirstConsumer
Events: <none>
default 스토리지 클래스로 AWS EBS를 사용하는 프로비저너가 있다. 기본 설정된 타입은 gp2
이다.
PS C:\Users\Shinsohui\aws-eks> kubectl get po,pv,pvc
NAME READY STATUS RESTARTS AGE
pod/pod-pvc 1/1 Running 0 19s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-ce41394c-0c55-40bf-844d-0d8752006414 10Gi RWO Delete Bound default/mypvc-dynamic gp2 13s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mypvc-dynamic Bound pvc-ce41394c-0c55-40bf-844d-0d8752006414 10Gi RWO gp2 22s
클라우드에서는 비용 문제로 인해 WaitForFirstConsumer
모드가 기본이다.
AWS 콘솔상에서도 생성된 gp2 타입의 EBS 볼륨을 확인할 수 있다.
리소스를 삭제하면
PS C:\Users\Shinsohui\aws-eks> kubectl top nodes
error: Metrics API not available
metrics server가 없어서 불가하다.
myeks.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: myeks-custom
region: ap-northeast-2
version: "1.22"
# AZ
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"] # 사용할 가용 영역 지정
# IAM OIDC & Service Account # eks와 AWS IAM 계정 연동
iam:
withOIDC: true # eks 입장에서 AWS IAM은 외부 서버
serviceAccounts:
- metadata:
name: aws-load-balancer-controller # addon 추가할 때 필요함
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata:
name: ebs-csi-controller-sa # sa 계정의 이름
namespace: kube-system
wellKnownPolicies: # 해당 기능을 켜면 계정에 해당되는 정책 자동 부여
ebsCSIController: true
- metadata:
name: cluster-autoscaler # sa 계정의 이름
namespace: kube-system
wellKnownPolicies:
autoScaler: true
# Managed Node Groups
managedNodeGroups: # 워커 노드의 그룹
# On-Demand Instance
- name: myeks-ng1
instanceType: t3.medium
minSize: 2
desiredCapacity: 3 # 3개의 Managed Node가 구성된다.
maxSize: 4
privateNetworking: true # private network에 배치하기 위함
ssh: # 접속하기 위한 ssh key
allow: true
publicKeyPath: ./keypair/myeks.pub
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
iam: # 3가지의 정책을 node에도 부여
withAddonPolicies:
autoScaler: true
albIngress: true
cloudWatch: true # 로그를 남기기 위함
ebs: true
# Fargate Profiles # EC2 인스턴스를 사용하지 않는 형태
fargateProfiles:
- name: fg-1
selectors:
- namespace: dev
labels:
env: fargate
# CloudWatch Logging # 컨트롤 플레인이 숨겨져 있어 직접 관리하지 못함
cloudWatch: # 컨트롤 플레인의 구성 요소들은 로그를 수집하지 못함
clusterLogging:
enableTypes: ["*"] # 컨트롤 플레인에서 수집할 수 있는 모든 것을 수집
api
audit
authenticator
controllerManager
scheduler
- EKS Anywhere - 타사 클라우드, on-prem의 쿠버네티스 클러스터를 등록하고 관리한다.
- EKS EC2
- EC2 사용하지 않는 방식 Fargate
PS C:\Users\Shinsohui\aws-eks> eksctl get clusters
NAME REGION EKSCTL CREATED
myeks ap-northeast-2 True
myeks-custom ap-northeast-2 True
eksctl-myeks-cluster를 지울 때는 워커 노드가 먼저 지워지고 컨트롤 플레인이 지워진다.
새로운 컨트롤 플레인과 워커 노드 그리고 4개의 sa가 생성되었다.
PS C:\Users\Shinsohui\aws-eks> eksctl get fargateprofile --cluster myeks-custom
NAME SELECTOR_NAMESPACE SELECTOR_LABELS POD_EXECUTION_ROLE_ARN SUBNETS TAGS STATUS
fg-1 dev env=fargate arn:aws:iam::471702632719:role/eksctl-myeks-custom-cluste-FargatePodExecutionRole-19KH5C7ECILHU subnet-04f094d1f018a9863,subnet-0690006170697ddd6,subnet-0e2a044a24a4c5c59 <none> ACTIVE
해당 클러스터에는 fg-1
라는 fargateprofile
이 있다.
PS C:\Users\Shinsohui\aws-eks> eksctl get nodegroup --cluster myeks-custom
CLUSTER NODEGROUP STATUS CREATED MIN SIZE MAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID ASG NAME TYPE
myeks-custom myeks-ng1 ACTIVE 2022-05-31T14:18:59Z 2 4 3 t3.medium AL2_x86_64 eks-myeks-ng1-e6c08d3d-f18d-78cb-5fbf-1f97663fc565 managed
myeks-costom
밑에 myeks-ng1
이라고하는 클러스터가 최소 2개, 최대 4개, 현재 3개 있다.
PS C:\Users\Shinsohui\aws-eks> eksctl get iamserviceaccount --cluster myeks-custom
NAMESPACE NAME ROLE ARN
kube-system aws-load-balancer-controller arn:aws:iam::471702632719:role/eksctl-myeks-custom-addon-iamserviceaccount-Role1-14HU7OMA2KR7D
kube-system aws-node arn:aws:iam::471702632719:role/eksctl-myeks-custom-addon-iamserviceaccount-Role1-WUU61L6CCZUW
kube-system cluster-autoscaler arn:aws:iam::471702632719:role/eksctl-myeks-custom-addon-iamserviceaccount-Role1-WPSNTCTVMI7L
kube-system ebs-csi-controller-sa arn:aws:iam::471702632719:role/eksctl-myeks-custom-addon-iamserviceaccount-Role1-14E4KY8FQBRLH
생성된 4개의 IAM sa를 확인할 수 있다.
PS C:\Users\Shinsohui\aws-eks> kubectl get sa -n kube-system
쿠버네티스에도 sa 계정이 존재하며 AWS IAM에도 계정이 만들어져 권한이 부여된다.