티스토리 뷰

반응형

쿠버네티스 실습: 네임스페이스와 RBAC 기초

앞선 글에서는 Requests & Limits, Pod QoS Class를 실습하며 쿠버네티스의 리소스 관리 방식을 이해했습니다.
이번 글에서는 쿠버네티스 운영에서 꼭 필요한 **네임스페이스(Namespace)**와 **RBAC(Role-Based Access Control)**을 다룹니다.
이 두 가지는 여러 팀이나 서비스가 하나의 클러스터를 공유할 때 격리와 보안을 보장하는 핵심 기능입니다.


1) 네임스페이스란?

  • 클러스터 내부를 논리적으로 분리하는 단위.
  • Pod, Service, Deployment 같은 리소스는 특정 네임스페이스에 속함.
  • 서로 다른 네임스페이스는 기본적으로 리소스를 공유하지 않음.

기본 제공 네임스페이스:

kubectl get ns

출력 예시:

NAME              STATUS   AGE
default           Active   10d
kube-system       Active   10d
kube-public       Active   10d
kube-node-lease   Active   10d

2) 새로운 네임스페이스 생성

team-a-namespace.yaml 작성:

apiVersion: v1
kind: Namespace
metadata:
  name: team-a

적용:

kubectl apply -f team-a-namespace.yaml
kubectl get ns

출력 예시:

NAME     STATUS   AGE
team-a   Active   5s

3) 네임스페이스에 리소스 배포

반응형

Deployment를 team-a 네임스페이스에 배포합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-nginx
  namespace: team-a
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80

적용:

kubectl apply -f hello-nginx.yaml
kubectl get pods -n team-a

4) RBAC 기본 개념

  • Role: 특정 네임스페이스 내에서의 권한을 정의.
  • ClusterRole: 클러스터 전체에서의 권한을 정의.
  • RoleBinding: Role을 사용자(ServiceAccount)에게 연결.
  • ClusterRoleBinding: ClusterRole을 사용자에게 연결.

5) Role과 RoleBinding 예시

role-team-a.yaml 작성:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: team-a
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

rolebinding-team-a.yaml 작성:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: team-a
subjects:
- kind: ServiceAccount
  name: default
  namespace: team-a
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

적용:

kubectl apply -f role-team-a.yaml
kubectl apply -f rolebinding-team-a.yaml

6) 권한 테스트

  1. team-a 네임스페이스에서 Pod 조회 → 성공
kubectl get pods -n team-a
  1. 다른 네임스페이스(default)에서 Pod 조회 → 거부됨
kubectl get pods -n default --as=system:serviceaccount:team-a:default

오류 예시:

Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:team-a:default" cannot list resource "pods" in API group "" in the namespace "default"

7) 정리

  • 네임스페이스는 클러스터를 논리적으로 분리해 팀 단위 관리가 가능.
  • RBAC(Role & RoleBinding)를 통해 특정 사용자/서비스 계정에만 권한을 부여 가능.
  • 이를 활용하면 여러 서비스/팀이 하나의 클러스터에서 안전하게 공존할 수 있음.

다음 글에서는 Helm Chart를 활용해 쿠버네티스 애플리케이션 배포를 자동화하고, 복잡한 매니페스트를 재사용 가능한 패키지로 관리하는 방법을 실습하겠습니다.


 

쿠버네티스,네임스페이스,RBAC,권한관리,보안,Role,RoleBinding,DevOps,Minikube,K8s실습

 

 


QoS 클래스 기준과 리소스 동작 보강 요약

1. QoS 클래스 공식 정의 (Guaranteed / Burstable / BestEffort)

  • Guaranteed
    모든 컨테이너가 요청(requests)과 한도(limits)를 모두 설정해야 하며, 요청값(requests)과 제한값(limits)이 동일해야 이 QoS가 부여됩니다.
    즉, cpu: 200m / memory: 200Mi 형태로 요청과 상한이 일치해야 합니다.
    (Kubernetes)
  • Burstable
    Guaranteed 조건을 만족하지 않지만, requests 또는 limits 중 하나 이상은 설정된 경우 적용됩니다.
    예: 요청값은 100Mi, 한도는 200Mi와 같이 다를 때. 이 경우 자원이 여유가 있으면 더 사용 가능하지만, 노드에 압력이 오면 Guaranteed보다 먼저, BestEffort보다는 늦게 축출됩니다.
    (Kubernetes)
  • BestEffort
    CPU와 메모리에 대해 요청(requests)이나 한도(limits)이 전혀 설정되지 않은 경우입니다.
    이 경우 QoS는 가장 낮으며, 노드 자원이 부족해지면 가장 먼저 축출 대상이 됩니다.
    (Kubernetes)

2. 리소스 초과 시 동작 방식 차이 (CPU vs Memory)

  • CPU 초과
    설정된 CPU limit를 초과하면 Throttling이 일어나며, 컨테이너가 강제 종료되지는 않습니다.
    이는 CPU가 '압축 가능한(compressible)' 자원이기 때문입니다.
    (Sematext)
  • Memory 초과
    Memory limit를 초과하면, 커널에 의해 OOMKilled 상태로 강제 종료됩니다.
    메모리는 '압축 불가능(incompressible)' 자원이므로 처리가 엄격하게 이루어집니다.
    (Sematext, Datadog)

3. Eviction 순서 (QoS 기반 우선도)

자원이 부족한 상황에서는 QoS 클래스에 따라 파드를 축출합니다:

  1. BestEffort (가장 먼저 축출)
  2. Burstable
  3. Guaranteed (가장 낮은 확률로 축출)

즉, QoS가 높을수록 클러스터 안정성이 보장됩니다.
(Kubernetes, Sematext)


정리 테이블

QoS 클래스 조건 특징 및 Eviction 순서

Guaranteed requests = limits (CPU & 메모리) 가장 높은 우선순위 / 축출 최후 / 예측 가능
Burstable requests 또는 limits 일부 설정됨 (또는 다름) 자원 여유 시 사용 가능 / 압력 시 중간 우선순위 축출
BestEffort requests & limits 모두 미설정 가장 낮은 우선순위 / 가장 먼저 축출
  • CPU 초과 시: Throttling (속도 제한)
  • Memory 초과 시: OOMKilled (강제 종료)
    (Sematext, Datadog)

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함
반응형