본문 바로가기

Tech/[Container] Kubernetes

M4 Pro에서 UTM 설치부터 바닐라 k8s 클러스터(v1.32.1) 구축까지

현재는 Vagrant를 사용하여 5분만에 k8s 실습환경을 구성할 수 있도록 구현했다.

아래 블로그 게시글을 참고하길 바란다.

https://iwantbaobab.tistory.com/590

 

Vagrant로 5분만에 Kubernetes 클러스터 V1.32 구성하기 (Arm64, Apple Silicon Chip) (1) - 자동 구성

Vagrant 개념개념 정리Vagrant : Vagrant는 VM을 효율적으로 관리하기 위한 오픈 소스 툴Vagrant Provisioner(프로비저너) : VM 설정 및 환경 구성을 자동화 해주는 스크립트예시) Shell, Ansible 등Vagrant Provider(프

iwantbaobab.tistory.com

 

Virtualization에 대해서

가상화

가상화(Virtualization)는 클라우드 컴퓨팅의 핵심 기술로, 자원의 논리적 분할, 격리, 동적 할당을 통해 IT 환경을 더욱 유연하고 효율적으로 운영할 수 있도록 돕는다.

기업들은 가상화를 활용하여 비용 절감, 자원 최적화, 보안 강화, 고가용성을 확보하며, 클라우드 환경을 최적화하고 있다.

가상화와 에뮬레이션의 차이

가상화(Virtualization)와 에뮬레이션(Emulation)은 서로 다른 목적을 가진 기술이다.

가상화(Virtualization)는 동일한 CPU 아키텍처에서 여러 개의 독립적인 OS 환경을 실행하는 기술이다.

  • 하드웨어 가속 지원을 받아 높은 성능을 제공할 수 있다.
  • 예시) Mac에서 macOS, Linux, Windows를 실행하는 VMware, VirtualBox, Parallels.

에뮬레이션(Emulation)는 서로 다른 CPU 아키텍처에서 동작하는 소프트웨어를 실행할 수 있도록 변환하는 기술이다.

  • 다른 CPU 아키텍처에 맞는 명령어로 변환이 필요해 오버헤드 이슈가 있다.
  • 예시) Rosetta 2(x86 → ARM), QEMU(x86 → ARM).

가상화와 에뮬레이션 기술은 서로 독립적이지만, 일부 소프트웨어는 두 기술을 혼합하여 활용하기도 한다.

예를 들어, QEMU는 에뮬레이션을 기본으로 하지만, KVM과 결합하여 가상화 성능을 가속할 수 있도록 지원한다.

따라서 어떤 프로그램이 에뮬레이션이고, 어떤 프로그램이 가상화인지 구분할 필요는 없으나 적어도 두 기술이 엄연히 다르다는 점을 명확하게 알고 있자.

가상화의 종류

1) 하드웨어 가상화 (Hardware Virtualization)

물리적 하드웨어를 가상화하여 여러 운영 체제가 동시에 실행 가능하도록 한다.

  • 예시) VMware ESXi, Microsoft Hyper-V, KVM

하이퍼바이저는 가상화 위치와 가상화 방식에 따라서 Type 1 (Baremetal), Type 2 (Hosted) 두 가지 방식으로 구분할 수 있다.

TYPE 1 : Bare-metal(Native) 방식에 대한 설명

하드웨어 위에서 별도의 운영체제 없이 하이퍼바이저가 하드웨어 자원을 직접 제어하는 기술이다.

  • 고성능 및 안정성 : 하이퍼바이저가 OS 없이 직접 하드웨어를 제어하므로 성능이 우수하고 오버헤드가 적다.
  • 보안성 향상 : 게스트 OS가 하드웨어에 접근하지 못하기 때문에 격리 및 보안성이 높다.
  • 설정 복잡도 : 하드웨어 연동을 위한 드라이버 설정이 필요하므로 설정이 비교적 까다롭다.
  • 예시) 기업 환경에서 고성능 서버 가상화 및 클라우드 인프라 구축에 사용
  • 하이퍼바이저 프로그램 : VMware ESXI, Hyper-V, KVM, Xen

TYPE 2 : Hosted 방식에 대한 설명

기존 운영체제 위에서 일반 소프트웨어처럼 설치가 가능하며 OS가 하드웨어를 제어하고, 하이퍼바이저가 VM을 관리하는 방식으로 동작한다.

  • 사용 간편성 : 기존 OS에서 일반 소프트웨어처럼 하이퍼바이저를 설치하면 실행이 가능하다.
  • 성능 저하 가능성 (Host OS 의존성) : OS를 거쳐 하드웨어에 접근하므로 OS의 성능 및 상태에 따라 오버헤드가 발생할 수 있다.
  • 예시) 개발 및 테스트 환경, 개인용 가상화 환경
  • 하이퍼바이저 프로그램 : VMware Workstation, Oracle VirtualBox

