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 노드 시스템 메트릭

참고 자료