쿠버네티스에서 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.name을 custom-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"