가상 머신(VM)은 실행 방식에 따라 전가상화와 반가상화로 나뉜다.

하이퍼바이저는 이러한 VM 가상화 방식을 지원하는 소프트웨어이다.

하이퍼바이저 - 전가상화(Full Virtualization)

전가상화는 하드웨어를 완전히 가상화하여, 게스트 OS가 실제 하드웨어가 아닌 하이퍼바이저를 통해 하드웨어를 간접적으로 사용하는 방식이다.

  • 이를 구현하기 위해 하이퍼바이저가 게스트 OS의 모든 하드웨어 요청을 가로채어 변환(에뮬레이션) 하기 때문에, 게스트 OS를 수정할 필요가 없어 기존 운영체제를 그대로 사용할 수 있다. 하지만 하드웨어 요청을 가로채는 과정에서 성능 오버헤드가 발생할 수 있다.
  • 예시) VMware ESXi, KVM
  • KVM(Kernel-based VM)은 전가상화 방식이지만 리눅스 커널과 통합되어 성능이 뛰어나지만, 가상화 지원이 되는 CPU 사용이 필수적이다.

전가상화 동작 과정

1) 게스트 OS 실행 : 가상 머신(VM)에서 실행 중인 게스트 OS는 실제 하드웨어처럼 동작하려고 한다.

2) 게스트 OS가 CPU 특권 명령 실행 : 게스트 OS는 하이퍼바이저를 인식하지 못하고, 일반적인 OS처럼 특권 명령(IN, OUT, HLT 등)을 실행하려고 한다.

3) 하이퍼바이저가 개입(Trap 발생) : CPU가 가상 환경에서 특권 명령을 직접 실행할 수 없음을 감지하고, 하이퍼바이저에게 제어권을 넘긴다. 이를 ‘트랩 발생’ 이라고 부른다.

4) 하이퍼바이저가 명령어 변환 및 에뮬레이션 : 하이퍼바이저는 소프트웨어적으로 해당 명령을 변환하여 실행하거나, 에뮬레이션을 통해 가상 하드웨어를 흉내낸다.

5) 하드웨어와 실제 동작 수행 : 변환된 명령이 실행된 후 결과를 다시 게스트 OS로 반환한다.

6) 게스트 OS가 실행 결과를 받음 : 명령이 정상적으로 실행된 것처럼 동작한다.

  • 트랩(Trap) 발생과 에뮬레이션(Emulation)으로 인해 성능 오버헤드가 증가
  • CPU의 특권 명령을 직접 실행할 수 없기 때문에, 소프트웨어적으로 변환하는 과정이 필요
  • 특히, I/O 관련 명령어는 빈번하게 발생하므로 성능 저하가 더 심하다.

CPU 특권 명령(Privileged Instructions)

운영체제(OS) 커널이 CPU를 직접 제어하기 위해 사용하는 명령어이다.

  • 일반 응용 프로그램에서는 실행할 수 없고, 가상화 환경에서는 직접 실행이 제한된다.

하이퍼바이저 - 반가상화(Para Virtualization)

반가상화는 하드웨어를 완전히 가상화하지 않아 일부 하드웨어를 그대로 사용할 수 있어 비교적 속도가 빠르다.

  • 게스트 OS의 커널을 수정해 CPU의 특권 명령(Privileged Instruction)을 하이퍼콜(Hypercall)로 변환하는 방식을 사용한다.
  • 따라서 오픈 소스 OS가 아닌 상용 OS(Windows)인 경우 반가상화를 적용하기 어려울 수 있다.
  • 예시) Xen (반가상화 지원)
  • Xen 하이퍼바이저는 반가상화를 지원하지만, 최신 버전에서는 전가상화도 지원하도록 업데이트 됐다.
  • Xen은 반가상화 모드에서는 하드웨어 지원 없이도 동작 가능하지만, 성능을 향상시키기 위해 CPU 가상화 지원(VT-x, AMD-V)을 활용할 수도 있음.
  • 일부 하이퍼바이저의 경우 상용 OS에 대한 디바이스 드라이버를 제공해 반가상화를 사용할 수 있는 경우도 있다.

반가상화 동작 과정

1) 게스트 OS 실행 : 가상 머신(VM)에서 실행 중인 게스트 OS는 하이퍼바이저의 존재를 알고 있다.

