RuntimeClass

개요

런타임 클래스는 파드가 실행될 때 내부 컨테이너들이 어떤 컨테이너 런타임에서 실행될지 지정하는 오브젝트이다.
가령 노드에 CRI로서 Containerd를 쓰고 있다.
노드의 OCI로는 runc가 있기는 하나, 보안적으로 강화된 Kata container도 있는 상황이다.
이때 일반적인 어플리케이션은 일반적인 runc를 쓰지만, 특정 심화 보안이 요구되는 어플리케이션의 경우에는 kata container를 쓰고 싶은 상황이 있을 수 있다.
이럴 때 런타임 클래스를 여러 개 구성해두어 원하는 목표를 성취할 수 있다.

런타임클래스 오브젝트는 노드의 자원 중 하나라고 생각하여 자원 디렉에 넣었다.

기본 예시

흔히 사용하지 않으니 먼저 예시를 통해 감을 잡자.
일단 런타임 클래스를 사용하기 위해서는 CRI 차원에서 먼저 세팅을 해주어야 한다.

[plugins."io.containerd.cri.v1.runtime".containerd]
  default_runtime_name = "crun"
  [plugins."io.containerd.cri.v1.runtime".containerd.runtimes]
    # crun: https://github.com/containers/crun
    [plugins."io.containerd.cri.v1.runtime".containerd.runtimes.crun]
      runtime_type = "io.containerd.runc.v2"
      [plugins."io.containerd.cri.v1.runtime".containerd.runtimes.crun.options]
        BinaryName = "/usr/local/bin/crun"
    # gVisor: https://gvisor.dev/
    [plugins."io.containerd.cri.v1.runtime".containerd.runtimes.gvisor]
      runtime_type = "io.containerd.runsc.v1"
    # Kata Containers: https://katacontainers.io/
    [plugins."io.containerd.cri.v1.runtime".containerd.runtimes.kata]
      runtime_type = "io.containerd.kata.v2"

containerd의 경우 이런 식으로 세팅을 해준다.[1]
이러면 이름에서 ~~.containerd.runtimes.{핸들러}에 핸들러 부분을 런타임클래스 오브젝트에 명시할 수 있게 된다.

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: kata-class
# CRI 설정에 대응되는 이름을 쓴다.
handler: kata

일단 런타임 클래스 양식은 이런 식으로 쓴다.
위의 kata를 사용하는 예시이다.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  runtimeClassName: kata-class
  ...

그리고 파드에서는 이런 식으로 작성해주면 된다.

양식 작성법

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: kata-class
handler: kata
scheduling:
  nodeSelector:
    kubernetes.io/hostname: worker1
overhead:
  podFixed:
    memory: "120Mi"
    cpu: "250m"
  

쓸 양식이 많지는 않다.[2]
scheduling 필드는 말 그대로 파드가 스케줄링될 때 같이 주입되도록 하는 필드이다.
그렇다고 모든 스케줄링 관련 설정을 넣을 수 있는 건 아니고, 넣을 수 있는 값은 스케줄링 제어#nodeSelector, 테인트, 톨러레이션 밖에 없다.

overhead 필드는 해당 런타임 클래스를 사용함으로 인해 추가적으로 발생하게 될 파드의 오버헤드 값을 넣어주는 필드이다.[3]
보통 파드의 자원이라고 생각하면 단순히 컨테이너가 실행될 때 발생하는 자원만 생각하기 쉽다.
그러나 실상 보면 해당 컨테이너가 실행되는 기반인 런타임도 저마다 자원을 어느 정도 소모하기 마련이다.
VM을 통해 보안을 강화하는 OCI의 경우 일반적인 런타임보다 cpu와 메모리 자원을 더 소모하게 되므로, 이 값을 명시적으로 지정해서 설정을 하는 게 좋다.
이 값은 자원으로서 파드의 자원 requests 양에 합산되어 계산된다.

관련 문서

이름 noteType created
RuntimeClass knowledge 2025-03-19

참고


  1. https://github.com/containerd/containerd/blob/main/docs/cri/config.md ↩︎

  2. https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/runtime-class-v1/ ↩︎

  3. https://kubernetes.io/docs/concepts/scheduling-eviction/pod-overhead/ ↩︎