Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.38] 🚀 Multi-Tenancy 편 #1 | 네임스페이스 기반 멀티 테넌시 구현

ygtoken 2025. 3. 16. 18:50
728x90

 

쿠버네티스 환경에서 **Multi-Tenancy(멀티 테넌시)**는 여러 팀(테넌트)이 동일한 클러스터에서 독립적으로 자원을 사용하면서도 보안과 격리를 유지하는 방법을 의미합니다.

이번 글에서는 네임스페이스를 기반으로 멀티 테넌시를 구현하고, 각 팀별로 자원을 분리하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 여러 팀(테넌트)별 네임스페이스 분리 및 관리

2️⃣ 네임스페이스 리소스 제한 및 RBAC 적용

 

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

 


1️⃣ 여러 팀(테넌트)별 네임스페이스 분리 및 관리

 

❓ 문제 상황

 

운영팀에서 하나의 클러스터를 여러 팀이 사용해야 하는 요구사항이 생겼습니다.

하지만 모든 팀이 같은 네임스페이스를 공유하면 보안 문제 및 자원 충돌이 발생할 위험이 있습니다.

각 팀(Team A, Team B)별로 별도의 네임스페이스를 생성해야 합니다.

각 팀의 네임스페이스에는 자체적인 애플리케이션과 리소스만 배포될 수 있어야 합니다.

각 팀별로 관리할 수 있는 RBAC(Role-Based Access Control) 정책을 설정해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. 각 팀별로 네임스페이스를 생성합니다.

team-ateam-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
728x90