2) 게스트 OS가 특권 명령을 실행할 때, 직접 실행하지 않고 하이퍼콜(Hypercall) 요청 전송

  • 하이퍼콜은 디스크 읽기/쓰기, 네트워크 요청 등의 시스템 명령을 실행해야 할 때, 직접 실행하는 대신 하이퍼바이저에게 위임하는 기술을 말한다.

3) 하이퍼바이저가 즉시 명령을 실행 : 변환 과정(에뮬레이션)이 필요하지 않으므로 빠르게 실행 가능하다.

4) 하드웨어와 실제 동작 수행 : 요청한 작업이 수행된다.

5) 하이퍼바이저가 결과를 게스트 OS로 반환

6) 게스트 OS가 실행 결과를 받음 → 성능 오버헤드 없이 빠르게 동작이 완료된다.

  • 트랩(Trap) 발생이 없음 : CPU 명령어 변환 과정이 필요하지 않다.
  • 하이퍼바이저가 명령을 직접 실행 : 성능 오버헤드가 감소한다.
  • I/O 성능이 크게 향상됨 : 디스크, 네트워크 등 빈번한 요청이 빠르게 처리된다.

그럼 현재는 어떤 가상화 방식이 많이 사용될까?

초기에는 반가상화(Para-Virtualization)가 성능 면에서 유리했으나, 최근에는 CPU 가상화 기술(VT-x, AMD-V)이 발전하면서, 전가상화(Full Virtualization)도 성능 저하 없이 실행 가능하다.

  • 현재는 전가상화가 더 널리 사용 : KVM, VMware ESXi 등 대부분의 최신 하이퍼바이저는 전가상화 방식을 채택하고 있다.
  • Xen도 반가상화뿐만 아니라 전가상화도 지원하는 형태로 발전했다.
  • 현재 : 전가상화(Full Virtualization) + CPU 가상화 지원(VT-x, AMD-V) 조합이 표준 가상화 방식

CPU 가상화 기술(VT-x/AMD-V)이 적용된 전가상화 과정

1) 게스트 OS가 특권 명령을 실행 : CPU가 가상 환경임을 인식하고, 직접 실행 가능하도록 최적화한다.

2) 하이퍼바이저가 개입하지 않고, CPU가 직접 가상 머신을 실행 : 트랩이 발생하지 않는다.

3) 하드웨어 수준에서 가상화가 지원돼, 성능 오버헤드 최소화

  • 같은 CPU 아키텍처라면 VT-x, AMD-V를 지원하는 경우, 전가상화 오버헤드는 거의 발생하지 않는다.
  • 하지만, VT-x/AMD-V가 없는 경우, 전가상화에서도 트랩과 에뮬레이션 과정이 필요하여 성능 저하가 발생할 수 있다.

주의! 이 부분부터는 하드웨어 가상화가 아니다.

최근에는 MSA 기반 애플리케이션 개발이 표준화 되기 시작하며, 경량화된 가상화 기술이 요구됐다.

빠른 배포 및 배포 확장성을 요구하는 클라우드 네이티브 환경에서 하이퍼바이저를 이용한 VM 가상화는 너무 느리고 무거웠기 때문이다.

OS 커널을 공유하면서 각 애플리케이션에 필요한 리소스들만 독립적인 컨테이너로 구분하는 컨테이너 가상화 기술이 등장했다.

즉, 컨테이너 가상화는 별도의 하이퍼바이저 설치 없이 컨테이너 엔진 위에서 동작한다.

2) 컨테이너 가상화(Container Virtualization, OS Level Virtualization)

컨테이너 가상화는 하이퍼바이저 없이 운영체제(OS) 커널을 공유하며 애플리케이션 실행 환경(컨테이너)을 분리하는 방식이다.

  • 하나의 운영체제 내에서 독립적인 컨테이너(가상 환경)를 실행하며, 리소스를 가볍게 사용하고 빠르게 배포 가능하다.
  • 하지만, 모든 컨테이너가 동일한 OS 커널을 공유하므로 보안이 상대적으로 취약할 수 있다.
  • 예시: Docker, Kubernetes

OS 이미지

위에서 설명한 가상화 기술을 사용하여 하이퍼바이저 위에서 새로운 OS를 동작시키기 위해서는 OS 이미지가 필요하다.

OS 이미지(OS Image)는 운영체제와 필수 소프트웨어, 설정 값 등이 포함된 실행 가능한 시스템의 복제 디스크 이미지이다. 저장 장치(SSD, HDD 등)의 저장 장치의 전체 내용을 파일로 복제해 재사용 할 수 있도록 만든 것이다.

 

