Skip to main content

새로 산 맥북으로 쿠버네티스 클러스터 구축하기 (feat. arm64)

About 6 minDevOpsKubernetesmacOSVagrantArticle(s)blogyozm.wishket.comkubernetesk8s

새로 산 맥북으로 쿠버네티스 클러스터 구축하기 (feat. arm64) 관련

Kubernetes > Article(s)

Article(s)
macOS > Article(s)

Article(s)
Vagrant > Article(s)

Article(s)

새로 산 맥북으로 쿠버네티스 클러스터 구축하기 (feat. arm64) | 요즘IT
태블릿PC에서 주로 쓰이던 arm64 아키텍처가 애플의 M1 노트북에 적용되며 arm64 기반 노트북 시장이 가파르게 성장하기 시작했습니다. 일반 노트북 시장뿐만 아니라 각 클라우드 사에서도 독자적으로 개발한 arm64 기반 컴퓨팅 인스턴스를 출시하고 있습니다. 이러한 흐름에 발맞춰 쿠버네티스 컨트롤 플레인 노드의 구성 요소 또한 arm64 기반을 지원하는 추세입니다. 따라서 나만의 arm64 기반 쿠버네티스 클러스터를 만들어 보며 이러한 변화에 대비할 수 있는 시간을 가져보도록 하겠습니다.

태블릿PC에서 주로 쓰이던 arm64 아키텍처가 애플의 M1 노트북에 적용되며, arm64 기반 노트북 시장이 가파르게 성장하기 시작했습니다.

arm 기반 노트북 시장 성장에 대한 예상치 <br/><출처: <FontIcon icon="fas fa-globe"/>Techpowerup>
arm 기반 노트북 시장 성장에 대한 예상치
<출처: Techpowerupopen in new window>

일반 노트북 시장뿐만 아니라 각 클라우드 사에서도 독자적으로 개발한 arm64 기반 컴퓨팅 인스턴스를 출시하고 있습니다. 성공적인 전환을 통해 효과적으로 TCO(총소유비용)를 절감한 사례들 역시 속속 나오고 있습니다.

대표적인 arm64 기반의 컴퓨팅 인스턴스인 AWS사의 그래비톤 <br/><출처: <FontIcon icon="fa-brands fa-aws"/>AWS>
대표적인 arm64 기반의 컴퓨팅 인스턴스인 AWS사의 그래비톤
<출처: AWSopen in new window>

이러한 흐름에 발맞춰 쿠버네티스 컨트롤 플레인 노드의 구성 요소 또한 arm64 기반을 지원하는 추세입니다. 다양한 컨테이너 이미지 역시 x86-64(amd64)와 함께 arm64를 지원하고 있습니다.

x86-64와 arm64 로고
x86-64와 arm64 로고

따라서 나만의 arm64 기반 쿠버네티스 클러스터를 만들어 보며 이러한 변화에 대비할 수 있는 시간을 가져보도록 하겠습니다.


주요 단계 overview

arm64 기반 쿠버네티스 클러스터를 만드는 과정은 다음과 같이 진행됩니다.

  1. arm64 기반 쿠버네티스 클러스터를 배포하기 위한 소프트웨어 설치하기
  2. 설치한 소프트웨어로 쿠버네티스 클러스터 구성하기
  3. 터미널 프로그램으로 구성된 쿠버네티스 클러스터를 확인하고, 간단한 애플리케이션 배포하기

이처럼 간단한 3단계로도 실제 arm64 기반 쿠버네티스 클러스터를 구성할 수 있습니다. 시작해 볼까요?

쿠버네티스 클러스터 v1.30 로고 <br/><출처: <FontIcon icon="iconfont icon-k8s"/>Kubernetes>


arm64 기반 쿠버네티스 클러스터 구축하기

1. arm64 기반 쿠버네티스 클러스터를 배포하기 위한 소프트웨어 설치하기

손쉽게 설치할 수 있도록 이미 구성이 완료된 깃허브 소스 (sysnet4admin/_Lecture_k8s_learning.kit)open in new window를 클론해서 로컬에 내려받습니다.

