Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.21] 🚀 RBAC 편 #3 | 서비스 계정(ServiceAccount) 및 Pod 권한 관리

ygtoken 2025. 3. 16. 14:49
728x90

 

쿠버네티스에서 ServiceAccount(서비스 계정)는 Pod가 특정 역할을 수행할 때 필요한 권한을 부여하는 핵심 요소입니다.

이번 글에서는 ServiceAccount를 생성하여 Pod에 적용하는 방법과 Pod가 특정 네임스페이스에서만 권한을 가지도록 설정하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 특정 Pod이 사용할 수 있는 ServiceAccount 설정

2️⃣ Pod에게 특정 네임스페이스 내 권한을 부여하는 RoleBinding 적용

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 특정 Pod이 사용할 수 있는 ServiceAccount 설정

 

❓ 문제 상황

 

운영팀에서 특정 애플리케이션이 실행되는 Pod가 API 서버와 상호작용할 수 있도록 해야 하는 요구사항이 생겼습니다.

Pod는 기본적으로 default 서비스 계정을 사용하지만, 보안 강화를 위해 별도의 ServiceAccount를 사용하도록 설정해야 합니다.

ServiceAccount의 이름은 custom-sa이어야 합니다.

Pod은 custom-sa를 사용하여 실행되어야 합니다.

특정 네임스페이스(dev-namespace) 내에서만 적용되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. 새로운 ServiceAccount를 생성하여 Pod이 기본(default) 계정 대신 사용할 수 있도록 설정해야 합니다.

metadata.namecustom-sa로 지정하여 새로운 ServiceAccount 생성

 

2. Pod에서 serviceAccountName을 설정하여 custom-sa를 사용하도록 지정해야 합니다.

 


✅ 정답 Manifest (Pod에 ServiceAccount 적용)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: custom-sa  # 생성할 서비스 계정
  namespace: dev-namespace  # 특정 네임스페이스 내에서만 사용 가능

---

apiVersion: v1
kind: Pod
metadata:
  name: pod-using-sa  # 실행할 Pod 이름
  namespace: dev-namespace
spec:
  serviceAccountName: custom-sa  # Pod이 사용할 ServiceAccount 지정
  containers:
  - name: test-container
    image: busybox  # 테스트용 컨테이너
    command: ["sh", "-c", "sleep 3600"]

 

 


📌 적용 후 예상 결과 값

 

1. ServiceAccount 생성 확인

kubectl get serviceaccount -n dev-namespace

 

💡 예상 출력 값

NAME         SECRETS   AGE
custom-sa    1         5s

 

2. Pod이 해당 ServiceAccount를 사용하고 있는지 확인

kubectl get pod pod-using-sa -n dev-namespace -o yaml | grep serviceAccountName

 

💡 예상 출력 값

serviceAccountName: custom-sa

 

 


2️⃣ Pod에게 특정 네임스페이스 내 권한을 부여하는 RoleBinding 적용

 

❓ 문제 상황

 

운영팀에서 특정 Pod이 실행되는 동안 API 서버에 접근할 수 있도록 제한적인 권한을 부여해야 하는 요구사항이 생겼습니다.

Pod이 실행 중일 때 자신이 속한 네임스페이스에서만 ConfigMap을 조회할 수 있도록 설정해야 합니다.

Role의 이름은 configmap-reader이어야 합니다.

custom-sa 서비스 계정이 ConfigMap을 조회할 수 있도록 설정해야 합니다.

dev-namespace 네임스페이스 내에서만 권한이 적용되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Role을 생성하여 특정 네임스페이스 내에서 ConfigMap을 조회할 수 있도록 설정해야 합니다.

apiGroups: [""]을 설정하여 기본 리소스(ConfigMap)에 대한 접근을 제한

resources: ["configmaps"]을 설정하여 관리할 리소스 지정

 

2. RoleBinding을 생성하여 특정 ServiceAccount(custom-sa)에게 Role을 적용해야 합니다.

 


✅ 정답 Manifest (ServiceAccount에 특정 권한 적용)

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev-namespace  # 권한을 부여할 네임스페이스
  name: configmap-reader  # Role 이름
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["get", "list", "watch"]  # 조회만 가능하도록 설정

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: dev-namespace  # 권한을 적용할 네임스페이스
  name: configmap-reader-binding  # RoleBinding 이름
subjects:
- kind: ServiceAccount
  name: custom-sa  # 권한을 부여할 ServiceAccount
  namespace: dev-namespace
roleRef:
  kind: Role
  name: configmap-reader  # 연결할 Role 이름
  apiGroup: rbac.authorization.k8s.io

 

 


📌 적용 후 예상 결과 값

 

1. Role 및 RoleBinding 생성 확인

kubectl get roles -n dev-namespace
kubectl get rolebindings -n dev-namespace

 

💡 예상 출력 값

NAME               AGE
configmap-reader   5s
NAME                     ROLE                 AGE
configmap-reader-binding configmap-reader     5s

 

2. Pod 내부에서 ConfigMap 조회 가능 여부 확인

kubectl exec -it pod-using-sa -n dev-namespace -- kubectl get configmaps

 

💡 예상 출력 값

NAME             DATA   AGE
app-config       2      10m
db-config        3      8m

 

3. Pod 내부에서 ConfigMap 삭제 가능 여부 확인 (권한 없음)

kubectl exec -it pod-using-sa -n dev-namespace -- kubectl delete configmap app-config

 

💡 예상 출력 값

Error from server (Forbidden): configmaps "app-config" is forbidden: User "system:serviceaccount:dev-namespace:custom-sa" cannot delete resource "configmaps" in API group "" in the namespace "dev-namespace"

 

728x90