MacOS 환경(ARM64)에서의 UTM 설치 후 VM 생성

VMware Fusion 이나 UTM 을 사용하여 MacOS 환경에서 VM을 구성할 수 있다.

해당 글에서는 UTM을 활용하여 진행할 예정이고, VMware Fusion을 사용하고 싶으면 아래 글을 참고하면 된다.

https://iwantbaobab.tistory.com/550

 

M4 Pro 맥북에서 Ubuntu 실습 환경 구축

구름톤 강의에서 Virtualbox를 활용해 Ubuntu 실습 환경을 구축하는 과정이 있었다.그러나 Virtualbox에서 Arm64를 공식적으로 지원하고 있지 않는다는 것을 확인했다.데모 버전으로는 지원한다고는 하

iwantbaobab.tistory.com

 

UTM 설치 및 VM 셋팅

https://mac.getutm.app/

 

UTM

Securely run operating systems on your Mac

mac.getutm.app

 

사이트 접속 후 Download 버튼을 눌러 쉽게 다운로드 할 수 있다.

 

‘새 가상머신 만들기’ 클릭

‘Virtualize’ 클릭

운영체제 → ‘Linux’ 선택

Boot ISO Image → ‘탐색’ 클릭

아래와 같이 우분투 이미지 선택

필요한 값에 따라 메모리 및 CPU 코어 수 조정

스토리지도 필요한 용량만큼 설정

*시스템에 따라 최소 스토리지 용량 확인 필요

호스트 OS와 공유 폴더 생성 옵션 설정

*필자의 경우 별도로 필요하지 않아 패스하였다.

지금까지 설정한 Guest OS 옵션 값을 보여주는 요약 창

*필자는 VM 이름 정도만 변경하였다.

이제부터는 우분투 OS 이미지를 활용해 가상머신의 디스크에 Ubuntu 리눅스를 설치해 보자

나는 English 를 사용할 예정이다.

각자 원하는 언어를 설정하면 된다.

Update to the new Installer를 선택한다.

여기서 말하는 Installer란 Ubuntu 설치 과정에서 사용되는 설치 프로그램(Ubiquity 또는 Subiquity)을 말한다.

Keyboard Configuration 도 각자 취향에 맞게 설정하면 된다.

나는 English 를 쓸 것이기 때문에 기본 값을 변경하지 않고, Done 을 선택한다.

Ubuntu Server 를 설치할 것이기 때문에 Done 누르면 된다.

DHCP IP가 정상적으로 할당되는지 확인하고, Done 누르면 된다.

Proxy 별도로 설정하지 않을 것이기 때문에 바로 Done 을 누르면 된다.

내가 사용할 미러링 서버를 선택하는 곳이다.

한국 ISP 업체를 사용하므로 http://kr.ports.ubuntu.com/ubuntu-ports 서버에 연결하는 선택은 충분히 합리적이다.

Done 을 누르자.

부가적인 디스크 설정하지 않고 통째로 사용할 것이므로 기본 값(Use an entire disk) 그대로 사용하면 된다.

Storage Configuration 도 별도로 커스터마이징 하지 않을 것이기 때문에 기본 값으로 유지하고 Done 을 누르면 된다.

포맷 시 디스크 손실 가능성에 대해 언급하고 있다.

지금 아무것도 설정하지 않은 상태이기 때문에 그냥 Continue 하면 된다.

사용하고 싶은 사용자 이름, 서버 호스트 이름, 비밀번호를 입력하면 된다.

Ubuntu Pro 사용 여부를 묻는 창이다.

사용하지 않는 것이 기본 값이므로 그냥 Continue 하면 된다.

Ubuntu Pro는 기업용 기능을 제공하는 유료 서비스이다.

이번 글에서는 SSH를 활용하여 VM에 접근할 예정이므로 설치하도록 체크하자. *필요 없으면 굳이 설치하지 말자.

서버 관련된 기능은 지금 당장 설치하지 않을 것이기 때문에 Done 을 선택하면 된다.

필요에 따라 추후에 설치할 예정이다.

아래와 같은 Installing 관련 로그가 나오면 정상적으로 초기 설정이 된 것이다.

설치가 완료되면 Reboot Now 버튼이 있으니 재부팅하면 된다.

설치가 다 됐으면 OS 이미지를 VM에 CD/DVD 롬에서 제거하자

UTM의 경우, Mac 호스트 OS와의 클립보드가 호환되지 않으므로 SSH를 통해 원격 접속해서 사용하는 것도 좋은 선택이다.

MacOS 터미널에서 ssh 접속할계정@접속할서버 명령어를 통해서 접속할 수 있다.