git clone https://github.com/sysnet4admin/_Lecture_k8s_learning.kit
#
# Cloning into '_Lecture_k8s_learning.kit'...
# remote: Enumerating objects: 4956, done.
# ...

먼저 내려받은 소스 디렉터리 가운데 ch2/2.4로 이동합시다. 해당 디렉터리에는 arm64 기반 배포를 위한 소프트웨어, 터미널 프로그램 그리고 관련 내용들이 있습니다.

설치해야 하는 소프트웨어는 다음 3가지입니다. 순서대로 설치 과정을 짚어보겠습니다.

  • VM웨어 퓨전 (VMware Fusion)
  • 베이그런트 (Vagrant)
  • 타비 (Tabby)
cd _Lecture_k8s_learning.kit/ch2/2.4 
ll
# 
# total 0
# drwxr-xr-x@ 8 hj staff   256B Jun 11 14:24 k8s-adv/
# drwxr-xr-x@ 6 hj staff   1928 Jun 11 14:24 scripts/
# drwxr-xr-x@ 4 hj staff   128B Jun 11 14:24 tabby-v1.0.207/ 96B Jun 11 14:24 vagrant-v2.4.1/

VM웨어 퓨전(VMware Fusion) 설치

VM웨어 퓨전을 설치하려면 brew install을 그대로 쓸 수도 있습니다. 그러나 호환성 유지를 위해 준비된 rb를 이용해 고정된 v13.5.2 버전의 VM웨어 퓨전을 설치하겠습니다.

brwe install --cask ./vmware-fusion-v13.5.2/vmware-fusion.rb
# 
# ==> Auto-updating Homebrew..
# Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew).
# ==> Downloading
# http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/13.5.2/23775688/uni versal/core/com.vmware.fusion.zip.tar
# ==> Downloading from
# https://softwareupdate.vmware.com/cds/vmw-desktop/fusion/13.5.2/23775688/un iversal/core/com.vmware.fusion.zip.tar
################################################################ 100.0%
# ==> Installing Cask vmware-fusion
# ==> Moving App 'VMware Fusion.app' to '/Applications/VMware Fusion.app'
# ==> Linking Binary 'vmnet-cfgcli' to '/opt/homebrew/bin/vmnet-cfgcli'
# ==> Linking Binary 'vmnet-cli' to '/opt/homebrew/bin/vmnet-cli' 
# ==> Linking Binary 'vmnet-dhcpd' to '/opt/homebrew/bin/vmnet-dhcpd'
# ==> Linking Binary 'vmnet-natd' to '/opt/homebrew/bin/vmnet-natd'
# ==> Linking Binary 'vmnet-netifup' to '/opt/homebrew/bin/vmnet-netifup'
# ==> Linking Binary 'vmnet-sniffer' to '/opt/homebrew/bin/vmnet-sniffer*
# ==> Linking Binary 'vmrest' to '/opt/homebrew/bin/vmrest'
# ==> Linking Binary 'vmrun' to '/opt/homebrew/bin/vmrun'
# ==> Linking Binary 'vmss2core' to '/opt/homebrew/bin/vmss2core*
# ==> Linking Binary 'ovftool' to '/opt/homebrew/bin/ovftool'
# ==> Linking Binary 'vmware-aewp' to '/opt/homebrew/bin/vmware-aewp'
# ==> Linking Binary 'vmware-authd' to '/opt/homebrew/bin/vmware-authd'
# ==> Linking Binary 'vmware-id' to '/opt/homebrew/bin/vmware-id'
# ==> Linking Binary 'vmware-ntfs' to '/opt/homebrew/bin/vmware-ntfs'
# ==> Linking Binary 'vmware-rawdiskAuthTool' to '/ opt/homebrew/bin/vmware-rawdiskAuthTool'
# ==> Linking Binary 'vmware-rawdiskCreator' to '/opt/homebrew/bin/vmware-rawdiskCreator'
# ==> Linking Binary 'vmware-remotemks' to '/opt/homebrew/bin/vmware-remotemks'
# ==> Linking Binary 'vmware-usbarbitrator' to '/opt/homebrew/bin/vmware-usbarbitrator'
# ==> Linking Binary 'vmware-vdiskmanager to '/opt/homebrew/bin/vmware-vdiskmanager'
# ==> Linking Binary 'vmware-vmdkserver' to '/opt/homebrew/bin/vmware-vmdkserver'
# ==> Linking Binary 'vmware-vmx' to '/opt/homebrew/bin/vmware-vmx'
# ==> Linking Binary 'vmware-vmx-debug' to '/opt/homebrew/bin/vmware-vmx-debug'
# ==> Linking Binary 'vmware-vmx-stats' to '/opt/homebrew/bin/vmware-vmx-stats'
# ==> Linking Binary 'vmware-cloneBootCamp' to '/opt/homebrew/bin/vmware-cloneBootCamp
# ==> Linking Binary 'vctl' to '/opt/homebrew/bin/vctl' 3
# ==> Linking Binary 'vmnet-bridge' to '/opt/homebrew/bin/vmnet-bridge'
# Password: 
# vmware-fusion was successfully installed!





































 

