Kubernetes v1.36 Haru 완전 가이드: 70개 Enhancement, AI 워크로드 지원, 보안 강화의 모든 것

2026년 4월 22일, Kubernetes 프로젝트는 v1.36을 공식 릴리스했습니다. 코드명 ハル (Haru)는 일본어로 봄(春), 맑은 하늘(晴れ), 먼 지평선(遥か)을 의미합니다. 이번 릴리스는 15주간의 개발 사이클 동안 106개 기업, 491명의 기여자가 참여하여 총 70개의 Enhancement를 담아냈습니다. Stable 졸업 18개, Beta 진입 25개, Alpha 25개로 구성되어 있으며, AI 워크로드 지원 강화, 보안 기능 GA 승격, 관찰성 개선이 핵심입니다.

릴리스 개요

구분수량
Stable (GA)18개
Beta25개
Alpha25개
Deprecation / Removal다수

1. User Namespaces GA: 컨테이너 보안의 새 기준

v1.25부터 Alpha로 시작해 5년의 여정 끝에 v1.36에서 드디어 Stable(GA)로 졸업했습니다. User Namespaces는 컨테이너의 UID/GID를 호스트와 격리하여 컨테이너 내부의 root(UID 0)가 호스트에서는 완전히 권한 없는 사용자로 매핑됩니다. 컨테이너 탈출 공격 시 호스트에서 실질적 권한을 얻을 수 없게 됩니다.

설정은 매우 단순합니다. Pod spec에 hostUsers: false 한 줄만 추가하면 되며, 컨테이너 이미지 변경이나 복잡한 설정이 필요 없습니다.

apiVersion: v1
kind: Pod
metadata:
  name: secure-workload
spec:
  hostUsers: false   # User Namespaces 활성화
  containers:
  - name: app
    image: nginx:latest
    securityContext:
      runAsNonRoot: true
      allowPrivilegeEscalation: false

활성화 후 컨테이너 내부에서는 UID 0으로 실행되지만, 호스트에서는 높은 UID로 매핑되어 격리됩니다.

# 호스트에서 컨테이너 프로세스 확인
$ ps aux | grep nginx
65536  12345  0.0  ...  nginx: master process

# 컨테이너 내부에서는 root로 표시
$ kubectl exec -it secure-workload -- id
uid=0(root) gid=0(root) groups=0(root)

User Namespaces는 containerd 1.7 이상, CRI-O 1.25 이상에서 지원됩니다. 활성화하면 컨테이너 런타임이 자동으로 UID/GID 매핑을 처리합니다.

2. PSI Metrics Stable: 노드 압박 상황을 정밀하게 진단

Pressure Stall Information(PSI) 메트릭이 v1.36에서 Stable로 승격되었습니다. 기존에는 CPU 사용률이나 메모리 사용량 같은 간접 지표에 의존해야 했지만, PSI는 실제로 리소스 부족으로 인해 프로세스가 대기한 시간(stall time)을 직접 측정합니다. 노드가 바쁜 것과, 노드가 실제로 병목인 것을 구별할 수 있습니다.

Linux 커널 4.20 이상이면 PSI가 기본 활성화되며, kubelet이 노드/Pod/컨테이너 단위로 수집합니다.

# 노드 PSI 지표 조회
$ kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/stats/summary" | jq '.node.cpu.psi, .node.memory.psi, .node.io.psi'

# Prometheus에서 조회 가능한 PSI 메트릭
# container_pressure_cpu_stalled_seconds_total
# container_pressure_memory_stalled_seconds_total
# container_pressure_io_stalled_seconds_total

# 특정 컨테이너의 메모리 stall 비율 쿼리 (PromQL)
rate(container_pressure_memory_stalled_seconds_total{container="my-app",namespace="production"}[5m])

PSI 값이 높다면 해당 리소스(CPU/메모리/I/O)가 실제 병목임을 의미하므로, HPA 스케일아웃이나 리소스 request/limit 조정의 트리거로 활용할 수 있습니다. 기존의 CPU 80% 임계값 기반 알람보다 훨씬 정확한 병목 감지가 가능합니다.

3. Dynamic Resource Allocation(DRA) 강화: GPU 워크로드의 혁신

AI/ML 워크로드의 급증에 대응하여 DRA가 v1.36에서 더욱 강화되었습니다. 기존 Device Plugin 방식은 GPU를 정수 단위로만 요청할 수 있어 낭비가 심했지만, DRA는 GPU의 세밀한 속성(메모리 크기, 컴퓨팅 아키텍처 등)을 기반으로 동적으로 할당합니다.

DRA 핵심 구성 요소

