Kubernetes 서비스 계정 - Amazon EKS

Kubernetes 서비스 계정

Kubernetes 서비스 계정은 Pod에서 실행되는 프로세스의 ID를 제공합니다. 자세한 내용을 알아보려면 Kubernetes 설명서의 서비스 계정 관리를 참조하세요. Pod에 AWS 서비스에 대한 액세스 권한이 필요한 경우 서비스 계정을 AWS Identity and Access Management ID에 매핑하여 해당 액세스 권한을 부여할 수 있습니다. 자세한 내용은 서비스 계정에 대한 IAM 역할 섹션을 참조하세요.

서비스 계정 토큰

BoundServiceAccountTokenVolume 기능은 기본적으로 Kubernetes 버전 1.21 이상에서 사용 설정됩니다. 이 기능은 Kubernetes에서 실행되는 워크로드가 대상, 시간 및 키 바인딩인 JSON 웹 토큰을 요청하도록 허용하여 서비스 계정 토큰의 보안을 향상시킵니다. 서비스 계정 토큰에는 1시간 만료 기간이 있습니다. 이전 Kubernetes 버전에는 토큰에 만료 기간이 없었습니다. 즉, 이러한 토큰에 의존하는 클라이언트는 1시간 이내에 토큰을 새로 고쳐야 합니다. 다음 Kubernetes 클라이언트 SDK는 필요한 시간 내에 토큰을 자동으로 새로 고칩니다.

  • Go 버전 0.15.7 이상

  • Python 버전 12.0.0 이상

  • Java 버전 9.0.0 이상

  • JavaScript 버전 0.10.3 이상

  • Ruby master 브랜치

  • Haskell 버전 0.3.0.0

  • C# 버전 7.0.5 이상

워크로드가 이전 클라이언트 버전을 사용하는 경우 업데이트해야 합니다. 클라이언트를 최신 시간 바운드 서비스 계정 토큰으로 원활하게 마이그레이션하도록 사용 설정하려면 Kubernetes 버전 1.21 이상은 기본 1시간 서비스 계정 토큰의 만료 기간을 추가로 연장합니다. Amazon EKS 클러스터의 경우 연장 만료 기간은 90일입니다. Amazon EKS 클러스터 Kubernetes API 서버는 90일이 지난 토큰을 사용한 요청을 거부합니다. 애플리케이션 및 해당 종속성을 확인하여 Kubernetes 클라이언트 SDK가 이전에 나열된 버전과 동일하거나 이후 버전인지 확인하는 것이 좋습니다.

API 서버가 1시간 이상 된 토큰으로 요청을 수신하면 API 감사 로그 이벤트에 annotations.authentication.k8s.io/stale-token으로 주석을 추가합니다. 주석의 값은 다음 예와 유사합니다.

subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.

클러스터에 컨트롤 플레인 로깅이 사용 설정되어 있는 경우 주석은 감사 로그에 있습니다. 다음과 같은 CloudWatch Logs Insights 쿼리를 사용하여 Amazon EKS 클러스터에서 오래된 토큰을 사용하는 모든 Pods를 식별할 수 있습니다.

fields @timestamp | filter @logStream like /kube-apiserver-audit/ | filter @message like /seconds after warning threshold/ | parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime

subject는 Pod가 사용한 서비스 계정을 참조합니다. elapsedtime은 최신 토큰을 읽은 후 경과 시간(초)을 표시합니다. API 서버에 대한 요청은 elapsedtime이 90일(7,776,000 초)을 초과하는 경우 거부됩니다. 이전에 나열된 버전 중 하나를 사용하여 토큰을 자동으로 새로 고치도록 하려면 애플리케이션의 Kubernetes 클라이언트 SDK를 적극적으로 업데이트해야 합니다. 사용된 서비스 계정 토큰이 90일에 가까우며 토큰 만료 전에 클라이언트 SDK 버전을 업데이트할 시간이 충분하지 않은 경우 기존 Pods를 종료하고 새 포드를 생성할 수 있습니다. 이로 인해 서비스 계정 토큰을 다시 가져와서 클라이언트 버전 SDK를 업데이트하는 데 추가로 90일이 제공됩니다.

Pod가 배포의 일부인 경우 고가용성을 유지하면서 Pods를 종료하라고 제안된 방법은 다음 명령으로 롤아웃을 수행하는 것입니다. my-deployment를 배포 이름으로 바꿉니다.

kubectl rollout restart deployment/my-deployment

클러스터 추가 기능

다음 클러스터 추가 기능은 Kubernetes 클라이언트 SDK를 사용하여 서비스 계정 토큰을 자동으로 다시 가져오도록 업데이트되었습니다. 나열된 버전 또는 이후 버전이 1.21 이상의 클러스터에 설치되었는지 확인하는 것이 좋습니다.