eksctl로 EKS 애드온을 생성하려면 먼저 OIDC를 알아야 합니다. IAM OIDC provider 생성없이 eksctl 명령어를 사용하면 아래와 같은 에러가 발생하기 때문입니다.
no IAM OIDC provider associated with cluster, try 'eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=<EKS_CLUSTER_NAME>'
Error: unable to create iamserviceaccount(s) without IAM OIDC provider enabled
OIDC란 'OpenID Connect'의 약자로 OAuth 2.0을 기반으로 하는 인증 프로토콜입니다. Authorization Server에서 수행한 인증을 기반으로 사용자의 신원을 확인합니다.
Kubernetes Service Account에 IAM Role을 부여하기 위해서는 IAM OIDC Provider가 활성화되어 있어야 합니다. 여기서 말하는 '활성화'는 EKS 클러스터와 IAM OIDC Provider의 association을 의미합니다.
IAM OIDC Provider는 기본적으로 활성화되어 있지 않기 때문에 (default: not enabled) 하기 명령어를 이용하여 클러스터에 IAM OIDC provider를 associate 합니다. (OIDC 생성)
$ eksctl utils associate-iam-oidc-provider --cluster=<EKS_CLUSTER_NAME> --approve
위 명령어로 생성되는 Provider 명은 oidc.eks.ap-northeast-2.amazonaws.com/id/<EKS_ENDPOINT_일부>
이며 생성된 IAM OIDC provider는 IAM 콘솔의 Identity providers 항목에서 확인할 수 있습니다.
위와 같이 IAM OIDC provider가 생성된 것을 확인했다면 이제 eksctl로 애드온을 생성해 보겠습니다.
제가 이번에 생성해 볼 애드온은 'Amazon EBS CSI Driver' 입니다. EKS 클러스터가 persistent volume을 위한 Amazon EBS의 lifecycle을 관리할 수 있도록 하기위한 드라이버입니다.
eksctl로 Service Account를 생성하여 생성한 Service Account에 IAM Role을 부여해 보겠습니다. eksctl 사용 방법은 https://eksctl.io/usage/iamserviceaccounts/ 를 참고하였습니다.
$ eksctl create iamserviceaccount \
--region ap-northeast-2 \
--namespace kube-system \
--cluster <EKS_CLUSTER_NAME> \
--name ebs-csi-controller-sa \ # 생성될 Service Account Name 입력
--role-name <IAM_ROLE_NAME> \ # Service Account에 부여할 IAM Role이 생성됨
--attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ # 위 IAM Role에 attach 할 IAM Policy의 ARN 입력
--approve \
--role-only
attach한 IAM Policy가 붙은 IAM Role은 IAM 콘솔에서 확인 가능하며, Service Account도 아래와 같이 생성된 것을 확인하였습니다.
$ kubectl get serviceaccount -A | grep ebs
kube-system ebs-csi-controller-sa 0 45h
kube-system ebs-csi-node-sa 0 45h
Service Account에 'AmazonEBSCSIDriverPolicy' 권한을 가진 IAM Role을 부여해 두었으니 이제 이 IAM Role을 이용하여 'Amazon EBS CSI Driver' 애드온을 생성해 보겠습니다.
$ eksctl create addon \
--name aws-ebs-csi-driver \
--cluster <EKS_CLUSTER_NAME> \
--service-account-role-arn <위에서_생성된_IAM_ROLE_ARN> \
--force
생성된 애드온은 아래와 같이 확인이 가능합니다.
$ eksctl get addon --name aws-ebs-csi-driver --cluster <EKS_CLUSTER_NAME>
생성 결과는 EKS 콘솔에서도 확인 가능하며 생성된 드라이버의 IAM Role에는 Service Account에 부여했던 IAM Role이 적용되어 있는 것을 확인할 수 있습니다.
개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.