# DeviceClass: GPU 클래스 정의 (관리자가 설정)
apiVersion: resource.k8s.io/v1beta1
kind: DeviceClass
metadata:
  name: gpu-high-memory
spec:
  selectors:
  - cel:
      expression: >
        device.attributes["memory"].quantity >= quantity("40Gi") &&
        device.attributes["vendor"].string == "nvidia"
# ResourceClaimTemplate: Pod별 GPU 요청
apiVersion: resource.k8s.io/v1beta1
kind: ResourceClaimTemplate
metadata:
  name: llm-gpu-claim
spec:
  spec:
    devices:
      requests:
      - name: gpu
        deviceClassName: gpu-high-memory
        count: 1
# Pod에서 ResourceClaim 참조
apiVersion: v1
kind: Pod
metadata:
  name: llm-inference
spec:
  resourceClaims:
  - name: gpu
    resourceClaimTemplateName: llm-gpu-claim
  containers:
  - name: inference
    image: my-llm:latest
    resources:
      claims:
      - name: gpu

v1.36에서는 우선순위 기반 대안 요청도 지원합니다. 원하는 GPU가 없을 경우 대안 DeviceClass로 자동 폴백됩니다.

# 우선순위 대안 요청 (v1.36 신기능)
spec:
  devices:
    requests:
    - name: gpu
      firstAvailable:
      - deviceClassName: gpu-a100
      - deviceClassName: gpu-h100
      - deviceClassName: gpu-v100

MIG + DRA 조합: GPU 활용률 극대화

NVIDIA Multi-Instance GPU(MIG)와 DRA를 조합하면 물리적 GPU를 여러 워크로드가 격리된 환경에서 공유할 수 있습니다. A100 GPU 하나를 7개의 MIG 인스턴스로 분할하여 7개의 독립적인 추론 서비스가 동시에 사용하는 구성이 가능합니다. 기존 방식 대비 GPU 활용률을 크게 향상시킬 수 있습니다.

4. Mutating Admission Policies Stable: 웹훅 없는 Pod 변환

Mutating Admission Webhook의 복잡성을 대체하는 Mutating Admission Policies가 v1.36에서 Stable로 승격되었습니다. CEL(Common Expression Language)을 사용해 별도 웹훅 서버 없이 인라인으로 리소스를 변환할 수 있습니다.

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingAdmissionPolicy
metadata:
  name: add-default-labels
spec:
  matchConstraints:
    resourceRules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      operations: ["CREATE"]
      resources: ["pods"]
  mutations:
  - patchType: ApplyConfiguration
    applyConfiguration:
      expression: >
        Object{
          metadata: Object.metadata{
            labels: {
              "environment": "production",
              "managed-by": "platform-team"
            }
          }
        }

웹훅 서버 유지보수 없이 CEL 표현식만으로 Pod 생성 시 기본 레이블, 어노테이션, 사이드카 컨테이너 등을 자동 삽입할 수 있어 플랫폼 팀의 운영 부담이 크게 줄어듭니다. 웹훅 서버의 고가용성 유지, TLS 인증서 관리 등의 운영 오버헤드가 사라집니다.

5. Workload Aware Scheduling(WAS) Alpha: 분산 AI 훈련의 원자적 스케줄링

대규모 LLM 훈련처럼 수십~수백 개의 Pod가 반드시 함께 스케줄되어야 하는 워크로드에서, 일부 Pod만 스케줄되고 나머지는 Pending 상태로 남아 리소스를 낭비하는 Gang Scheduling 문제가 있었습니다. WAS는 PodGroup 개념을 도입해 이를 해결합니다.

# PodGroup 정의: 최소 4개 Pod가 동시에 스케줄되어야 함
apiVersion: scheduling.k8s.io/v1alpha1
kind: PodGroup
metadata:
  name: distributed-training
spec:
  minMember: 4
  minResources:
    cpu: "32"
    memory: "256Gi"
    nvidia.com/gpu: "4"
# Job에서 PodGroup 참조
apiVersion: batch/v1
kind: Job
metadata:
  name: llm-training-job
spec:
  completions: 4
  parallelism: 4
  template:
    metadata:
      labels:
        scheduling.k8s.io/pod-group: distributed-training
    spec:
      containers:
      - name: trainer
        image: pytorch-distributed:latest
        resources:
          limits:
            nvidia.com/gpu: 1
            memory: "64Gi"

4개 Pod 모두 동시에 스케줄할 수 있는 노드가 확보될 때까지 스케줄링이 보류되며, 일부만 실행되어 리소스를 점유한 채 대기하는 상황이 방지됩니다. Kubeflow, Ray, Volcano 같은 ML 플랫폼과의 통합도 용이해집니다.

6. Fine-Grained Kubelet API Authorization Stable

