본문 바로가기

Devops

우당탕탕 쿠버네티스 구축 도전기 - 2

이전 포스팅에서는 서버환경을 구축하는 것을 소개하였습니다.

 

이번에는 하이퍼바이저를 이용하여 쿠버네티스 설치를 위한 마스터, 노드 서버 구성을 진행하고자 합니다.

구성을 앞서 하이퍼바이저가 무엇이고 이를 구성하는 요소에 대해서 간략히 정리하고자 합니다.

 

가상화란?

가상화란 물리적인 하드웨어를 논리적으로 구분하는 것으로 하나의 하드웨어에서 여러 개의 시스템을 효율적으로 사용할 수 있게 해주는 기술입니다.

 

하이퍼바이저(Hypervisor)란?

하이퍼바이저

하이퍼바이저는 프로세서, 메모리, 스토리지와 같은 컴퓨팅 리소스를 풀링하여 가상 머신(VM)에 재할당하는 소프트웨어입니다. 이 기술을 통해 여러 VM을 생성하여 단일 물리 머신에서 실행하는 가상화가 실현될 수 있습니다.

 

 

하이퍼바이저는 크게 Type1 하이퍼바이저와 Type2 하이퍼바이저로 분류된다.

Type1 방식은 Native 혹은 베어메탈 형 하이퍼바이저라고도 불린다. 위 그림에서 볼 수 있듯이 Type1 하이퍼바이저는 베어메탈 하드웨어 위에 직접 설치되어 구동된다. 대표적인 Type1 하이퍼바이저에는 Xen, KVM, XenServer(Citrix), Hyper-V(Microsoft), ESX-i(vmware), Proxmox 등이 있다.

Type2 방식은 Hosted 하이퍼바이저라고 불린다. Type2 하이퍼바이저는 다른 Application과 마찬가지로 Host OS 위에 설치된다. 베어메탈 하드웨어 위에 Host OS가 설치되고, 그 위에 하이퍼바이저가 실행되는 형태인 것이다. 테스트환경을 구성할 때 자주 사용하는 Oracle VirtualBox나 vmware Workstation이 여기에 해당된다.

당연히 Type2 방식이 Host OS라는 하나의 Layer가 더 존재하므로, 성능면에서 Type1이 Type2보다 유리하다. 실제 IDC를 클라우드화 시키는 데 사용되는 하이퍼바이저도 모두 Type1 방식이다.

 

필자는 Proxmox를 사용하고 있으며 이는 두가지 주요 가상화 기술을 모두 지원해 줍니다.

 

LXC(Linux Containers)

LXC는 운영 체제 수준의 가상화 기술로, 호스트 OS의 커널을 공유하면서 독립된 사용자 공간을 제공합니다. 주요 특징은 다음과 같습니다.

 

1  경량화: 전체 OS를 가상화하지 않아 오버헤드가 적습니다.
2  빠른 시작 및 종료: 컨테이너는 거의 즉시 시작되고 종료됩니다.
3  높은 밀도: 단일 호스트에서 많은 수의 컨테이너를 실행할 수 있습니다.
4  리소스 효율성: 호스트 리소스를 효율적으로 사용합니다.

 

KVM(Kernel-based Virtual Machine)

KVM은 전체 하드웨어 가상화를 제공하는 하이퍼바이저로, 다음과 같은 특징을 가집니다.

 

1  완전한 격리: 각 VM은 완전히 독립된 환경에서 실행됩니다.
2  다양한 OS 지원: Windows, Linux 등 다양한 게스트 OS를 실행할 수 있습니다.
3  하드웨어 가속: Intel VT-x 또는 AMD-V를 활용하여 성능을 최적화합니다.
4  유연한 리소스 할당: CPU, 메모리, 스토리지 등을 유연하게 할당할 수 있습니다.

 

필자의 경우는 리소스 소모량이 최대한 적은 구조로 구성하기 위하여 LXC 방식으로 구성을 정하였으며 실제 운영 경우에는 KVM 방식을 사용하는 게 적합하다고 생각합니다.

 

Proxmox 가상화 서버(LXC) 구성

 

1. LXC 템플릿을 다운로드하여 서버 설치 준비를 합니다.

Templates에서 원하는 LXC 패키지를 다운로드할 수 있으며 필자 경우 우분투 24.04 버전을 설치하였습니다.