설치가 끝난 후에는 반드시 VM웨어 퓨전을 시작하고 개인 사용자 라이센스를 동의해 주셔야 합니다.

VM웨어 퓨전 무료 공지 <br/><출처: <FontIcon icon="fas fa-globe"/>VMware blog>
VM웨어 퓨전 무료 공지
<출처: VMware blogopen in new window>

VM웨어 퓨전

최근, VM웨어를 인수한 브로드컴에서는 VM웨어 퓨전 v13.5.2부터 개인 사용자에게 이를 무료로 제공한다고 발표했습니다. 물론 이전에도 회원 가입만 하면 따로 개인용 라이센스를 발급받아서 입력할 수 있었지만, 전면적인 무료 계획을 발표한 것이죠. 이 글을 발행하는 2024년 7월 기준, arm64 개인 사용자에게는 어느 무엇보다도 VM웨어 퓨전이 편하고 강력한 하이퍼바이저 도구일 것입니다. 따라서 여기서는 VM웨어 퓨전을 사용해서 실습 환경을 구성합니다.

그다음은 유틸리티 설치입니다. 우리는 vagrant-vmware-utility v1.0.22를 설치합니다. 해당 유틸리티는 곧이어 설치할 베이그런트에서 VM웨어에 필요한 기능을 요청할 때 사용합니다.

brwe install --cask ./vagrant-vmware-utility-1.0.22/vagrant-vmware-utility.rb 
# 
# ==> Downloading https://releases.hashicorp.com/vagrant-vmware-utility/1.0.22/vagrant-vmware-utility_1.0.22_darwin_amd64.dmg 
# Already downloaded: /Users/hj/Library/Caches/Homebrew/downloads/3c4fc35e6cba00b55837775a667e140 3d2be10fea8525b75f1beb88b074df283--vagrant-vmware-utility_1.0.22_darwin_amd 64.dmg 
# ==> Installing Cask vagrant-vmware-utility 
# ==> Running installer for vagrant-vmware-utility with sudo; the password may be necessary. 
# installer: Package name is Vagrant VMware Utility 
# installer: Installing at base path / 
# installer: The install was successful. 
# vagrant-vmware-utility was successfully installed!

이렇게 설치한 VM웨어 유틸리티를 서비스 형태로 시작하려면 launchctl을 거쳐 로드해야 합니다. 그러나 문제가 생겼을 때는, 이를 계속 다시 실행해야 할 수도 있습니다. 또한 네트워크 문제인 경우 netstat 명령으로 이를 점검해야 할 수도 있습니다.

따라서 이를 손쉽게 하기 위해 작성한 스크립트 2가지(copy_launchctl-all-vmware-utility.sh, copy_netstat-anvp.sh)를 실행하겠습니다. /usr/local/bin 밑에 명령어 형태로 만들어 두겠습니다.

sudo ./scripts/copy_launchctl-all-vmware-utility.sh
sudo ./scripts/copy_netstat-anvp.sh