필자의 경우 우분투 설치 과정에서 openssh 패키지도 함께 설치했으므로, 바로 접속이 가능했다.

ubuntu 서버의 ip는 ifconfig 명령어로 확인할 수 있으며, net-tools 패키지 설치를 위해 sudo apt -y install net-tools 명령어를 사용해야 한다.

ssh으로 원격 서버에 정상적으로 접속했으면 sudo passwd root 명령어를 통해 root 계정의 패스워드를 설정하고 접속하거나, sudo 명령어를 사용해 아래 과정을 진행하자.

Kubernetes Cluster 구축하기

일단 K8s(Kubernetes) Cluster 가 무엇인지부터 알아보자.

k8s란 여러 개의 컨테이너를 오케스트레이션 해주는 기술이다.

해당 글에서는 k8s에 대한 자세한 기술 설명은 생략하고, 최소한의 기본 개념만 이해할 수 있도록 작성할 예정이다.

k8s 클러스터의 기본적인 아키텍처는 다음과 같다.

 

언뜻보면 복잡해 보일 수 있지만 핵심 원리 자체는 간단하다.

Control Plane 구성요소를 실행하는 노드를 Master 노드라고 하며, 실제 애플리케이션 워크로드(Pod)를 실행하는 노드를 Worker 노드라고 한다.

Master 노드가 적절하게 Worker 노드들을 관리해 주는 역할을 수행한다고 생각하면 된다.

 

기본 개념이 잡혔으면, 아래 과정을 따라 구성을 해보자.

Master Node와 Worker Node를 위한 리눅스 VM을 생성해야 하므로, 위에 정리해둔 내용을 따라 진행할 수 있도록 한다.

나는 k8s-master, k8s-worker1 이름으로 VM을 아래와 같이 셋팅한 상태로 진행했다.

 

VM의 DHCP 대역과 Pod의 네트워크 대역이 겹치는 경우 클러스터 구성 후 라우팅 테이블이 꼬일 수가 있으니 조심해야 한다.

또한 ARM64의 경우, 버전을 미지정한 상태로 설치하면 쿠버네티스 클러스터가 정상적으로 호환되지 않는 경우가 있으니 조심해야 한다.

 

Cluster Master Node

1. 호스트 이름 변경

hostnamectl set-hostname k8s-master

 

2. hosts 파일 설정

3. 스왑 비활성화

swapoff -a

/etc/fstab에서 swap 라인 주석 처리

 

4. 방화벽 비활성화 *실무 환경에서는 관련 포트만 열어주도록 하자. ufw disable

 

5. 필수 커널 모듈 로드

modprobe overlay && modprobe br_netfilter

 

6. sysctl 설정

vi /etc/sysctl.d/kubernetes.conf

*아래는 파일 내용이다.

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

 

sysctl --system

 

7. 컨테이너 런타임 설치 (containerd)

apt update

apt install -y containerd

mkdir -p /etc/containerd

containerd config default > /etc/containerd/config.toml

config.toml 내 SystemdCgroup = true 로 변경

systemctl restart containerd && systemctl enable containerd

 

8. Kubernetes 구성 요소 설치 (v1.32.1)

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo tee /etc/apt/keyrings/kubernetes-apt-keyring.asc > /dev/null

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.asc] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

apt update && apt install -y kubelet=1.32.1-1.1 kubeadm=1.32.1-1.1 kubectl=1.32.1-1.1 && apt-mark hold kubelet kubeadm kubectl

 

9. 클러스터 초기화 (Master Node)

 

kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.32.1

 

사용자 홈 디렉터리

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

 

루트 사용자

echo “export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc

 

10. CNI - Calico 설치

curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -O

kubectl apply -f calico.yaml

 

11. 상태 확인

kubectl get pods -n kube-system

 

Cluster Worker Node

1 ~ 8번까지 동일한 동작 수행

 

1. k8s 클러스터 조인

kubeadm join 172.30.1.100:6443 --token TOKENVALUE --discovery-token-ca-cert-hash sha256:HASHVALUE

위 과정에서 오류가 별도로 발생하지 않으면 정상적으로 클러스터가 구성된 것이다.

해당 명령어들에 대한 설명은 다 생략했고, 온전히 M4 환경 위에서 실습을 위해 빠르게 클러스터를 생성하고 싶은 분들을 위해 준비한 게시글이다.

나중에 스크립트로 최대한 자동화할 예정인데, 그때 관련 명령어들에 대한 설명도 함께 포함 시키겠다.

아래는 클러스터 구성 후 테스트한 Nginx 웹 페이지이다.