이번 글에서는 쿠버네티스의 중요한 보안 개념 중 하나인 ServiceAccount에 대해 알아보겠습니다.
쿠버네티스에는 두 가지 유형의 계정이 있습니다:
예를 들어, 'My Kubernetes Dashboard'라는 간단한 대시보드 애플리케이션이 있다고 가정해봅시다. 이 애플리케이션은 Python으로 작성되었으며, 배포되면 쿠버네티스 API에 요청을 보내 클러스터의 파드 목록을 검색하여 웹 페이지에 표시합니다. 이를 위해 서비스 계정을 사용합니다.
서비스 계정을 생성하려면 kubectl create serviceaccount
명령어를 사용합니다. 예를 들어, dashboard-sa
라는 이름의 서비스 계정을 생성하려면 다음과 같이 입력합니다:
kubectl create serviceaccount dashboard-sa
서비스 계정을 확인하려면 kubectl get serviceaccount
명령어를 사용하여 모든 서비스 계정을 나열할 수 있습니다:
kubectl get serviceaccount
서비스 계정이 생성되면 자동으로 토큰도 생성됩니다. 이 토큰은 시크릿 객체로 저장되며, 이를 확인하려면 kubectl describe secret
명령어를 사용합니다:
kubectl describe secret <secret-name>
토큰을 통해 애플리케이션이 쿠버네티스 API에 인증할 수 있습니다.
외부 애플리케이션이 쿠버네티스 클러스터에 호스팅되어 있을 경우, 서비스 토큰 시크릿을 파드를 호스팅하는 애플리케이션의 볼륨으로 자동 마운트하면 됩니다. 이를 통해 애플리케이션이 쉽게 토큰을 읽을 수 있습니다. 예를 들어, 기본 서비스 계정을 사용하지 않고 새로운 서비스 계정을 사용하고 싶다면, 파드 정의 파일에 serviceAccount
필드를 추가하고 새로운 서비스 계정의 이름을 지정합니다.
쿠버네티스 향상 제안서(KEP) 1205의 일환으로 토큰 요청 API가 도입되었습니다. 이 API는 더 안전하고 확장 가능한 서비스 계정 토큰을 제공하며, 대상이 바인딩되고 시간 제한이 있습니다.
버전 1.24에서는 서비스 계정을 생성할 때 더 이상 자동으로 시크릿 또는 토큰이 생성되지 않습니다. 필요한 경우 kubectl create token
명령어를 사용하여 서비스 계정에 대한 토큰을 생성해야 합니다.
만료되지 않는 토큰을 포함하는 시크릿을 생성하려면 시크릿 객체의 유형을 kubernetes.io/service-account-token
으로 설정하고, 주석에 서비스 계정 이름을 지정합니다. 하지만 보안 상의 이유로 토큰 요청 API를 사용하는 것이 더 권장됩니다.
서비스 어카운트는 쿠버네티스에서 애플리케이션이 클러스터와 상호작용하는 데 필수적인 요소입니다. 이번 글을 통해 서비스 계정을 생성하고 사용하는 방법을 배웠으며, 최신 쿠버네티스 버전에서의 변경 사항도 알아보았습니다.