쿠버네티스 공식문서를 확인하며 컨테이너 런타임 관련하여 기억해야 하는 부분을 기록한다.
kube-apiserver
나kube-proxy
와 같은 몇몇 구버네티스 컴포넌트들은 클러스터 내에서 컨테이너 이미지를 통해 배포할 수 있다.- 쿠버네티스 컴포넌트들은 가급적 컨테이너 이미지로 실행하는 것을 추천하며, 이를 통해 쿠버네티스가 해당 컴포넌트들을 관리하도록 한다. 컨테이너를 구동하는 컴포넌트(특히 kubelet)는 여기에 속하지 않는다.
- 쿠버네티스 클러스터를 직접 관리하고 싶지 않다면, 인증된 플랫폼과 같은 매니지드 서비스를 선택할 수도 있다. 광범위한 클라우드 또는 베어 메탈 환경에 걸쳐 사용할 수 있는 표준화된/맞춤형 솔루션도 있다.
- 클러스터를 직접 관리하는 경우, 공식적으로 지원되는 쿠버네티스 구축 도구는
kubeadm
이다.
컨테이너 런타임
- 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드는 컨테이너 런타임을 설치해야 한다.
- 쿠버네티스 1.25에서는 컨테이너 런타임 인터페이스(CRI) 요구사항을 만족하는 런타임을 사용해야 한다.
- 쿠버네티스 1.24 이전 릴리즈는
dockershim
이라는 구성 요소를 사용하여 도커 엔진과의 직접 통합을 지원했다. 1.25 릴리즈 부터는 더 이상 쿠버네티스에 포함되지 않는다. - 리눅스에서,
control group(cgroup)
은 프로세스에 할당된 리소스를 제한하는데 사용된다. - 리눅스 배포판의 init 시스템이
systemd
인 경우, init 프로세스는root control group(cgroup)
을 생성 및 사용하는cgroup
관리자로 작동한다. Systemd
는cgroup
과의 긴밀한 통합을 통해 프로세스당cgroup
을 할당한다.컨테이너 런타임
과kubelet
이cgroupfs
를 사용하도록 설정할 수 있으며 systemd와 함께 cgroupfs를 사용하면 두 개의 서로 다른 cgroup 관리자가 존재하게 된다는 뜻이다.- 단일 cgroup 관리자는 할당되는 리소스가 무엇인지를 단순화하고, 기본적으로 사용할 수 있는 리소스와 사용 중인 리소스를 일관성있게 볼 수 있다. 반면 시스템에 두 개의 cgroup 관리자가 있으면, 이런 리소스 두 개의 관점에서 보개 된다.
- 현업에서 사람들은
kubelet
과 도커에cgroupfs
를 사용하고, 나머지 프로세스는 systemd를 사용하도록 노드가 설정된 경우 리소스가 부족할 때 불안정해지는 사례를 보고했다. - 컨테이너 런타임과 kubelet이 systemd를 cgroup 드라이버로 사용하도록 설정을 변경하면 시스템이 안정화되며 도커에 대해 구성하려면,
native.cgroupdriver=systemd
를 설정한다. - 하나의 cgroup 드라이버의 의미를 사용하여 kubelet이 파드를 생성해왔다면, 컨테이너 런타임을 다른 cgroup 드라이버로 변경하는 것은 존재하는 기존 파드에 대해 파드 샌드백스를 재생성할 때 에러가 발생할 수 있다. kubelet을 재시작 하는 것으로는 에러를 해결할 수 없으므로 클러스터에 결합되어 있는 노드의 cgroup 관리자를 변경하는 것은 신중하게 수행해야 한다.
cgroup v2
는 cgroup Linux API의 다음 버전이며 각 컨트롤러마다 다른 계층 대신 단일 계층이 있다.cgroup v1
에 비해 대표적으로 아래와 같이 몇가지 향상된 기능을 제공한다.- API를 더 쉽고 깔끔하게 사용할 수 있다.
- 컨테이너로의 안전한 하위 트리를 위임한다.
- 압력 중지 정보와 같은 새로운 기능을 제공한다.
- cgroup v1과 cgroup v2를 각각 다른 컨트롤러에 사용하는 하이브리드 구성을 지원하지만 쿠버네티스는 모든 컨트롤러를 관리하기 위해 동일한 cgroup 버전을 지원한다.
- systemd가 기본적으로 cgroup v2를 사용하지 않는 경우, 커널 명령줄에
systemd.unified_cgroup_hierarchy=1
을 추가하여 cgroup v2를 사용하도록 시스템을 구성할 수 있다. - cgroup v2로 전환할 때 사용자가 노드 또는 컨테이너 내에서 cgroup 파일 시스템에 직접 접근하지 않는 한 사용자 경험에는 현저한 차이가 없도록 추상화되어야 하며 CRI 런타임에서도 cgroup v2를 지원해야 한다.
- 쿠버네티스 1.25 버전에서는 기본적으로 CRI API 중 v1을 사용하며 컨테이너 런타임이 v1 API를 지원하지 않으면, kubelet은 사용이 중단된 v1 alpha2 API를 사용하도록 설정한다. 쿠버네티스 공식문서에 따르면 대표적으로 아래와 같은 컨테이너 런타임이 있다.
- containerd
- CRI-O
- 도커 엔진
- 미란티스 컨테이너 런타임(MCR): 상용 컨테이너 런타임이며 이전에는 도커 엔터프라이즈 에디션으로 알려져 있다.
참고 자료
'Infrastructure > Kubernetes' 카테고리의 다른 글
[클러스터 아키텍처] 노드 (0) | 2022.10.13 |
---|---|
[K8S] 오브젝트 - 2 (0) | 2022.10.12 |
[K8S] 오브젝트 - 1 (0) | 2022.10.12 |
[K8S] 쿠버네티스란 (0) | 2022.10.12 |
[K8S] 모범 사례 (0) | 2022.10.12 |