JUST WRITE

AWS EC2 Kubernetes Cluster 설치(1) Kubeadm - containerd 설치 본문

MLOps/Kubernetes

AWS EC2 Kubernetes Cluster 설치(1) Kubeadm - containerd 설치

천재보단범재 2022. 11. 29. 23:58

Kubeadm - containerd 설치

AWS EC2 Kubernetes Cluster 설치

이번 포스팅에서는 AWS EC2 인스턴스 4개에 Kubernetes Cluster를 구성해보았다.

각 인스턴스는 Ubuntu Sever 22.04에 t3.large로 구성하였다.

1개의 Master와 3개의 Worker로 구성하였다.

Kubernetes Cluster를 구성하는 방법은 여러 가지가 있지만 Kubeadm으로 구성하였다.

Kubernetes Cluster 구성에 첫번째인 containerd 설치에 대해 정리하였다.

준비

containerd 설치 전에 몇가지 설정을 하였다.

  • hostname 설정
  • swap off
  • Kernel Module 추가

hostname 설정

Kubernetes node의 hostname을 설정을 해 주는 것이 좋다.

node별로 monitoring할 때 쉽게 구분할 수 있기 때문이다.

# master 설정
$ sudo hostnamectl set-hostname "k8smaster"
$ hostname
k8smaster

# 각 worker별로 설정
$ sudo hostnamectl set-hostname "k8sworker1"
$ hostname
k8sworker1

그리고 각 host설정을 해준다.

# 각 node별로 설정
$ sudo vi /etc/hosts

${master ip} k8smaster
${worker1 ip} k8sworker1
${worker2 ip} k8sworker2
${worker3 ip} k8sworker3

swap off

Kubernetes Cluster에 쓰이는 node의 swap memory를 쓰지 않도록 off 해준다.

node의 자원(CPU, Memory 등)을 최대한 100% 활용하는 것이 중요하다.

자세한 사항은 아래 Kubernetes Github issue에서 확인할 수 있다.

 

Kubelet/Kubernetes should work with Swap Enabled · Issue #53533 · kubernetes/kubernetes

Is this a BUG REPORT or FEATURE REQUEST?: Uncomment only one, leave it on its own line: /kind bug /kind feature What happened: Kubelet/Kubernetes 1.8 does not work with Swap enabled on Linux Machin...

github.com

아래 명령어로 swap off를 할 수 있다.

$ sudo swapoff -a
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Kernel Module 추가

Kubernetes에 필요한 Kernel Module과 Kernel parameter를 추가한다.

# kernel module 추가
$ sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
$ sudo modprobe overlay
$ sudo modprobe br_netfilter

# kernel module 추가 확인
$ lsmod | grep -E 'br_netfilter|overlay'
br_netfilter           32768  0
bridge                307200  1 br_netfilter
overlay               151552  0

# kernel parameter 추가
$ sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1

# 재부팅 없이 kernel parmeter reload
$ sudo sysctl --system

containerd 설치

containerd 설치에 앞서 Kubernetes Cluster node에 필요한 부분을 설정하였다.

이제 containerd를 설치한다.

OS 버전에 맞는 containerd binary 파일을 다운로드한다.

$ wget https://github.com/containerd/containerd/releases/download/v1.6.9/containerd-1.6.9-linux-amd64.tar.gz
$ sudo tar Cxzvf /usr/local containerd-1.6.9-linux-amd64.tar.gz

containerd를 service로 등록한다.

$ sudo mkdir -p /usr/local/lib/systemd/system
$ sudo wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service

# service 등록
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now containerd
$ systemctl status containerd
● containerd.service - containerd container runtime
     Loaded: loaded (/usr/local/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-11-30 14:48:04 UTC; 28s ago
       Docs: https://containerd.io
    Process: 23185 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 23189 (containerd)
      Tasks: 8
     Memory: 12.6M
        CPU: 243ms
     CGroup: /system.slice/containerd.service
             └─23189 /usr/local/bin/containerd

Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675319934Z" level=info msg=serving... address=/run/containerd/>
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675401705Z" level=info msg="Start subscribing containerd event"
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675473936Z" level=info msg="Start recovering state"
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675557757Z" level=info msg="Start event monitor"
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675645698Z" level=info msg="Start snapshots syncer"
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675664199Z" level=info msg="Start cni network conf syncer for >
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675681989Z" level=info msg="Start streaming server"
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.675989533Z" level=info msg=serving... address=/run/containerd/>
Nov 30 14:48:04 k8sworker1 containerd[23189]: time="2022-11-30T14:48:04.676143995Z" level=info msg="containerd successfully booted in >
Nov 30 14:48:04 k8sworker1 systemd[1]: Started containerd container runtime.

runc와 CNI plugin을 설치한다.

runc와 CNI가 무엇인지는 따로 포스팅하도록 하겠다.

# runc 설치
$ wget https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
$ sudo install -m 755 runc.amd64 /usr/local/sbin/runc

# CNI plugin 설치
$ wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
$ sudo mkdir -p /opt/cni/bin
$ sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

마지막으로 containerd를 CRI런타임으로 사용하기 위해 설정을 한다.

config.toml파일을 통해 설정할 수 있다.

아래 SystemdCgroup을 false에서 true로 변경해준다.

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
$ sudo mkdir -p /etc/containerd
$ sudo containerd config default | sudo tee /etc/containerd/config.toml
$ sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 설정 변경 후 containerd 재시작
$ sudo systemctl restart containerd

containerd 설치가 완료된다.

이 작업을 Kubernetes Cluster 각 node별로 해준다.

다음 포스팅에서는 Kuberentes Cluster Master와 Worker 세팅을 정리하겠다.

[참고사이트]

728x90
반응형
Comments