Cloud/k8s-CKAD

[CKAD] Service Account

jinkwon.kim 2024. 7. 16. 22:11
728x90
반응형

개요

k8s에서의 Service Account에 대하여 알아 보겠습니다. 

Service Account란?

https://doitnow-man.tistory.com/entry/CKA-41-service-account

 

[CKA] 42. service account

개요k8s에는 2개의 계정분류가 존재합니다.  1. user account- 사람이 k8s관리는 위해서 사는 계정2. service account- k8s service가 k8s에 무언가 요청을 하기 위해서 사용하는 게정 위 두 종류 계정 중. user a

doitnow-man.tistory.com

Pod 안에서 SeviceAccount

기본적으로 namespace 별로 존재하는 default serviceaccount가 Pod에 할당이 됩니다. 하지만 기능이 매우 제한 적이기 때문에 Pod에서 더많은 k8s기능을 사용하기 위해서는 새로운 ServiceAccount를 생성후 아래와 같이 Pod definition에 명시를 해야합니다. 

 

serviceAccountName 필드를 사용하여 Pod에 ServiceAccount 할당이 가능합니다.

serviceaccount는 Pod에 할당 하는 것이다.  그리고 service account 사용을 위해서는 Token이 필수로 service acount와 연결이 되어있어야 합니다. 

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  serviceAccountName: my-service-account
  containers:
  - name: example-container
    image: nginx

 

Token생성

service account는 token을 사용하여 인증처리를 진행합니다. 그래서 token을 만들고 service account에 연결해 주어야 합니다.

token관련 변경사항

Kubernetes 1.24부터 ServiceAccount를 생성할 때 자동으로 토큰이 생성되지 않으므로 수동으로 생성해야 한다.

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md#no-really-you-must-read-this-before-you-upgrade

token 생성의 2가지 방법

Secret Object

장기간 token을 사용하고 싶을 때 사용. 그러나 보안상 취약 함으로 추천하지 않습니다.
https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-long-lived-api-token-for-a-serviceaccount

apiVersion: v1
kind: Secret
metadata:
  name: build-robot-secret
  annotations:
    kubernetes.io/service-account.name: my-service-account
type: kubernetes.io/service-account-token

TokenRequest API

TokenRequest API를 사용하여 수명을 가진 token을 생성하는 방법입니다. 그리고 token은 수명이 다하면 자동으로 회전을 합니다.  TokenRequest API는 다음 명령으로 생성이 가능합니다

 

kubectl create token [serviceaccountname] --namespace [namespace]

kubectl create token my-servcei-account --namespace default

 

참고 : kubectl create token에 대한 --duration 명령줄 인수를 사용하여 특정 토큰 기간을 요청할 수 있습니다(발행된 토큰의 실제 기간은 더 짧을 수도 있고 더 길 수도 있습니다).

 

제약 사항 : 이 API를 사용하려면 쿠버네티스 클러스터가 Service Account Token Volume Projection 기능을 지원해야 합니다.

 

위와 같이 할 당시   /var/run/secrets/kubernetes.io/serviceaccount 에 ServiceAccount에 대한 Token 정보가 mount됩니다. 

Service Account 자동 mount막기

보안은 위해서 ServiceAccount가 자동으로 Pod에 mount되는 것을 automountServiceAccountToken: false 통해서 막을수 있습니다. 이렇게 될 경우 ServiceAccount를 사용하기 위해서 사용자가 수동으로 ServiceAccount의 Secret 정보를 Volume으로 mount해주어야 합니다.

 

Pod에서 automountServiceAccountToken: false 적용한 예제

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
automountServiceAccountToken: false

 

ServiceAccount에 automountServiceAccountToken: false 적용한 에제

해당 ServiceAccount를 사용하는 Pod에는 자동으로 ServiceAccount Token이 mount되지 않습니다. 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
automountServiceAccountToken: false

 

유의 사항

Pod에 설정된 ServiceAccount를 변경하기 위해서는 Pod를 삭제 후 다시 생성해야 합니다.

정리

ServiceAccount는 Pod에 k8s의 권한을 부여 할 때 사용한다.

Pod에 ServiceAccount를 할당하면 ServiceAccount의 token 정보가 /var/run/secrets/kubernetes.io/serviceaccount 에 mount됩니다. 그래서 Pod는 해당 Token을 사용하여 인증을 수행합니다.

728x90
반응형