콤퓨우터/필기: KodeKloud CKA 강의

167. Service Accounts

파란화면 2024. 5. 17. 00:39
반응형

쿠버에는 2가지 종류의 account가 존재한다.

  • User - 사람이 사용
    • admin, developer, etc.
  • Service - 봇이 사용
    • Prometheus같은 모니터링 프로그램 (쿠버 API를 통해 통계 생성), Jenkins같은 CI/CD 툴 (클러스터에 디플로이)

Service Account 생성하기

예를 들어 쿠버 상태 대시보드같은 걸 만든다고 하자. 그럼 당연히 쿠버 API에 접속해서 정보를 받아올 수 있어야 한다. 이를 위해 Service Account가 필요하다.

  • kubectl create serviceaccount account-name

ServiceAccount가 생성되면 자동으로 토큰을 생성한다*. 이 토큰을 이용하여 외부 애플리케이션이 Kubernetes API에 Authenticate할 수 있다.

  • kubectl describe serviceaccount account-name을 하면, Tokens:account-name-token-kbbdm 식으로 되어 있을 것이다.
    • 이것은 account-name-token-kbbdm Secret object에 토큰이 들어있다는 것이다.
      • kubectl describe secret 시크릿명으로 secret 내부를 볼 수 있다.
        • 여기에 있는 토큰을 HTTP Bearer Auth로 쓰면 쿠버 API에 접속이 가능하다.
          • curl --header "Authorization: Bearer 토큰"

※ 주의사항: 쿠버 1.24부터는 ServiceAccount 생성 시 자동으로 토큰을 생성하지 않는다. 아래 [[167. Service Accounts#쿠버 1.24의 변경사항|쿠버 1.24의 변경사항]] 참조.

쿠버 클러스터 내부에서 Service Account 사용

만약 그 애플리케이션이 쿠버 내부에 Pod으로 존재한다면 어떨까?

  • 그러면 토큰을 굳이 Secret에서 꺼내서 애플리케이션에 복사해줄 필요 없이, 그냥 Secret을 Pod 내부 Volume으로 마운트해서 쓸 수 있을 것이다.
    • [[100-104. Environment Variables and Configure Secrets in Application#Secret의 사용|시크릿의 사용]] 참조

사실, 모든 Kubernetes 네임스페이스에서는 이미 default라는 이름의 Service Account가 자동 생성되어 있다.

  • 또, 해당 네임스페이스의 default SA의 토큰 Secret이 Pod에 Volume Mount로 들어간다.

    • kubectl get pod 뭐시기 -o yaml 해 보면 알 수 있음
    • kubectl exec -it my-kubernets-dashboard cat /var/run/secrets/kubernets.io/serviceaccount/token
      • 굳이 이 default SA를 사용하고 싶지 않다면, Pod의 spec.automountServicAccountToken을 false로 지정하면 된다.
  • 이 default SA는 사용할 수 있는 API라우트가 상당히 제약이 많은 친구이다.

    • 커스텀 SA를 이용하려면, spec.serviceAccountName에 지정해주면 된다.
    • Pod의 경우, Service Account를 바꾸려면 삭제 후 다시 만들어야 한다.
    • Deployment의 경우, edit나 apply로 SA 수정이 가능하다.
      • SA가 수정되면, Deployment가 알아서 Pod을 삭제하고 재생성한다.

쿠버 1.22의 변경사항

이 토큰이라는 것은 사실 JWT(JSON Web Token)이다. 토큰을 디코딩해 봤을 때, 구버전에서는 토큰의 만료일 값에 대한 언급이 없음을 알 수 있다.

쿠버 1.22에서는 KEP 1205에 따라 TokenRequestAPI가 등장하였다. TokenRequestAPI를 통해 생성된 토큰은,

  • Audience Bound
  • Time Bound
  • Object Bound
    하다.

이제 Pod이 생성될 때 default service account 토큰을 이용하는 게 아니라, TokenRequestAPI를 통해 Service Account Admission Controller에 의해 유한한 수명을 가진 토큰이 생성되어, project volume으로 마운트되게 된다.

쿠버 1.24의 변경사항

KEP 2799에 따라, Service Account 생성 시 토큰이 자동으로 발행되지 않는다.

  • kubectl create token account-name을 해서 따로 토큰을 발행해야 한다.
    • 이렇게 발행된 토큰은 Secret으로 저장되지 않으며 그냥 콘솔에 출력된다.
    • 이렇게 발행된 토큰은 유효기간이 존재하는 신형 토큰이며, 유효기간의 기본값은 1시간이다.

구버전식 무기한토큰을 생성하고자 하는 경우 따로 Secret definition file을 생성하여야 한다.

apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: secretname
  annotations:
    kubernetes.io/service-account.name: account-name
반응형