DevOpsKubernetesk3sk0s컨테이너오케스트레이션보안
쿠버네티스 생태계 리서치 — k8s·k3s·k0s·MicroK8s 비교
풀 k8s부터 경량 배포판(k3s, k0s, MicroK8s)까지 — 환경별 선택 기준, 보안 고려사항, 실전 구축 팁을 정리합니다.
VWV2026-04-2510분 읽기
쿠버네티스, 왜 이렇게 많은 배포판이 있나
Kubernetes(k8s)는 구글이 오픈소스로 공개한 컨테이너 오케스트레이션 플랫폼입니다. 엔터프라이즈 환경부터 IoT 엣지까지 적용 범위가 넓어지면서, 리소스 요구사항과 운영 복잡도를 낮춘 경량 배포판들이 등장했습니다.
[풀 k8s] control plane 3노드 + etcd HA — 프로덕션 대규모
[k3s] 단일 바이너리, 512MB RAM — 엣지/온프레미스 소규모
[k0s] 제로 의존성 단일 바이너리 — 에어갭(망분리) 환경
[MicroK8s] Ubuntu snap 패키지 — 로컬 개발, Ubuntu 생태계
[Kind / Minikube] 로컬 테스트 전용
배포판별 비교
| 항목 | 풀 k8s (kubeadm) | k3s | k0s | MicroK8s |
|---|---|---|---|---|
| 최소 RAM | 2GB+ (HA: 6GB+) | 512MB | 500MB | 540MB |
| 설치 복잡도 | 높음 | 낮음 | 낮음 | 낮음 |
| etcd 내장 | 별도 구성 | SQLite/etcd | etcd/kine | dqlite |
| 아키텍처 | amd64/arm64 | amd64/arm64/armv7 | amd64/arm64 | amd64/arm64 |
| 에어갭 지원 | 가능 (수동) | 가능 (패키지) | 기본 지원 | 제한적 |
| 관리 주체 | CNCF | Rancher (SUSE) | Mirantis | Canonical |
k3s 상세
설치
# 서버(컨트롤 플레인) 노드
curl -sfL https://get.k3s.io | sh -
# 에이전트(워커) 노드 — K3S_TOKEN은 서버의 /var/lib/rancher/k3s/server/node-token
curl -sfL https://get.k3s.io | K3S_URL=https://server-ip:6443 \
K3S_TOKEN=<token> sh -
# kubectl 설정
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes
k3s가 빠진 것들 (vs 풀 k8s)
제거된 컴포넌트
- alpha/legacy API 제거
- 클라우드 공급자 통합 제거 (AWS/GCP 등)
- 스토리지 드라이버 일부 제거
기본 포함으로 교체된 것
- Flannel (CNI) — Calico/Cilium으로 교체 가능
- Traefik (Ingress) — Nginx 등으로 교체 가능
- Local-path provisioner (Storage)
- CoreDNS
k0s 상세
에어갭(인터넷 단절) 환경에서 특히 유용합니다. 금융권 망분리 환경이나 국방 폐쇄망에서 k8s 클러스터를 구축할 때 k0s가 현실적인 선택지입니다.
# 단일 노드 설치
curl -sSfL https://get.k0s.sh | sudo sh
sudo k0s install controller --single
sudo k0s start
# kubeconfig 추출
sudo k0s kubeconfig admin > ~/.kube/config
에어갭 설치
# 온라인 환경에서 번들 다운로드
k0s airgap bundle-artifact --arch amd64
# 오프라인 환경으로 전송 후 설치
sudo k0s install controller --airgap-image-bundle k0s-airgap-bundle-v1.x.y+k0s.z-amd64.tar
쿠버네티스 보안 고려사항
실제 클러스터 운영에서 자주 놓치는 보안 항목입니다.
1. RBAC 최소 권한
# 지나치게 넓은 권한 — 금지
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: bad-example
subjects:
- kind: ServiceAccount
name: my-app
roleRef:
kind: ClusterRole
name: cluster-admin # 절대 금지
---
# 올바른 방식 — 필요한 권한만
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
2. Pod Security Standards
# Namespace 레벨 보안 정책 적용
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
# SecurityContext 설정 예시
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
3. 네트워크 정책 (Zero Trust)
앞서 Zero Trust 포스트에서 다룬 NetworkPolicy를 k3s/k0s 환경에서도 적용할 수 있습니다. k3s 기본 CNI인 Flannel은 NetworkPolicy를 지원하지 않아 Calico 또는 Cilium으로 교체가 필요합니다.
# k3s 설치 시 Flannel 비활성화 + Calico 사용
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-backend=none \
--disable-network-policy" sh -
# Calico 설치
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
4. 시크릿 관리
# 기본 k8s Secret은 base64 인코딩일 뿐 — 암호화 아님
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d
# etcd at-rest 암호화 설정 (kubeadm / k0s)
# /etc/kubernetes/encryption-config.yaml 작성 후 API 서버에 적용
외부 시크릿 관리 솔루션:
| 솔루션 | 특징 |
|---|---|
| HashiCorp Vault | 가장 성숙, 다양한 백엔드 |
| External Secrets Operator | AWS/GCP/Azure Secrets Manager 연동 |
| Sealed Secrets | Git에 암호화된 시크릿 저장 가능 |
환경별 선택 기준
| 환경 | 추천 | 이유 |
|---|---|---|
| 클라우드 프로덕션 (대규모) | EKS / GKE / AKS | 관리형, SLA 보장 |
| 온프레미스 프로덕션 | kubeadm + RKE2 | 풀 k8s, 엔터프라이즈 지원 |
| 엣지 / 소규모 서버 | k3s | 가벼움, 빠른 설치 |
| 에어갭 / 망분리 환경 | k0s | 에어갭 번들, 의존성 없음 |
| 로컬 개발·테스트 | Kind / Minikube | Docker 위에 실행 |
| Ubuntu 데스크탑/랩 | MicroK8s | snap으로 1분 설치 |
모니터링 스택
k3s/k0s 환경에서 자주 쓰는 경량 모니터링 구성입니다.
# kube-prometheus-stack (Helm)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set grafana.adminPassword=changeme
| 컴포넌트 | 역할 |
|---|---|
| Prometheus | 메트릭 수집·저장 |
| Grafana | 대시보드 시각화 |
| Alertmanager | 알림 라우팅 |
| Node Exporter | 노드 시스템 메트릭 |