쿠버네티스에서는 하나의 클러스터를 여러 팀과 애플리케이션이 공유하는 멀티 테넌트 환경을 구성할 수 있습니다.
이 경우, 각 팀이 특정 네임스페이스 내에서만 작업할 수 있도록 제한하고, 불필요한 권한을 최소화하는 것이 중요합니다.
이를 위해 RBAC(Role-Based Access Control)를 활용하여 사용자 및 그룹별 리소스 접근을 제어하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. RBAC을 사용하여 특정 네임스페이스에서만 사용자가 리소스를 관리하도록 제한
2. 그룹 기반 접근 제어를 활용하여 여러 사용자를 일괄적으로 관리하는 방법
3. kubectl을 활용한 현재 RBAC 정책 조회 및 적용된 권한 확인
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ RBAC을 사용하여 특정 네임스페이스에서만 사용자가 리소스를 관리하도록 제한
❓ 문제 상황
운영팀에서 각 개발팀이 특정 네임스페이스 내에서만 애플리케이션을 배포하고 관리할 수 있도록 제한해야 합니다.
이를 위해 RBAC을 활용하여 특정 사용자가 지정된 네임스페이스에서만 리소스를 생성하고 관리할 수 있도록 설정해야 합니다.
• 사용자: dev-user
• 접근 가능 네임스페이스: dev-team
• 허용된 작업: Pod 및 Deployment 생성, 수정, 조회 가능
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Role을 생성하여 특정 네임스페이스에서만 리소스를 관리할 수 있도록 설정합니다.
2. RoleBinding을 사용하여 사용자를 Role에 바인딩합니다.
✅ 정답 Manifest (Role 및 RoleBinding 설정)
🔹 dev-team 네임스페이스 생성
apiVersion: v1
kind: Namespace
metadata:
name: dev-team
🔹 특정 네임스페이스에서만 리소스를 관리할 수 있는 Role 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: dev-role
namespace: dev-team
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create", "delete"]
🔹 특정 사용자(dev-user)를 해당 Role에 바인딩
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-user-binding
namespace: dev-team
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: dev-role
apiGroup: rbac.authorization.k8s.io
✅ 이제 dev-user는 dev-team 네임스페이스 내에서만 Deployment 및 Pod을 관리할 수 있음
📌 적용 후 예상 결과 값
1. RBAC 정책 적용 상태 확인
kubectl get rolebinding -n dev-team
💡 예상 출력 값
NAME ROLE AGE
dev-user-binding Role/dev-role 5m
✅ dev-user가 dev-team 네임스페이스에서만 특정 리소스를 관리할 수 있도록 설정됨
2️⃣ 그룹 기반 접근 제어를 활용하여 여러 사용자를 일괄적으로 관리하는 방법
❓ 문제 상황
운영팀에서 팀원들이 늘어나면서, 각 사용자별로 RoleBinding을 개별적으로 설정하는 것이 번거로워졌습니다.
이를 해결하기 위해 RBAC을 그룹 기반으로 설정하여 동일한 역할을 여러 사용자에게 일괄적으로 적용해야 합니다.
• 사용자 그룹: dev-team-group
• 접근 가능 네임스페이스: dev-team
• 허용된 작업: Pod 및 Deployment 관리
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. ClusterRole을 생성하여 여러 네임스페이스에서 동일한 역할을 부여할 수 있도록 설정합니다.
2. ClusterRoleBinding을 사용하여 그룹을 ClusterRole에 바인딩합니다.
✅ 정답 Manifest (ClusterRole 및 ClusterRoleBinding 설정)
🔹 dev-team 그룹을 위한 ClusterRole 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dev-team-role
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create", "delete"]
🔹 dev-team-group을 해당 Role에 바인딩
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dev-team-binding
subjects:
- kind: Group
name: dev-team-group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: dev-team-role
apiGroup: rbac.authorization.k8s.io
✅ 이제 dev-team-group에 속한 모든 사용자가 dev-team-role의 권한을 가짐
📌 적용 후 예상 결과 값
1. ClusterRoleBinding 적용 상태 확인
kubectl get clusterrolebinding dev-team-binding
💡 예상 출력 값
NAME ROLE AGE
dev-team-binding ClusterRole/dev-team-role 5m
✅ dev-team-group에 속한 모든 사용자가 동일한 권한을 가지도록 설정됨
3️⃣ kubectl을 활용한 현재 RBAC 정책 조회 및 적용된 권한 확인
❓ 문제 상황
운영팀에서 RBAC 설정이 올바르게 적용되었는지 확인하고, 특정 사용자가 어떤 권한을 가지고 있는지 점검해야 합니다.
kubectl 명령어를 활용하여 현재 설정된 Role 및 RoleBinding 상태를 조회하고, 특정 사용자의 접근 가능 여부를 확인해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl get rolebinding 및 clusterrolebinding 명령어를 사용하여 현재 적용된 RBAC 설정을 확인합니다.
2. kubectl auth can-i 명령어를 활용하여 특정 사용자의 권한을 테스트합니다.
✅ RBAC 정책 상태 확인 명령어
🔹 특정 네임스페이스 내의 RoleBinding 조회
kubectl get rolebinding -n dev-team
💡 예상 출력 값
NAME ROLE AGE
dev-user-binding Role/dev-role 5m
🔹 특정 사용자의 권한 확인
kubectl auth can-i create deployments --as=dev-user -n dev-team
💡 예상 출력 값 (허용됨)
yes
💡 예상 출력 값 (거부됨)
no
✅ RBAC 정책이 정상적으로 적용되었는지 확인 가능