K8s 컨테이너 런타임

1 개요[ | ]

Crystal Clear action info.png 작성 중인 문서입니다.
컨테이너 런타임
Container Runtimes

https://kubernetes.io/docs/setup/production-environment/container-runtimes/


Note

Dockershim은 Kubernetes 프로젝트에서 릴리스 1.24부터 제거되었습니다. 자세한 내용은 Dockershim 제거 FAQ를 참조하세요.

각 클러스터 노드에 컨테이너 런타임을 설치해야만 파드를 실행할 수 있습니다. 이 페이지에서는 노드 설정에 필요한 작업과 관련된 내용을 설명합니다.

Kubernetes 1.30에서는 Container Runtime Interface (CRI)를 준수하는 런타임을 사용해야 합니다.

자세한 내용은 CRI 버전 지원 정보를 참조하세요.

이 페이지에서는 Kubernetes에서 몇 가지 일반적인 컨테이너 런타임을 사용하는 방법에 대해 설명합니다.

Note

Kubernetes v1.24 이전 릴리스에서는 dockershim이라는 컴포넌트를 사용하여 Docker Engine과 직접 연계를 제공했습니다. 이 특별한 직접 연계는 더 이상 Kubernetes의 일부가 아닙니다(v1.20 릴리스에서 이 제거가 발표되었습니다). 이 제거가 사용자에게 미치는 영향을 이해하려면 Dockershim 제거 영향도 확인하기를 읽어보세요. dockershim을 사용하는 것에서의 마이그레이션에 대해 알아보려면 dockershim으로부터 마이그레이션을 참조하세요.

Kubernetes v1.30 이외의 버전을 사용 중인 경우 해당 버전의 문서를 확인하세요.

2 전제조건 설치 및 설정[ | ]

2.1 네트워크 설정[ | ]

기본적으로, 리눅스 커널은 인터페이스 간에 IPv4 패킷이 라우팅되는 것을 허용하지 않습니다. 대부분의 Kubernetes 클러스터 네트워킹 구현은 이 설정을 변경합니다(필요한 경우). 그러나 일부는 관리자가 직접 설정해주기를 기대할 수도 있습니다. (또한 일부는 다른 sysctl 매개변수를 설정하거나, 커널 모듈을 로드하는 등의 작업을 기대할 수도 있습니다. 특정 네트워크 구현에 대한 문서를 참조하세요.)

2.2 IPv4 패킷 포워딩 활성화[ | ]

IPv4 패킷 포워딩을 수동으로 활성화하려면 다음 단계를 따르세요:

# 재부팅 후에도 유지되는 sysctl 파라미터 셋업
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# 재부팅 없이 sysctl 파라미터 적용
sudo sysctl --system

net.ipv4.ip_forward 값이 1로 설정되었는지 확인하려면 다음 명령어를 실행하세요:

sysctl net.ipv4.ip_forward

3 cgroup 드라이버[ | ]

리눅스에서, 컨트롤 그룹(cgroups)은 프로세스에 할당된 자원을 제약하기 위해 사용됩니다.

kubelet과 기본 컨테이너 런타임은 파드와 컨테이너에 대한 리소스 관리(예: CPU/메모리 요청 및 제한)를 강제하기 위해 컨트롤 그룹과 인터페이스해야 합니다. 컨트롤 그룹과 인터페이스하기 위해, kubelet과 컨테이너 런타임은 cgroup 드라이버를 사용해야 합니다. kubelet과 컨테이너 런타임이 동일한 cgroup 드라이버를 사용하고 동일하게 설정하는 것이 중요합니다.

사용가능한 두 가지 cgroup 드라이버는 다음과 같습니다:

3.1 cgroupfs 드라이버[ | ]

cgroupfs 드라이버는 kubelet의 기본 cgroup 드라이버입니다. cgroupfs 드라이버를 사용하면, kubelet과 컨테이너 런타임이 직접 cgroup 파일 시스템과 인터페이스하여 cgroup을 구성합니다.

