Kubernetes 심화: 네트워킹, 스토리지, 배포 전략
Service, Ingress, PV/PVC, 롤링 업데이트, RBAC 등 Kubernetes 실전 운영 가이드
Contents
프로덕션 Kubernetes 운영에 필요한 네트워킹, 스토리지, 배포 전략, 접근 제어를 정리한다.
Kubernetes의 기본 오브젝트(Pod, Deployment, Service)만으로는 프로덕션 환경의 요구사항을 충족하기 어렵다. 외부 트래픽 라우팅, 네트워크 정책, 스토리지 관리, 보안 설정 등 운영에 필요한 고급 기능을 알아야 안정적인 클러스터를 운영할 수 있다.
네트워킹 및 서비스
Service 종류
| 타입 | 접근 범위 | 사용 사례 |
|---|---|---|
| ClusterIP | 클러스터 내부 | 마이크로서비스 간 통신 |
| NodePort | 노드IP:포트 | 개발/테스트 환경 |
| LoadBalancer | 외부 LB | 프로덕션 외부 노출 |
Ingress
HTTP/HTTPS 트래픽에 대한 라우팅 규칙을 정의한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: api-v1
port:
number: 80
- path: /v2
pathType: Prefix
backend:
service:
name: api-v2
port:
number: 80Ingress Controller: Nginx, HAProxy, Traefik, Istio Gateway 등
Namespace
클러스터를 논리적으로 분리하여 리소스를 격리/관리한다.
kubectl create namespace dev
kubectl create namespace prodNetworkPolicy
Pod 간 트래픽 흐름을 세밀하게 제어한다.
podSelector는 정책을 적용할 대상 Pod를, ingress.from은 그 Pod로 들어오는 트래픽을 허용할 출처를 지정한다. 아래 예시는 app: backend Pod가 app: frontend Pod에서 오는 인바운드 트래픽만 받도록 제한한다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend스토리지
Volume vs PV vs PVC
| 개념 | 설명 |
|---|---|
| Volume | Pod 내부 마운트 디렉터리 (emptyDir, hostPath 등) |
| PersistentVolume (PV) | 클러스터 레벨 스토리지 리소스 |
| PersistentVolumeClaim (PVC) | Pod의 스토리지 요청 |
PV/PVC 예시
# PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/my-pv
---
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5GiConfigMap & Secret
# ConfigMap - 일반 설정
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "postgres://db:5432"
LOG_LEVEL: "info"
---
# Secret - 민감 정보
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 인코딩배포 전략
롤링 업데이트 (기본)
maxSurge는 목표 replica 수를 넘겨 추가로 띄울 수 있는 Pod 수, maxUnavailable은 업데이트 중 동시에 중단해도 되는 Pod 수다. 아래처럼 maxUnavailable: 0으로 두면 새 Pod가 준비된 뒤에야 기존 Pod를 내리므로 가용 용량이 줄지 않는다.
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 추가 Pod 허용 수
maxUnavailable: 0 # 동시 중단 허용 수# 배포
kubectl apply -f deployment.yaml
# 롤백
kubectl rollout undo deployment my-deployment
# 히스토리 확인
kubectl rollout history deployment my-deploymentCanary 배포
일부 트래픽(5~10%)만 새 버전에 노출하여 안정성 확인 후 점진 확대
# v1: 9개 replicas
# v2: 1개 replicas (약 10% 트래픽)Service는 엔드포인트 단위로 부하를 분산하므로, replica 비율은 트래픽 분배의 근사값이다. 정밀한 가중치 제어가 필요하면 Ingress 가중치나 서비스 메시(Istio 등)를 쓴다.
Blue/Green 배포
두 환경(Blue/Green)을 동시 운영하고, 트래픽을 한 번에 전환
# Blue 환경 운영 중
# Green 환경에 새 버전 배포 & 테스트
# Service selector를 Green으로 변경StatefulSet
상태를 가지는 애플리케이션(DB, 캐시 등) 배포용
- Pod에 고유한 ID 부여
- 순서 보장 (생성/삭제)
- 고유한 PVC 연결
volumeClaimTemplates는 replica마다 별도 PVC를 생성하는 템플릿으로, 각 Pod가 자신의 영속 스토리지를 갖게 한다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
# ...
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi보안 및 접근 제어
RBAC (Role-Based Access Control)
RBAC는 어떤 사용자나 서비스 계정이 어떤 리소스에 어떤 동작을 할 수 있는지 권한을 제어한다.
# Role - 네임스페이스 내 권한
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# RoleBinding - 사용자에 Role 연결
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: User
name: developer
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.ioClusterRole vs Role
| 종류 | 범위 |
|---|---|
| Role | 특정 네임스페이스 내 |
| ClusterRole | 클러스터 전체 |
Security Context
Pod/컨테이너 수준 보안 설정
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true정리
| 주제 | 핵심 |
|---|---|
| 네트워킹 | Service, Ingress, NetworkPolicy |
| 스토리지 | PV/PVC, ConfigMap, Secret |
| 배포 | Rolling, Canary, Blue/Green, StatefulSet |
| 보안 | RBAC, Security Context |
쿠버네티스 운영의 핵심은 선언적 구성과 자동화이다. YAML 매니페스트로 원하는 상태를 정의하면, 컨트롤러가 현재 상태와의 차이를 감지하고 자동으로 조정한다.