본문 바로가기
IT Knowledge/Kubernetes

Kubernetes Cluster 구축(CentOS, CRI-O) Step.2

by Seok. 2021. 12. 15.
반응형

Kubernetes Cluster 구축의 두번째 단계로,

kubernetes를 구동하기 위한 컨테이너 런타임을 구성해야한다. 

컨테이너 런타임이란?
단순히 말해서 런타임은 특정 Object  구동되는 환경이라고 이해하면 된다.
예를 들어 JAVA 런타임이란 Java 어플리케이션이 구동되는 환경이라는 뜻이고,
컨테이너 런타임이란 컨테이너가 구동되기 위한 환경이라는 뜻이다.

구성환경

OS : CentOS 7

kubeadm, kubectl, kubelet : v1.22.3

컨테이너 런타임 : CRI-O


[Kubernetes Cluster 구성 Step]

1) 서버 OS 설정 (마스터, 워커 동일 작업) <링크>

2) Kubernetes 런타임 준비 (마스터, 워커 동일 작업)

3) 클러스터 구성 (마스터, 워커 별도 역할 구성 작업) <링크>

 

  • 2-1) Kubernetes 런타임 설치
  • 2-2) Kubeadm, kubelet, kubectl 설치

2. Kubernetes 컨테이너 런타임 설치(리눅스 환경)

마스터노드(Control Plane)와 워커노드(Worker)에 둘다 동일한 작업이 필요합니다. 

 

기본적으로, 쿠버네티스는 컨테이너 런타임 인터페이스(CRI)를 사용하여 사용자가 선택한 컨테이너 런타임과 인터페이스 합니다. (도커가 아닌 CRI 표준을 사용)

 

런타임을 지정하지 않으면, kubeadm은 잘 알려진 유닉스 도메인 소켓 목록을 검색하여 설치된 컨테이너 런타임을 자동으로 감지하려고 합니다.

 

다음 표는 컨테이너 런타임 및 관련 소켓 경로.

런타임 유닉스 도메인 소켓 경로
도커 /var/run/dockershim.sock
containerd /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock

(쿠버네티스 v.120 이후 컨테이너 런타임으로서 도커를 사용 중단합니다. <링크>)

 

도커와 containerd가 모두 감지되면 도커가 우선시됩니다.

이것이 필요한 이유는 도커 18.09에서 도커만 설치한 경우에도 containerd와 함께 제공되므로 둘 다 감지될 수 있기 때문입니다.

다른 두 개 이상의 런타임이 감지되면, kubeadm은 오류와 함께 종료될것입니다.

kubelet은 빌트인 dockershim CRI 구현을 통해 도커와 통합된다.

자세한 내용은 컨테이너 런타임을 참고한다.

<Kubernetes 컨테이너 런타임 공식 : https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/>

 

Containerd : Docker에서 만든 Container Runtime이 바로 containerd
CRI-O : Red Hat, Intel, SUSE, Hyper, IBM 쪽에서도 OCI 표준에 따라 Kubernetes 전용 Container Runtime을 만들었는데 이것이 CRI-O