systemd가 init 시스템일 때는 cgroupfs 드라이버를 사용하는 것이 권장되지 않습니다. systemd는 시스템에 단일 cgroup 관리자를 기대하기 때문입니다. 또한 cgroup v2를 사용하는 경우, cgroupfs 대신 systemd cgroup 드라이버를 사용하십시오.

3.2 systemd cgroup 드라이버[ | ]

systemd가 Linux 배포판의 init 시스템으로 선택되면, init 프로세스는 root 컨트롤 그룹(cgroup)을 생성하고 이를 소비하며, cgroup 매니저로 동작합니다.

systemd는 cgroup과 긴밀하게 통합되어 있으며, systemd 유닛마다 하나의 cgroup을 할당합니다. 따라서, cgroupfs 드라이버를 사용하는 상태에서 systemd를 init 시스템으로 사용할 경우, 시스템에는 두 개의 다른 cgroup 매니저가 존재하게 됩니다.

두 개의 cgroup 매니저가 존재하면 시스템에서 사용가능한 자원과 사용중인 자원에 대한 두 가지 서로 다른 뷰가 생성됩니다. 일부 경우에는, kubelet 및 컨테이너 런타임을 위해 cgroupfs를 사용하지만 나머지 프로세스에 대해서는 systemd를 사용하는 노드가 자원 압박 상황에서 불안정해질 수 있습니다.

이 불안정을 완화하기 위한 접근방식은, systemd가 선택된 init 시스템일 때 kubelet과 컨테이너 런타임에 대해 systemd를 cgroup 드라이버로 사용하는 것입니다.

systemd를 cgroup 드라이버로 설정하려면, KubeletConfiguration 옵션의 cgroupDriver를 편집하고 이를 systemd로 설정합니다. 예시:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd

Note

v1.22 이후 버전에서는, 사용자가 KubeletConfiguration 아래의 cgroupDriver 필드를 세팅하지 않으면, kubeadm이 기본적으로 systemd로 세팅합니다.

Kubernetes v1.28에서는 KubeletCgroupDriverFromCRI 기능 게이트가 활성화되고 RuntimeConfig CRI RPC를 지원하는 컨테이너 런타임을 사용하는 경우, kubelet이 런타임에서 적절한 cgroup 드라이버를 자동으로 감지하고, kubelet 설정 내의 cgroupDriver 세팅을 무시합니다.

kubelet의 cgroup 드라이버를 systemd로 설정하는 경우, 컨테이너 런타임의 cgroup 드라이버도 systemd로 설정해야 합니다. 컨테이너 런타임에 대한 문서를 참조하십시오. 예시:

Caution

클러스터에 조인된 노드의 cgroup 드라이버를 변경하는 것은 민감한 작업입니다. kubelet이 하나의 cgroup 드라이버의 의미론을 사용하여 파드를 생성한 경우, 컨테이너 런타임을 다른 cgroup 드라이버로 변경하면 이러한 기존 파드의 파드 샌드박스를 다시 생성할 때 오류가 발생할 수 있습니다. kubelet을 재시작해도 이러한 오류를 해결하지 못할 수 있습니다.

자동화를 통해 이를 실행가능하게 만들었다면, 업데이트된 설정으로 노드를 다른 것으로 교체하거나 자동화를 사용하여 재설치하십시오.

3.3 kubeadm으로 생성한 클러스터의 드라이버를 systemd로 마이그레이션[ | ]

기존 kubeadm으로 관리되는 클러스터에서 systemd cgroup 드라이버로 마이그레이션하려면, cgroup 드라이버를 설정하는 절차를 따르세요.

4 CRI 버전 지원[ | ]

5 컨테이너 런타임[ | ]

5.1 containerd[ | ]

5.2 CRI-O[ | ]

5.3 Docker Engine[ | ]

5.4 Mirantis 컨테이너 런타임[ | ]

6 다음 내용[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}