본문 바로가기
K8S

[Kubernetes] Service Account 개념 및 활용

by Rainbound-IT 2025. 3. 4.
반응형

1. Service Account란?

Kubernetes에서 Service Account(SA)Pod가 Kubernetes API 서버와 상호작용할 때 사용하는 계정이다.
즉, Pod 내부의 애플리케이션이 API 요청을 수행할 때 사용되는 인증 메커니즘이다.

기본적으로 Kubernetes에서는 다음과 같은 두 가지 유형의 계정이 있다:

  1. User Account (사용자 계정)
    • Kubernetes 외부에서 클러스터에 접근하는 실제 사용자를 위한 계정.
    • 예: 개발자가 kubectl apply 명령을 실행할 때 사용되는 계정.
    • RBAC(Role-Based Access Control)과 결합하여 사용자가 수행할 수 있는 작업을 제한 가능.
  2. Service Account (서비스 계정)
    • Pod 내부의 프로세스가 Kubernetes API와 통신할 때 사용되는 계정.
    • 기본적으로 네임스페이스별로 자동 생성됨.
    • kubectl exec 또는 kubectl proxy 같은 명령을 실행하는 사용자 계정과 다름.
    • RBAC와 결합하여 Pod가 수행할 수 있는 작업을 제한 가능.

2. Service Account 동작 방식

  • 네임스페이스(namespace) 마다 기본적으로 default라는 서비스 계정이 자동으로 생성됨.
  • Pod이 생성되면, 기본적으로 해당 네임스페이스의 default 서비스 계정을 사용하게 됨.
  • 서비스 계정이 Pod에 할당되면, Kubernetes는 Pod 내부에 인증 토큰을 주입하여 API 요청 시 사용 가능하도록 설정함.
  • Pod 내부 애플리케이션이 Kubernetes API에 접근할 경우, 해당 서비스 계정의 RBAC 권한에 따라 API 요청이 허용 또는 거부됨.

3. 기본 Service Account 확인

네임스페이스 내 기본 서비스 계정을 확인하려면:

kubectl get serviceaccounts -n default

출력 예시:

NAME SECRETS AGE
default     1             5d
  • default라는 이름의 서비스 계정이 존재함.

기본 서비스 계정의 상세 정보를 확인하려면:

kubectl get serviceaccount default -o yaml

출력 예시:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
secrets:
- name: default-token-abcde
  • secrets 항목을 보면, Kubernetes API에 접근할 때 사용할 토큰(default-token-abcde)이 자동 생성되어 있음.

4. 새로운 Service Account 생성

Pod이 기본 default 서비스 계정이 아닌 새로운 계정을 사용하도록 설정하려면, 새로운 Service Account를 생성해야 한다.

(1) Service Account YAML 예제

아래는 my-service-account라는 이름의 서비스 계정을 생성하는 예제이다.

 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
  namespace: default

적용 방법:

kubectl apply -f sa.yaml

 

생성된 서비스 계정을 확인하려면:

 
kubectl get serviceaccounts -n default
 
NAME SECRETS AGE
default 1 5d
my-service-account 1 1m

5. 특정 Service Account를 Pod에 적용

Pod이 특정 서비스 계정을 사용하도록 설정하려면, Pod 스펙에서 serviceAccountName을 지정해야 한다.

(1) Service Account 적용된 Pod YAML 예제

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  serviceAccountName: my-service-account
  containers:
  - name: my-container
    image: busybox
    command: ["sleep", "3600"]
  • serviceAccountName: my-service-account을 명시하여 Pod이 my-service-account를 사용하도록 설정함.

Pod을 생성한 후, 적용된 서비스 계정을 확인하려면:

kubectl get pod my-pod -o jsonpath='{.spec.serviceAccountName}'

출력 예시:

my-service-account

6. Service Account와 RBAC(Role-Based Access Control) 연동

서비스 계정에 특정 권한을 부여하려면 Role 또는 ClusterRole과 RoleBinding 또는 ClusterRoleBinding을 사용해야 한다.

(1) 특정 네임스페이스 내에서만 리소스 접근 가능하도록 설정

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: my-service-account
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

설명

  • my-service-account가 default 네임스페이스 내 pods 리소스를 get, list, watch할 수 있도록 RoleBinding을 설정함.

(2) 클러스터 전체에서 리소스 접근 가능하도록 설정

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin-access
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: ServiceAccount
  name: my-service-account
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin-access
  apiGroup: rbac.authorization.k8s.io

설명

  • my-service-account가 클러스터 전체에서 모든 리소스에 대해 모든 작업(get, list, watch, create, update, delete)을 수행할 수 있도록 설정됨.
  • 주의: ClusterRole을 사용할 경우, 서비스 계정이 클러스터 내 모든 리소스에 접근할 수 있으므로 신중하게 사용해야 함.

7. Service Account 토큰 확인 및 사용

서비스 계정이 API 서버에 접근할 때 사용하는 토큰을 확인하는 방법:

(1) 서비스 계정에 연결된 토큰 Secret 확인

kubectl get secret -n default

출력 예시:

NAME TYPE DATA    AGE
default-token-abcde kubernetes.io/service-account-token 3 5d
my-service-account-token-xyz123 kubernetes.io/service-account-token 3 1m

(2) 토큰 확인

kubectl get secret my-service-account-token-xyz123 -o jsonpath='{.data.token}' | base64 --decode

출력 예시:

eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5aMld6V2E1Z1EifQ...
 

이 토큰을 사용하여 Kubernetes API 요청을 보낼 수 있다.


8. 결론

  • Service Account는 Pod이 Kubernetes API에 접근할 때 사용하는 계정이다.
  • 기본적으로 각 네임스페이스에는 default 서비스 계정이 존재하며, 모든 Pod은 기본적으로 이를 사용함.
  • 별도의 서비스 계정을 생성하여 특정 Pod에 적용할 수 있으며, RBAC를 활용해 권한을 제한할 수 있음.
  • Role 또는 ClusterRole과 RoleBinding 또는 ClusterRoleBinding을 조합하여 서비스 계정이 수행할 수 있는 작업을 세밀하게 제어할 수 있음.
  • API 요청을 수행할 때는 서비스 계정의 토큰을 활용할 수 있음.
반응형

댓글