Pod가 Kubernetes 서비스 계정을 사용하도록 구성

Pod가 Kubernetes 서비스 계정을 사용하도록 구성

AWS 서비스에 액세스해야 하는 Pod가 Kubernetes 서비스 계정을 사용하도록 구성하는 방법을 설명합니다.

출처: 문서

본문

Pod가 AWS 서비스에 액세스해야 한다면 Kubernetes 서비스 계정을 사용하도록 구성해야 합니다. 서비스 계정은 AWS 서비스에 액세스할 권한이 있는 AWS Identity and Access Management(IAM) 역할과 연결되어 있어야 합니다.

전제 조건

  • 기존 클러스터. 없다면 "Amazon EKS 시작하기"의 안내 중 하나를 따라 생성할 수 있습니다.
  • 클러스터용 기존 IAM OpenID Connect(OIDC) 공급자. 이미 있는지 확인하거나 생성하는 방법은 "클러스터용 IAM OIDC 공급자 생성"을 참고하세요.
  • IAM 역할과 연결된 기존 Kubernetes 서비스 계정. 서비스 계정에는 IAM 역할의 Amazon Resource Name(ARN)이 주석으로 달려 있어야 합니다. 역할에는 Pod가 AWS 서비스를 사용할 때 갖기를 원하는 권한이 포함된 IAM 정책이 연결되어 있어야 합니다. 서비스 계정과 역할을 만들고 구성하는 방법은 "Kubernetes 서비스 계정에 IAM 역할 할당"을 참고하세요.
  • 사용 기기나 AWS CloudShell에 버전 2.12.3 이상 또는 버전 1.27.160 이상의 AWS Command Line Interface(AWS CLI)가 설치되어 구성되어 있어야 합니다. 현재 버전을 확인하려면 aws --version | cut -d / -f2 | cut -d ' ' -f1을 사용하세요. yum, apt-get, macOS용 Homebrew 같은 패키지 관리자는 AWS CLI 최신 버전보다 몇 버전 뒤처져 있는 경우가 많습니다. 최신 버전 설치 방법은 AWS Command Line Interface 사용 설명서의 "Installing" 및 "aws configure를 사용한 빠른 구성"을 참고하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 몇 버전 뒤처져 있을 수 있습니다. 업데이트 방법은 AWS CloudShell 사용 설명서의 "홈 디렉터리에 AWS CLI 설치"를 참고하세요.
  • 사용 기기나 AWS CloudShell에 kubectl 명령줄 도구가 설치되어 있어야 합니다. 버전은 클러스터의 Kubernetes 버전과 같거나 최대 한 개의 부 버전 앞뒤가 될 수 있습니다. 예를 들어 클러스터 버전이 1.29라면 kubectl 버전 1.28, 1.29, 1.30을 사용할 수 있습니다. kubectl 설치 또는 업그레이드 방법은 "kubectl 및 eksctl 설정"을 참고하세요.
  • 클러스터 구성이 포함된 기존 kubectl config 파일. kubectl config 파일을 만들려면 "kubeconfig 파일을 만들어 kubectl을 EKS 클러스터에 연결"을 참고하세요.

다음 명령으로 배포 매니페스트를 생성해 구성을 확인하기 위한 Pod를 배포할 수 있습니다. 예제 값을 자신의 값으로 바꾸세요.

cat >my-deployment.yaml
  1. 이전 단계의 배포로 배포된 Pod를 확인합니다.
kubectl get pods | grep my-app

예제 출력은 다음과 같습니다.

my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
  1. Pod가 사용하는 IAM 역할의 ARN을 확인합니다.
kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:

예제 출력은 다음과 같습니다.

AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/my-role

역할 ARN은 기존 서비스 계정에 주석으로 단 역할 ARN과 일치해야 합니다. 서비스 계정에 주석을 다는 방법에 대한 자세한 내용은 "Kubernetes 서비스 계정에 IAM 역할 할당"을 참고하세요.

  1. Pod에 웹 ID 토큰 파일 마운트가 있는지 확인합니다.
kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:

예제 출력은 다음과 같습니다.

AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token

kubelet은 Pod를 대신해 토큰을 요청하고 저장합니다. 기본적으로 kubelet은 토큰이 총 수명의 80%보다 오래되었거나 24시간보다 오래되었을 때 토큰을 새로고침합니다. 기본 서비스 계정이 아닌 계정의 만료 기간은 Pod 사양의 설정으로 수정할 수 있습니다. 자세한 내용은 Kubernetes 문서의 "서비스 계정 토큰 볼륨 프로젝션"을 참고하세요.

클러스터의 Amazon EKS Pod Identity Webhook은 다음 주석이 있는 서비스 계정을 사용하는 Pod를 감시합니다.

eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role

웹훅은 해당 Pod에 앞선 환경 변수를 적용합니다. 클러스터는 환경 변수와 토큰 파일 마운트를 구성하기 위해 웹훅을 사용할 필요가 없습니다. Pod에 이러한 환경 변수를 수동으로 구성할 수 있습니다. 지원되는 AWS SDK 버전은 자격 증명 체인 공급자에서 먼저 이러한 환경 변수를 찾습니다. 이 기준을 충족하는 Pod에는 역할 자격 증명이 사용됩니다.

  1. Pod가 역할에 연결된 IAM 정책에서 할당한 권한으로 AWS 서비스와 상호작용할 수 있는지 확인합니다.

참고: Pod가 서비스 계정과 연결된 IAM 역할의 AWS 자격 증명을 사용할 때, 해당 Pod의 컨테이너에 있는 AWS CLI나 다른 SDK는 그 역할이 제공하는 자격 증명을 사용합니다. Amazon EKS 노드 IAM 역할에 제공되는 자격 증명에 대한 액세스를 제한하지 않으면 Pod가 여전히 이 자격 증명에 액세스할 수 있습니다. 자세한 내용은 "워커 노드에 할당된 인스턴스 프로파일 액세스 제한"을 참고하세요.

Pod가 예상대로 서비스와 상호작용할 수 없다면 다음 단계를 완료해 모든 것이 올바르게 구성되었는지 확인하세요.

  • Pod가 OpenID Connect 웹 ID 토큰 파일을 통해 IAM 역할 수임을 지원하는 AWS SDK 버전을 사용하는지 확인합니다. 자세한 내용은 "AWS SDK와 함께 IRSA 사용"을 참고하세요.
  • 배포가 서비스 계정을 사용하는지 확인합니다.
kubectl describe deployment my-app | grep "Service Account"

예제 출력은 다음과 같습니다.

Service Account:  my-service-account
  • 여전히 Pod가 서비스에 액세스할 수 없다면 "Kubernetes 서비스 계정에 IAM 역할 할당"에 설명된 단계를 검토해 역할과 서비스 계정이 올바르게 구성되어 있는지 확인하세요.

더 알아보기 (Learn more)