해당 스크립트로 생성한 명령은 아래와 같습니다.

netstat-anvp #열려 있는 네트워크 포트 및 정보 확인
# 
# Active Internet connections (including servers)
# Proto Recv-Q Send-Q  Local Address    Foreign Address
# tcp6  0      0       *.49365          *.*
# [생략]
launchctl-<tab>
# 
# launchctl (Interfaces with launchd)
# launchctl-load-vmware-utility (command)     # vmware-utility를 로드함 
# launchctl-reload-vmware-utility (command)   # vmware-utility를 다시 로드함
# launchctl-unload-vmware-utility (command)   # vmware-utility를 로드하지 않은 상태로 되돌림

그다음, vmware-utility를 서비스로 로드하겠습니다. 베이그런트와 정상적으로 소통하기 위함입니다.

launchctl-load-vmware-utility
# 

쿠버네티스 클러스터가 호스트 시스템과 통신할 인터페이스도 추가해야 합니다. 우리는 vf_net_create_vnet2.sh를 실행할 겁니다. 이 스크립트는 VM웨어의 vmnet7 인터페이스를 생성해 호스트와 192.168.1.0 네트워크로 통신할 수 있게 해줍니다.

진행 도중에 일부 인터페이스에서 실패할 수 있는데요. vmnet7을 생성하고 설정을 적용하는 것이 주목적이므로 vmnet7만 문제없다면 괜찮습니다.

sudo ./scripts/vf_net_create_vnet2.sh
# 
# Library Loaded
# vmnetcfg: vnlvnetcfgadd successfully added key: value - VNET_7_DHCP: no
# 
# Library Loaded
# vmnetcfg: vnlvnetcfgadd successfully added key:value - VNET_7_HOSTONLY_SUBNET:192.168.1.0
# 
# Library Loaded
# vmnetcfg: vnlvnetcfgadd successfully added key:value - VNET_7_HOSTONLY_NETMASK:255.255.255.0
# 
# Library Loaded
# vmnetcfg: vnlvnetcfgadd successfully added key:value - VNET_7_NAT:yes
#  
# Library Loaded 
# vmnetcfg: vnlvnetcfgadd successfully added key:value - VNET_7_VIRTUAL_ADAPTER:yes
# 
# Stopped all configured services on all networks
# Backed up existing network settings to backup file "/tmp/vmware.LHp0fq"
# Restored network settings
# Stopped all configured services on all networks
# Enabled hostonly virtual adapter on vmnet1
# Failed to start DHCP service on vmnet1
# Failed to start NAT service on vmnet7
# Enabled hostonly virtual adapter on vmnet7
# Failed to start NAT service on vmnet8
# Enabled hostonly virtual adapter on vmnet8
# Failed to start DHCP service on vmnet8
# Failed to start some/all services

베이그런트(Vagrant) 설치+

베이그런트(Vagrant) 역시 고정 버전을 설치합니다. 지정된 rb를 활용해 v2.4.1의 베이그런트를 설치합니다.

brew install --cask ./vagrant-v2.4.1/vagrant.rb
# 
# ==> Auto-updating Homebrew...
# Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
# ==> Downloading
# https://releases.hashicorp.com/vagrant/2.4.1/vagrant_2.4.1_darwin_arm64.dmg
# Already downloaded:
# /Users/hj/Library/Caches/Homebrew/downloads/4b70740a5b8c3e37fa35305a64490aa c6ab9a1a9155e877c27e82fdff65d61fc--vagrant_2.4.1_darwin_arm64.dmg
# ==> Installing Cask vagrant
# ==> Running installer for vagrant with sudo; the password may be necessary.
# installer: Package name is Vagrant
# installer: Upgrading at base path /
# installer: The upgrade was successful.
# vagrant was successfully installed!

베이그런트가 VM웨어와 정상적으로 통신하려면 vmware-utility 뿐만 아니라 별도 플러그인이 필요합니다. 우리는 vagrant-vmware-desktop 플러그인을 설치하겠습니다. 이 플러그인은 베이그런트 버전에 따라 설치되기 때문에, 따로 이를 고정해 줄 필요는 없습니다.