컨테이너를 빌드하고, 실행하고 거기에 네트워크, 스토리지, CLI까지 제공해주는 Docker Engine이라는 패키지가 있었는데,
이게 하나의 패키지로 묶여있다보니 여러 불편함들이 생겨났고 이를 해소하기 위해 여러 사람들이 모여 OCI라는 Container Runtime 표준을 만들었고,
이 표준대로 각자 Container Runtime을 만들기 시작했는데 Docker에서 만든 Container Runtime이 바로 containerd ( https://containerd.io/)라는 이야기입니다. (참고로 containerd의 d는 daemon의 d입니다.)


한편, Red Hat, Intel, SUSE, Hyper, IBM 쪽에서도 OCI 표준에 따라 Kubernetes 전용 Container Runtime을 만들었는데 이것이 CRI-O ( https://cri-o.io/)입니다.

containerd와 CRI-O 이 두가지 Container Runtime이 현재 가장 널리 사용되고 있으며 containerd는 Docker Engine에 기본으로 탑재되어 있어서 지금도 Docker를 사용한다면 내부적으로 사용되는 Container Runtime은 containerd 를 사용하게 됩니다.
참고로 `docker build` 커맨드로 생성되는 이미지들 역시 OCI Image Spec을 준수하기 때문에 별도의 작업없이 containerd로 실행시킬 수 있습니다.

출처: <https://kr.linkedin.com/pulse/containerd%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%99%9C-%EC%A4%91%EC%9A%94%ED%95%A0%EA%B9%8C-sean-lee>

저는 여기서 컨테이너 런타임으로 CRI-O를 구성하고, 

cgroup드라이버는 "systemd"를 사용합니다. 

 

2-1) 컨테이너 런타임 CRI-O 구성

Kubernetes 컨테이너 런타임 설치

공식문서 : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/

 

CRI-O 설치 구성

필수 구성요소 설치를 위한 아래내용 구동

# .conf 파일을 만들어 부팅 시 모듈을 로드한다
cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 요구되는 sysctl 파라미터 설정, 이 설정은 재부팅 간에도 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system
 

 

[CentOS]

다음의 운영 체제에서 CRI-O를 설치하려면, 환경 변수 OS 를 아래의 표에서 적절한 필드로 설정한다.

운영 체제 $OS
Centos 8 CentOS_8
Centos 8 Stream CentOS_8_Stream
Centos 7 CentOS_7

그런 다음, $VERSION 을 사용자의 쿠버네티스 버전과 일치하는 CRI-O 버전으로 설정합니다.

예를 들어, CRI-O 1.20을 설치하려면, VERSION=1.20 로 설정. 사용자의 설치를 특정 릴리스에 고정할 수 있습니다.

 

##Refresh repo list
yum repolist -y

## Install CRI-O binaries
##########################


#Operating system   $OS
#Centos 8   CentOS_8
#Centos 8 Stream    CentOS_8_Stream
#Centos 7   CentOS_7


#set OS version
OS=CentOS_7

#set CRI-O
VERSION=1.22


# Install CRI-O
sudo curl -x "http://<프록시서버IP>:<프록시Port>" -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo --insecure
sudo curl -x "http://<프록시서버IP>:<프록시Port>" -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo --insecure

sudo yum install cri-o

출처: <https://arabitnetwork.com/2021/02/20/install-kubernetes-with-cri-o-on-centos-7-step-by-step/>

 

CRI-O를 시작한다.

sudo systemctl daemon-reload
sudo systemctl enable crio --now

 

 

[cgroup 드라이버]

CRI-O는 기본적으로 "systemd" cgroup 드라이버를 사용합니다.

따라서, cgroup으로 systemd 를 사용하시려는 분은 별도의 작업이 필요하지 않습니다. 

 

만약 cgroup 드라이버를 "cgroupfs"으로 전환하려면, /etc/crio/crio.conf 를 수정하거나 /etc/crio/crio.conf.d/02-cgroup-manager.conf 에 드롭-인(drop-in) 구성을 배치합니다.

예를 들면, 

[crio.runtime]
conmon_cgroup = "pod"
cgroup_manager = "cgroupfs"

또한 cgroupfs 와 함께 CRI-O를 사용할 때 pod 값으로 설정해야 하는 변경된 conmon_cgroup 에 유의해야합니다.

일반적으로 kubelet(일반적으로 kubeadm을 통해 수행됨)과 CRI-O의 cgroup 드라이버 구성을 동기화 상태로 유지해야 합니다.

 


2-2) kubeadm, kubelet, kubectl 설치

 

Kubeadm : 클러스터를 부트스트랩하는 명령

Kubelet : 클러스터의 모든 머신에서 실행되고, 컨테이너 Pod 시작과 같은 작업을 수행하는 구성요소

Kubectl : 클러스터와 통신하기 위한 command util

 

1. /etc/yum.repos.d/kubernetes.repo 생성

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
 

2. SELinux 설정

미리 SELinux Disabled 경우, Skip 한다.

# permissive 모드로 SELinux 설정(효과적으로 비활성화)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
 

3. yum 설치

$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

4. 서비스 등록

$ sudo systemctl enable --now kubelet

 

반응형

댓글