CT Templates

 

2. Create CT를 클릭하여 생성을 진행해 줍니다.

Create CT

 

3. 설치하는 LXC의 호스트명과 패스워드를 입력해 주고 이전에 설치해 주었던 템플릿을 설정합니다.

LXC General

 

LXC Template

 

4. 순차적으로 디스크 사이즈, CPU 코어, 메모리 크기를 설정해 줍니다.

※ k8s를 설치할 경우 swap 메모리를 미사용 설정이 권장되어 0으로 설정해 주었습니다.

Disks

 

CPU

 

 

5. 네트워크 및 DNS 설정을 진행해 줍니다.

※ 실 서비스 경우 ip, 게이트웨이 고정 할당 세팅을 진행하겠으나 테스트 용도로 만들기에 모든 노드를 설정해 주는 번거로움이 있어 DHCP를 통한 자동할당 설정을 진행하였습니다.

network

 

6. 마지막으로 설정한 정보가 정확히 기입되었는지 확인해 주고 Finish 버튼을 클릭해 줍니다.

Confirm

 

7. 정상적으로 수행이 되면 아래와 같이 LXC 설치가 성공하게 되고 호스트가 설치되는 것을 확인할 수 있습니다.

Create
설치 완료

 

8. 이제 콘솔로 접속하여 ID/PASSWORD를 입력해어 CMD창으로 접속해 줍니다.

※ 기본적으로 호스트네임은 root로 설정되어 있으며 이전에 기입한 패스워드를 통하여 접속해 주세요.

콘솔

 

여기까지 LXC 가상화 호스트 한대를 구성하는 것을 살펴보았습니다. 기본적으로 3대의 호스트를 구성해 주는 것을 권장합니다. 쿠버네티스 설치를 위한 마스터와 두대의 워커노드 구성을 위해서입니다.

 

사양 확인

Master Node 최소 사양 Worker Node 최소 사양
CPU: 2 Core, RAM: 2GB CPU: 1 Core, RAM: 1GB

 

위에 표를 보면 각 노드들의 최소 사양을 확인할 수 있으며 필자 경우 각 노드들을 최소 사양에 맞게 구성하였습니다.

 

쿠버네티스 설치

일단 처음에는 k8s를 설치하고자 하였으나 과정이 복잡하고 리소스 소모량이 커서 k3s 설치로 구성하였습니다. 이 과정에서 발생되는 오류 케이스를 먼저 공유드리고 해결과정도 함께 포함하였습니다.

 

k3s란?
k3s는 Rancher라는 회사에서 만든 경량화된 쿠버네티스 배포판입니다.  k3s는 쿠버네티스와 완전히 호환되며 간편한 설치와 절반의 메모리, 모든 걸 100MB 미만의 바이너리로 제공합니다.

 

위에 설치하였던 hostname기준으로 마스터 노드를 설치하는 작업을 진행하겠습니다.

 

1. 패키지 업데이트와 curl 패키지 설치를 진행해 줍니다.

apt update && apt upgrade && apt install curl

 

2. 패키지 설치가 완료되면 k3s를 설치해 줍니다.

※ 워커 노드는 해당 방식을 수행하지 않으므로 스킵해 줍시다.

curl -sfL https://get.k3s.io | sh -

 

설치를 완료하면 아래와 같이 k3s 실행 로그가 확인됩니다.

 

k3s 서비스 상태를 확인해 보면 실제 active가 아닌 loaded가 되어있는 것을 확인할 수 있습니다.

 

필자의 경우 /var/log/syslog 시스템 로그를 확인하여 /dev/kmsg에 접근하지 못하고 있는 로그를 파악했습니다.

LXC는 컨테이너 환경으로 실제 호스트 OS로부터 제한된 권한을 설정되어 아래와 같은 커널 수준은 접근하지 못하고 있는 것으로 파악했습니다.

 

LXC에서 쿠버네티스를 설치하기 위해서는 추가적인 권한 부여 작업이 필요하여 아래와 같이 진행하였습니다.

 

3. LXC 컨테이너 설정 파일 권한 명령어 추가

 

생성한 LXC 컨테이너의 Config 명령어를 추가해 주세요. 해당 위치는 하이퍼바이저의 /etc/pve/lxc/{컨테이너아이디}을 편집하면 됩니다.

 

lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
lxc.mount.auto: "proc:rw sys:rw"

 

설정 추가

 

lxc.apparmor.profile: unconfined
- AppArmor는 리눅스 보안 모듈 중 하나로, 프로그램마다 접근 권한을 제한합니다.
- unconfined는 AppArmor 보안 정책을 적용하지 않겠다는 의미입니다.

lxc.cgroup.devices.allow: a
- devices.allow: a는 모든 디바이스 접근을 허용합니다

lxc.cap.drop:
- Linux capability는 프로세스가 가질 수 있는 세분화된 권한입니다.
- 이 항목에 아무 값도 없으면, drop 하지 않겠다는 의미로, 즉 기본 권한을 모두 유지한다는 뜻입니다

lxc.mount.auto: "proc:rw sys:rw"
- LXC에서 자동으로 특정 파일 시스템을 마운트 하는 옵션입니다.
- 호스트의 커널 상태나 장치 정보를 직접 조회하거나 조작하려는 목적으로 설정됩니다.

 

4. LXC 구동 스크립트 마운트 파일 설정 추가

 

이제 LXC 컨테이너에 접속하여 아래의 명령어를 수행해 줍니다.

아래 명령어는 컨테이너 reboot 당시 /dev/kmsg에 씸볼릭 링크 만들어 우회하며, 마운트 이벤트가 부모-자식 컨테이너 간 전파 가능하게 설정하는 스크립트입니다.

echo '#!/bin/sh -e
ln -s /dev/console /dev/kmsg
mount --make-rshared /' > /etc/rc.local
chmod +x /etc/rc.local
reboot

 

스크립트를 입력하면 자동으로 reboot 되고 우리가 추가한 명령어가 컨테이너 실행당시 수행됩니다. 이후 /dev 경로를 살펴보면 아래와 같이 kmsg 씸볼릭 링크 디렉터리가 생성된 것을 확인할 수 있습니다.

 

※ 2번을 수행하지 않고 만든 워커노드는 해당 순번까지 완료되면 복제본을 만들어 두기 바랍니다. 워커노드 추가에 따라 해당 작업을 매번 진행하는 번거로움을 가지고 있습니다.

 

5. k3s 정상적으로 구동되는지 확인합니다.

권한 설정을 정상적으로 적용하게 되면 이제 k3s가 정상적으로 구동되는 것을 확인할 수 있습니다.

k3s service status

 

현재 구성된 노드는 마스터만 구성하였기에 아래와 같이 확인됩니다.

 

6. k3s 마스터 노드 토큰 정보를 조회합니다.

해당 토큰 정보는 워커노드와 마스터 노드를 연결하는 데 사용되는 토큰으로 기록하는 것을 권장합니다.

cat /var/lib/rancher/k3s/server/node-token

 

아래부터는 마스터 노드와 워커 노드를 연결하는 작업을 진행하겠습니다.

위에 글에 따라 1, 3, 4번을 수행한 워커 노드용 복제본 LXC를 만들어두고 구동시켜주기를 바랍니다.

 

필자는 아래와 같이 worker 노드를 구성하였습니다.

 

 

워커 노드 연결

아래 명령어를 통하여 마스터 노드에 워커노드를 연결시킬 수 있습니다.

curl -sfL https://get.k3s.io | K3S_URL=https://<MASTER_IP>:6443 K3S_TOKEN=<TOKEN> sh -

 

필자는 두 개의 노드를 생성해서 마스터 노드에 연결해 주는 작업을 진행하였고 정상적으로 등록되어 마스터 노드에서 등록된 노드들을 확인할 수 있었습니다.

노드 연결완료

 

여기까지 하이퍼 바이저를 이용한 LXC 설치와 쿠버네티스 설치 마지막으로 마스터 노드와 워커노드 연결까지 진행해 보았습니다.

명령어를 통하여 pod, service, ingress 등을 조작하는 게 불편해서 다음 마지막 포스팅으로 쿠버네티스 대시보드까지 연동하는 작업을 진행하고자 합니다.

 

두번째 포스팅까지 읽어주셔서 감사합니다.

 

 

참고 문서

https://www.adventuresintech.org/from-zero-to-k3s-on-proxmox-lxc-part-1/

https://s200928.tistory.com/7