vagrant plugin install vagrant-vmware-desktop
# 
# Installing the 'vagrant-vmware-desktop' plugin. This can take a few minutes...
# Fetching vagrant-vmware-desktop-3.0.3.gem
# Installed the plugin 'vagrant-vmware-desktop (3.0.3)'!

타비(Tabby) 설치+

마지막으로 쿠버네티스 클러스터 배포 이후, 접속을 도와주는 터미널 프로그램 타비를 설치합니다. 타비 역시 원활한 호환을 위해 rb를 이용해 v1.0.207을 설치합니다.

brew install --cask./tabby-v1.0.207/tabby.rb
#
# ==> Downloading 
# https://github.com/Eugeny/tabby/releases/download/v1.0.207/tabby-1.0.207-macos-arm64.zip
# Already downloaded: 
# /Users/hj/Library/Caches/Homebrew/downloads/6ac0899dd17d84fb668f23226094b67 4bf7f5615155b29ba53a109c4d519e782--tabby-1.0.207-macos-arm64.zip
# ==> Installing Cask tabby
# ==> Moving App 'Tabby.app' to '/Applications/Tabby.app' 
# tabby was successfully installed!

설치를 마쳤나요? 접속 정보를 미리 입력해 둔 파일 (config.yaml)을 복사해 적용하며 따로 입력하는 번거로움을 줄이겠습니다.

cp ./tabby-v1.0.207/config.yaml ~/Library/Application\ Support/tabby

2. 설치한 소프트웨어로 쿠버네티스 클러스터 구성하기

이제 쿠버네티스 클러스터를 구성할 차례입니다. 이 과정을 개략적으로 그리면 다음과 같습니다.

베이그런트, VM웨어 퓨전 그리고 타비의 관계
베이그런트, VM웨어 퓨전 그리고 타비의 관계

가장 먼저 베이그런트에서 VM웨어 퓨전으로 요청할 내용들을 담은 k8s-adv 디렉터리로 이동하겠습니다. 해당 디렉터리의 구성은 다음과 같습니다.

cd k8s-adv/ 
ll
# 
# total 48
# -rw-r--r--@ 1 hj staff   2.3K Jun 11 14:24 Vagrantfile
# -rwxr-xr-x@ 1 hj staff   1.8K Jun 11 14:24 controlplane_node.sh*
# -rwxr-xr-x@ 1 hj staff   738B Jun 11 14:24 extra_k8s_pkgs.sh*
# -rwxr-xr-x@ 1 hj staff   1.4K Jun 11 14:24 k8s_env_build.sh*
# -rwxr-xr-x@ 1 hj staff   1.0K Jun 11 14:24 k8s_pkg_cfg.sh*
# -rwxr-xr-x@ 1 hj staff   166B Jun 11 14:24 worker_nodes.sh*

쿠버네티스 클러스터 구성은 vagrant up 명령으로 시작합니다.

이때 VM웨어 퓨전의 제약으로 화면에 구성을 시작하는 가상 머신이 계속 팝업될 겁니다. 이 부분을 따로 건드릴 필요도, 여기로 접속할 필요도 없습니다. VM웨어 퓨전 상에 구성된 가상 머신을 확인하려고 설정한 옵션 때문에 이렇게 동작할 뿐입니다. vagrant up 모든 과정이 완료되면 아래와 같은 코드를 볼 수 있습니다.