기존에는 모니터링 에이전트가 kubelet 메트릭을 수집하려면 광범위한 nodes/proxy 권한이 필요했습니다. 이 권한은 kubelet의 모든 API에 접근할 수 있어 과도한 권한 부여 문제가 있었습니다. v1.36에서 GA로 승격된 세밀한 kubelet API 인증을 통해 특정 엔드포인트에만 최소 권한을 부여할 수 있습니다.

# 모니터링 에이전트에 metrics 엔드포인트만 허용
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kubelet-metrics-reader
rules:
- apiGroups: [""]
  resources: ["nodes/metrics"]
  verbs: ["get"]
- apiGroups: [""]
  resources: ["nodes/stats"]
  verbs: ["get"]
# nodes/proxy 권한 없이도 메트릭 수집 가능

Prometheus, Datadog, Grafana Agent 등 모니터링 에이전트에 필요한 최소 권한만 부여하여 침해 시 피해 범위를 제한할 수 있습니다.

7. OCI VolumeSource Stable: 이미지를 볼륨으로 마운트

컨테이너 이미지를 메인 이미지에 번들링하지 않고 별도 OCI 이미지로 패키징해 볼륨으로 마운트하는 OCI VolumeSource가 Stable로 승격되었습니다. ML 모델 파일, 설정 번들, 바이너리 도구 등을 이미지와 분리해 독립적으로 버전 관리할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: inference-with-model
spec:
  volumes:
  - name: model-weights
    image:
      reference: "registry.example.com/llama3-weights:70b"
      pullPolicy: IfNotPresent
  containers:
  - name: inference-server
    image: vllm:latest
    volumeMounts:
    - name: model-weights
      mountPath: /models/llama3
      readOnly: true
    env:
    - name: MODEL_PATH
      value: /models/llama3

추론 서버 이미지와 모델 가중치를 분리하면 모델 업데이트 시 서버 이미지를 재빌드할 필요가 없습니다. 동일한 모델을 여러 추론 서버 Pod에서 공유할 수 있어 이미지 레이어 캐시 활용도가 높아지고 저장소 비용도 절감됩니다.

8. 주요 Deprecation 및 제거 사항

Ingress NGINX 공식 Retirement

2026년 3월 24일, Kubernetes SIG Network와 Security Response Committee는 Ingress NGINX의 공식 Retirement를 선언했습니다. CVE-2020-8554 등 지속적인 보안 취약점 문제로 인한 결정입니다. 대안으로 Gateway API 전환을 권장합니다.

# Gateway API로 마이그레이션 예시
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-route
spec:
  parentRefs:
  - name: my-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 8080

Service externalIPs 필드 Deprecated

Service spec의 externalIPs 필드가 Deprecated 되었습니다. 이 필드는 중간자 공격(MITM)에 악용될 수 있는 보안 취약점(CVE-2020-8554)이 있어 향후 버전에서 제거될 예정입니다. LoadBalancer 타입 Service나 Gateway API로의 마이그레이션을 권장합니다.

업그레이드 전 점검 사항

v1.36으로 업그레이드하기 전 다음 사항을 반드시 점검하십시오.

  • Ingress NGINX를 사용 중이라면 Gateway API 마이그레이션 계획 수립
  • Service에 externalIPs를 사용 중이라면 대안 검토
  • PSI 메트릭 수집을 위해 노드 커널 버전 확인 (4.20 이상 필요)
  • User Namespaces 활성화 시 컨테이너 런타임 지원 여부 확인 (containerd 1.7+, CRI-O 1.25+)
# 현재 Kubernetes 버전 확인
$ kubectl version --short

# 노드 커널 버전 확인 (PSI 지원 여부)
$ kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"	"}{.status.nodeInfo.kernelVersion}{"
"}{end}'

# 컨테이너 런타임 버전 확인
$ kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"	"}{.status.nodeInfo.containerRuntimeVersion}{"
"}{end}'

정리

Kubernetes v1.36 Haru는 단순한 기능 추가를 넘어 AI/ML 워크로드 지원 체계화, 컨테이너 보안 기반 강화, 운영 복잡도 감소라는 세 가지 방향성을 명확히 보여줍니다. User Namespaces와 Mutating Admission Policies의 GA 승격으로 보안과 자동화 기반이 안정화되었고, DRA와 Workload Aware Scheduling은 대규모 GPU 클러스터 운영의 효율을 끌어올립니다. PSI 메트릭 Stable로 노드 수준의 정밀한 리소스 병목 진단도 가능해졌습니다. Ingress NGINX Retirement와 externalIPs Deprecation은 보안 강화 의지의 표현으로, 마이그레이션 계획을 조기에 수립하는 것이 중요합니다.