본문 바로가기

EKS/EKS Cluster

EKS Cluster 구축 - 7. Pod에 IAM Role 부여하기

기존에 Pod에 IAM Role을 부여하기 위해서는 Kube2IAM or KIAM을 사용하였습니다.

KIAM은 하나의 노드에서 어슘롤을 가지고 모든 SDK의 응답을 대신해서 처리해주는 방식,

Kube2IAM은 모든 노드가 어슘롤을 가지고 각 파드들의 응답을 처리하는 방식입니다.

 

하지만 이제 EKS 1.14이상부터는 IAM OIDC를 통해 Service Account와 연동되게 구성할 수 있습니다.

이렇게 되면, 각 노드에 어슘롤이 부여 될 필요가 없으며 정말 해당 파드가 EC2에 롤을 부여하듯 롤을 가지게 됩니다.

 

제가 이해한 바로는 아래와 같습니다.

 

틀릴 수도 있으니 참고용으로만 보시기 바랍니다.

제가 이해한 바로는 쿠버네티스 API는 아래와 같은 절차를 거쳐 처리되게 됩니다.

API 서버로 들어오는 모든 요청은 etcd에 저장되는데, 이 전에 auth 거치며,

JWT or 인증서 등을 통해 클라이언트를 인증 후 RBAC 권한과 매칭되는지 검사합니다.

해당 요청이 권한이 있다고 판단되면, Mutate, Validate 과정을 거쳐 etcd에 저장하는 구조입니다.

쿠버네티스 공식 다큐

ServiceAccount는 이러한 Admission Controller에 대한 하나의 플러그인입니다.

또한, KubernetesOpenID Connect (OIDC) 지원하기 때문에,

Service AccountOIDC 매핑하여 인증절차로 사용할 수 있습니다.

다만 이를 WebHook에서 이전에는 Pod Identity WebHook으로 따로 구성하여서 사용하였습니다.

하지만 이제는 AWS에서 IAMOIDC와 연동이 가능하게 제공하고 있습니다.

 

 

 

이제 구축해보도록 하겠습니다.

IAM에 OIDC Provider를 생성한 EKS 클러스터에서 아래와 같이 생성해줍니다.

eksctl utils associate-iam-oidc-provider --cluster {clustername} --approve

 

그러면 콘솔에서 아래와 같이 생성된 것을 확인할 수 있습니다.

 

 

 

만약 eksctl로 클러스터도 구성하셨다면, eksctl 명령어로 아래 작업들을 모두 수행할 수 있습니다.

하지만, eksctl이 서브넷을 AZ당 하나씩만 지원하기 때문에 제약사항이 생각보다 많아서 저는 직접 구축하는 예시를 보여드리겠습니다.

 

이제 이 OIDC를 가지고 IAM Role을 생성해 주시면 됩니다.

 

 

실제 파드에 주고자 하는 정책을 골라서 주시면 됩니다.

 

저는 테스트를 하기 위해, S3 ReadOnly를 주도록 하겠습니다.

 

 

자, 이제 모든 준비가 끝났습니다.

 

Service Account와 Pod를 아래와 같이 생성해주세요

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: iam-test
  annotations:
    eks.amazonaws.com/role-arn:arn:aws:iam::{account_id}:role/iam-test

 

apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: eks-iam-test
 spec:
   replicas: 1
   selector:
     matchLabels:
       app: eks-iam-test
   template:
     metadata:
       labels:
         app: eks-iam-test
     spec:
       serviceAccountName: iam-test
       containers:
       - name: eks-iam-test
         image: sdscello/awscli:latest
         ports:
         - containerPort: 80

 

파드에 접속하여 명령어를 수행하면 아래와 같이 s3에 대해서는 수행되지만, 없는 권한에 대해서는 작동하지 않는 것을 볼 수 있습니다.

 

 

개인적으로는 kube2iam, kiam보다 간편하고 보안성이 좋다고 생각합니다.

 

유용하게 사용하시면 좋겠습니다.

 

참고

https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221546328906&proxyReferer=https:%2F%2Fwww.google.com%2F

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/enable-iam-roles-for-service-accounts.html

https://tech.devsisters.com/posts/pod-iam-role

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html