kubernetes - 컨터이너 런타임 & Cgroup

우야·2021년 5월 26일
0

kubernetes에 컨테이너 런타임이 필요한이유?

  • 기본적으로 kubernetes의 동작은 pod에서 이루어지는데,
  • pod내의 container가 실행하기 위해 필요하다.

kubernetes가 컨테이너 런타임과 연동되는 방법

  • 기본적으로, 쿠버네티스는 컨테이너 런타임 인터페이스(CRI)를 사용하여 사용자가 선택한 컨테이너 런타임을 사용한다.
  • 하지만, 런타임을 지정하지 않으면, kubeadm은 잘 알려진 유닉스 도메인 소켓 목록을 검색하여 설치된 컨테이너 런타임을 자동으로 감지한다.

컨테이너 런타임 및 자동으로 감지 할때 사용되는 socket

  • containerd : /run/containerd/containerd.sock
  • CRI-O : /var/run/crio/crio.sock
  • Docker : /var/run/dockershim.sock

컨테이너 런타임을 위한 설정이 필요하다.

전제 : Control group(cgroup)은 프로세스에 할당된 리소스를 제한하는데 사용되는 것인데...

설정이 필요한 이유?

  • Systemd(Linux 시스템 데몬)는 cgroup과의 긴밀한 통합을 통해 프로세스당 cgroup을 할당 하고,
  • 컨테이너 런타임과 kubelet이 cgroupfs를 사용하도록 설정할 수 있다.
  • 이렇게 되면!!!
    • systemd와 함께 cgroupfs를 사용하면 두 개의 서로 다른 cgroup 관리자가 존재하게 된다
    • 만약, kubelet과 도커에 cgroupfs를 사용하고, 나머지 프로세스는 systemd를 사용하도록 노드가 설정된경우 문제가 발생할 수 있음

문제 해결 방법

  • systemd, 컨테이너 런타임, kubelet이 동일한 Cgroup 드라이버를 사용하게 해야한다
  • 컨테이너 런타임과 kubelet이 systemd를 cgroup 드라이버로 사용하도록 설정을 변경하는게 좋음
  • 방법
    • 컨테이너 런타임 : kubeadm을 사용하라.
      • kubeadm은 kubelet의 systemd를 사용한다.
    • kubelet : kubeadm init하는동안 KubeletConfiguration을 사용하고, Configuration안에는 cgroupDriver를 설정할 수 있다.
      # kubeadm-config.yaml
      kind: ClusterConfiguration
      apiVersion: kubeadm.k8s.io/v1beta2
      kubernetesVersion: v1.21.0
      ---
      kind: KubeletConfiguration
      apiVersion: kubelet.config.k8s.io/v1beta1
      cgroupDriver: systemd
    • 참고
      • Docker : native.cgroupdriver=systemd를 설정할 수 있음
profile
Fullstack developer

0개의 댓글