쿠버에는 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 토큰"
- 여기에 있는 토큰을 HTTP Bearer Auth로 쓰면 쿠버 API에 접속이 가능하다.
- 이것은
※ 주의사항: 쿠버 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를 사용하고 싶지 않다면, Pod의
이 default SA는 사용할 수 있는 API라우트가 상당히 제약이 많은 친구이다.
- 커스텀 SA를 이용하려면,
spec.serviceAccountName
에 지정해주면 된다. - Pod의 경우, Service Account를 바꾸려면 삭제 후 다시 만들어야 한다.
- Deployment의 경우, edit나 apply로 SA 수정이 가능하다.
- SA가 수정되면, Deployment가 알아서 Pod을 삭제하고 재생성한다.
- 커스텀 SA를 이용하려면,
쿠버 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
'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글
177-178. Kubernetes Network Policy (0) | 2024.05.17 |
---|---|
170-174. Image Security, Security Contexts (0) | 2024.05.17 |
160-164. Authorisation, RBAC and Cluster Roles (0) | 2024.05.17 |
159. API Groups (0) | 2024.05.17 |
155. Kubeconfig와 context (0) | 2024.05.17 |