dh_0e

[Cloud] K8s 요청 처리 단계, Service Account 본문

Cloud/Kubernetes

[Cloud] K8s 요청 처리 단계, Service Account

dh_0e 2026. 6. 8. 11:00

Kubernetes API Server의 요청 처리 3단계

  • Authentication(인증 - 사용자 식별): HTTP 요청을 검사하여 메시지를 보낸 주체가 누구인지 식별
    • SSO 시스템이나 인증서 등을 통해 확인하며, 미리 구성된 인프라를 활용함 (Authenticator App)
  • Authorization(권한 부여 - 권한 확인): 인증된 사용자가 요청한 리소스에 대해 해당 작업(R/W/D 등)을 수행할 권한이 있는지 확인
  • Admission Control(승인 제어 - 유효성 검사 및 수락): 리소스 생성/수정/삭제 요청 시, 컨텐츠(Spec)에 잘못된 부분은 없는지 확인하고, 필요시 수정함
    • 이러한 플러그인은 여러 개 설치할 수 있으며, 요청은 모든 플러그인을 거쳐야 함 
    • ex) "Pod 만드는데 CPU 10,000개 할당해 줘" 같은 무리한 요청이 들어오면 거절

Admission Control Plugins 종류

 

Service Account

  • Service account: Pod가 API 서버와 통신하기 위해 사용하는 계정으로 요청 처리 과정 전반에 걸쳐 사용됨
    • API 서버에 접속하는 클라이언트는 실제 사람(Human)내부 Pod로 나뉨

  • Pod가 만들어지면 특정 Service Account와 연결되며, Pod는 이 계정의 토큰을 사용해 API 서버와 통신함
  • Pod 생성 시 계정을 따로 지정하지 않으면 해당 namespace의 기본 Service Account가 자동으로 부여
    • 위 사진에 나와있듯이, 다른 namespace의 Service Account에 연결할 수 없음
  • 이를 통해 각 Pod가 어떤 리소스에 접근할 수 있는지 제어할 수 있음

Example of Service Account Using in Pod YAML

 

Authorization & RBAC (역할 기반 접근 제어)

A리소스만 접근 가능한 것을 Role로 확인

  • K8s는 권한을 관리하기 위해 RBAC 플러그인을 주로 사용하여 Service Account에 권한을 적용함
  • RBAC(Role Based Access Control): HTTP 메서드에 따라 동사(get, list, create, update 등) 단위로 권한을 나누어 줌
    • Role(역할): 어떤 리소스에 대해 어떤 작업을 할 수 있는지 정의한 권한의 집합
      • ex) 특정 리소스 A만 조회 가능
    • Role Binding(역할 바인딩): 만들어둔 Role을 외부 사용자(User)Pod의 계정(Service Account)에 연결(적용)해주는 객체
    • ClusterRoleBinding: 특정 namespace를 넘어, Cluster 전체 범위에 Role을 바인딩하는 것

HTTP 메소드

ex) Role YAML file

service라는 리소스를 조회(get, list)할 수 있는 권한을 가진 Role

  • 이러한 RoleRole Binding을 통해, 특정 namespace나 리소스에 대한 접근 권한을 제어하여 결과적으로 사용자의 kubectl 명령어 실행 권한을 부여하거나 해제할 수 있음
    • kubectl 명령어도 결국 http 요청이기 때문
  • 위와 같이 Role을 만든 뒤, 아래와 같이 'kind: RoleBinding' YAML 파일을 따로 작성해서 service-reader와 연결해줘야 함
# Service Account 생성
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa      # 신분증 이름
  namespace: foo       # 아까 Role이 있던 namespace와 동일하게 맞춤
  
# RoleBinding 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-services-binding  # 이 바인딩 규칙의 이름
  namespace: foo
subjects:                     # 1. 누구에게 권한을 줄 것인가? (대상)
- kind: ServiceAccount        # 대상의 종류는 ServiceAccount!
  name: my-app-sa             # 방금 위에서 만든 그 신분증!
  namespace: foo
roleRef:                      # 2. 어떤 권한을 줄 것인가? (참조할 Role)
  kind: Role                  # 연결할 대상은 Role!
  name: service-reader        # 아까 사진에서 만든 그 권한(Role) 이름!
  apiGroup: rbac.authorization.k8s.io
"Service account(Pod)에 Role(Resources 사용 권한)을 붙여주는 것이 Role binding이다."