쿠버네티스 환경에서 **Multi-Tenancy(멀티 테넌시)**는 여러 팀(테넌트)이 동일한 클러스터에서 독립적으로 자원을 사용하면서도 보안과 격리를 유지하는 방법을 의미합니다.
이번 글에서는 네임스페이스를 기반으로 멀티 테넌시를 구현하고, 각 팀별로 자원을 분리하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 여러 팀(테넌트)별 네임스페이스 분리 및 관리
2️⃣ 네임스페이스 리소스 제한 및 RBAC 적용
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 여러 팀(테넌트)별 네임스페이스 분리 및 관리
❓ 문제 상황
운영팀에서 하나의 클러스터를 여러 팀이 사용해야 하는 요구사항이 생겼습니다.
하지만 모든 팀이 같은 네임스페이스를 공유하면 보안 문제 및 자원 충돌이 발생할 위험이 있습니다.
• 각 팀(Team A, Team B)별로 별도의 네임스페이스를 생성해야 합니다.
• 각 팀의 네임스페이스에는 자체적인 애플리케이션과 리소스만 배포될 수 있어야 합니다.
• 각 팀별로 관리할 수 있는 RBAC(Role-Based Access Control) 정책을 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 각 팀별로 네임스페이스를 생성합니다.
• team-a 및 team-b라는 두 개의 네임스페이스를 생성
2. 네임스페이스 별로 리소스를 격리합니다.
• 각 팀은 자신들의 네임스페이스에서만 애플리케이션을 배포
3. RBAC를 활용하여 특정 팀원만 해당 네임스페이스를 관리할 수 있도록 설정합니다.
✅ 정답 Manifest (네임스페이스 생성 및 기본 설정)
apiVersion: v1
kind: Namespace
metadata:
name: team-a # Team A 전용 네임스페이스 생성
---
apiVersion: v1
kind: Namespace
metadata:
name: team-b # Team B 전용 네임스페이스 생성
📌 적용 후 예상 결과 값
1. 네임스페이스 생성 확인
kubectl get ns
💡 예상 출력 값
NAME STATUS AGE
team-a Active 5s
team-b Active 5s
2. 각 네임스페이스에 애플리케이션 배포 가능 여부 확인
kubectl create deployment app --image=nginx -n team-a
kubectl create deployment app --image=nginx -n team-b
💡 예상 출력 값
deployment.apps/app created
deployment.apps/app created
2️⃣ 네임스페이스 리소스 제한 및 RBAC 적용
❓ 문제 상황
각 팀이 독립적인 네임스페이스를 사용하더라도 과도한 리소스 사용을 방지해야 합니다.
또한, 각 팀별로 특정 사용자만 자신의 네임스페이스를 관리할 수 있도록 설정해야 합니다.
• 네임스페이스 별로 CPU 및 메모리 제한을 설정해야 합니다.
• 각 팀원들에게 관리자(Admin) 역할을 부여하여, 자신의 네임스페이스에서만 관리할 수 있도록 해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. ResourceQuota 및 LimitRange를 설정하여 네임스페이스별 리소스를 제한합니다.
• 특정 네임스페이스에서 CPU, 메모리 사용량을 제한
• 과도한 리소스 사용을 방지
2. RBAC(Role-Based Access Control)을 활용하여 특정 사용자만 해당 네임스페이스를 관리할 수 있도록 설정합니다.
✅ 정답 Manifest (네임스페이스 리소스 제한 및 RBAC 설정)
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
cpu: "2" # 최대 2개의 CPU 사용 가능
memory: 4Gi # 최대 4Gi 메모리 사용 가능
pods: "10" # 최대 10개의 Pod 생성 가능
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-b-quota
namespace: team-b
spec:
hard:
cpu: "2"
memory: 4Gi
pods: "10"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: team-a-admin
rules:
- apiGroups: [""]
resources: ["pods", "deployments", "services"]
verbs: ["create", "delete", "get", "list", "watch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-admin-binding
namespace: team-a
subjects:
- kind: User
name: "user-a" # Team A 관리자로 설정할 사용자
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: team-a-admin
apiGroup: rbac.authorization.k8s.io
📌 적용 후 예상 결과 값
1. ResourceQuota 적용 확인
kubectl get resourcequota -n team-a
💡 예상 출력 값
NAME CPU MEMORY PODS
team-a-quota 2 4Gi 10
2. RBAC 설정 확인 (Team A의 관리 권한 확인)
kubectl auth can-i create pods --as=user-a -n team-a
💡 예상 출력 값
yes
3. Team B 네임스페이스에서는 권한이 없는지 확인
kubectl auth can-i create pods --as=user-a -n team-b
💡 예상 출력 값
no