vagrant up
# 
# Bringing machine 'cp-k8s-1.30.1' up with 'vmware_desktop' provider...
# Bringing machine 'w1-k8s-1.30.1' up with 'vmware_desktop' provider...
# Bringing machine 'w2-k8s-1.30.1' up with 'vmware_desktop' provider...
# Bringing machine 'w3-k8s-1.30.1' up with 'vmware_desktop' provider...
# ==> cp-k8s-1.30.1: Box sysnet4admin/Ubuntu-k8s' could not be found.
# Attempting to find and install...
#     cp-k8s-1.30.1: Box Provider: vmware_desktop, vmware_fusion, vmware_workstation
#     cp-k8s-1.30.1: Box Version: >= 0
# ==> cp-k8s-1.30.1: Loading metadata for box sysnet4admin/Ubuntu-k8s'
#     cp-k8s-1.30.1: URL: https://vagrantcloud.com/api/v2/vagrant/sysnet4admin/Ubuntu-k8s
# ==> cp-k8s-1.30.1: Adding box sysnet4admin/Ubuntu-k8s' (v0.8.5) for provider: vmware_desktop (arm64)
#     cp-k8s-1.30.1: Downloading: https://vagrantcloud.com/sysnet4admin/boxes/Ubuntu-k8s/versions/0.8.5/provi ders/vmware_desktop/arm64/vagrant.box
# Progress: 10% (Rate: 1733k/s, Estimated time remaining: 0:04:00)
# ==> cp-k8s-1.30.1: Successfully added box 'sysnet4admin/Ubuntu-k8s' (v0.8.5) for 'vmware_desktop (arm64'! 
# ==> cp-k8s-1.30.1: Cloning VMware VM: 'sysnet4admin/Ubuntu-k8s'. This can take some time... ==> cp-k8s-1.30.1: Checking if box sysnet4admin/Ubuntu-k8s' version '0.8.5' is up to date...
# ==> cp-k8s-1.30.1: Verifying vmnet devices are healthy...
# 
# [중략]
# 
#     w3-k8s-1.30.1: This node has joined the cluster:
#     w3-k8s-1.30.1: * Certificate signing request was sent to apiserver and a response was received.
#     w3-k8s-1.30.1: * The Kubelet was informed of the new secure connection details.
#     w3-k8s-1.30.1:
#     w3-k8s-1.30.1: Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
#     w3-k8s-1.30.1:

3. 터미널 프로그램으로 구성된 쿠버네티스 클러스터를 확인하고, 간단한 애플리케이션 배포하기

배포한 쿠버네티스 클러스터 노드에 접속하려면, 이를 위해 설치한 터미널 프로그램 타비를 실행하면 됩니다.

타비를 처음 실행하면 아래처럼 프로필을 선택할 수 있습니다. 우리는 를 선택할 겁니다.
타비를 처음 실행하면 아래처럼 프로필을 선택할 수 있습니다. 우리는 cp-k8s를 선택할 겁니다.
를 선택한 다음에는 호스트 키 확인을 요청해야 합니다. <FontIcon icon="iconfont icon-select"/>을 누르고 계속 진행합니다.
cp-k8s를 선택한 다음에는 호스트 키 확인을 요청해야 합니다. [허용 후 키 저장]을 누르고 계속 진행합니다.

cp-k8s에 접속했나요? k get nodes 그리고 k get po -A를 입력해 배포가 정상적으로 이루어졌는지 확인합시다.

k get nodes
#
# NAME    STATUS  ROLES          AGE    VERSION
# cp-k8s  Ready   control-plane  9m7s   v1.30.1
# w1-k8s  Ready                  6m31s  v1.30.1
# w2-k8s  Ready                  4m8s   v1.30.1
# w3-k8s  Ready                  2m28s  v1.30.1

k get po -A
#
# NAMESPACE       NAME                                      READY  STATUS             RESTARTS      AGE
# kube-system     calico-kube-controllers-6cdb97b867-hhl9q  1/1    Running            0             8m27s
# kube-system     calico-node-bkgkz                         1/1    Running            0             4m145
# kube-system     calico-node-dk72k                         1/1    Running            0             8m28s
# kube-system     calico-node-h8wp2                         1/1    Running            0             6m37s
# kube-system     calico-node-sbqg8                         0/1    Init:2/3           1 (26s ago)   2m34s
# kube-system     coredns-7db6d8ff4d-6d2mv                  1/1    Running            0             8m27s
# kube-system     coredns-7db6d8ff4d-hj7lg                  1/1    Running            0             8m27s
# kube-system     etcd-cp-k8s                               1/1    Running            1 (9m5s ago)  9m13s
# kube-system     kube-apiserver-cp-k8s                     1/1    Running            1 (9m4s ago)  9m13s
# kube-system     kube-controller-manager-cp-k8s            1/1    Running            1 (9m4s ago)  9m13s
# kube-system     kube-proxy-2hbfv                          1/1    Running            0             2m34s
# kube-system     kube-proxy-4wfzw                          1/1    Running            0             4m14s
# kube-system     kube-proxy-f58wx                          1/1    Running            0             8m28s
# kube-system     kube-proxy-s8pmp                          1/1    Running            0             6m37s
# kube-system     kube-scheduler-cp-k8s                     1/1    Running            1 (9m4s ago)  9m13s
# metallb-system  controller-57cf8fbb89-qntjh               1/1    Running            0             8m27s
# metallb-system  speaker-4z8rb                             0/1    ContainerCreating  0             21s
# metallb-system  speaker-hvxqq                             1/1    Running            0             5m6s
# metallb-system  speaker-mg7pb                             1/1    Running            0             2m36s 
# metallb-system  speaker-q6fk9                             1/1    Running            0             7m53s

로드밸런서 생성에 도움을 주는 MetalLB IP Pool이 정상 동작하는지도 확인해 보겠습니다. k get ipaddresspools.metallb.io -A를 입력하고 아래와 같은 화면이 나오는지 확인하겠습니다. 해당 내용은 접속하고 바로 보이지는 않습니다. cp-k8s 배포를 완료한 다음 약 10분 후에 동작하도록 설계되었죠. 따라서 아래 화면이 나오지 않는다면, 좀 더 기다립니다.

k get ipaddresspools.metallb.io -A
# 
# NAMESPACE       NAME          AUTO ASSIGN  AVOID BUGGY IPS   ADDRESSES
# metallb-system  k8s-svc-pool  true         false             ["192.168.1.11-192.168.1.99"]

다음 단계입니다. 쿠버네티스 클러스터가 arm64 환경에서 정상 동작하는지 확인하기 위해 sysnet4admin/chk-info 컨테이너를 디플로이먼트로 배포하고, 이렇게 배포한 디플로이먼트를 로드밸런서로 노출합니다.

k create deploy chk-info --image=sysnet4admin/chk-info
#
# deployment.apps/chk-info created
k expose deploy chk-info --type=LoadBalancer --port 80
# 
# service/chk-info exposed

배포한 디플로이먼트 형태의 파드와 로드밸런서 서비스도 확인합시다.

k get po,svc
#
# NAME                           READY  STATUS   RESTARTS  AGE
# pod/chk-info-5576c79965-kph92  1/1    Running  0         25s
# 
# NAME                TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)       AGE
# service/chk-info    Load Balancer  10.104.129.5  192.168.1.11  80:31189/TCP  9s
# service/kubernetes  ClusterIP      10.96.0.1                   443/TCP       13m

정말 마지막 단계입니다. 웹 브라우저를 띄우고 로드밸런서 IP인 192.168.1.11을 입력해 봅시다. 아래와 유사한 결과가 나오셨나요?

아무 문제 없나요? 이제 여러분도 arm64 환경에서 동작하는 쿠버네티스 클러스터를 구축한 것입니다!


마치며

지금까지 베이그런트와 VM웨어 퓨전을 활용해 매우 손쉽게 arm64 기반 쿠버네티스 클러스터를 구축해 보았습니다. 글에서는 미리 작성한 Vagrantfile과 여기에서 호출한 내용으로 손쉽게 구현했는데요. 이때 사용한 스크립트 파일을 더 면밀하게 이해한다면, 쿠버네티스를 깊이 있게 학습할 때 큰 도움이 될 것입니다.

시간 여유가 있을 때, (없어도 낼 수 있으면 좋겠지만요) 이렇게 호출한 스크립트와 주석을 보고 쿠버네티스를 깊이 이해해 보는 것은 어떨까요?


이찬희 (MarkiiimarK)
Never Stop Learning.