안녕하세요! 오늘부터 인프라 환경 구축을 위한 실습을 책을 보며 함께 진행해보려고 합니다.
중요한 포인트나, 해결해야 할 버그가 있다면 포스팅을 하게 될 것 같은데
혹시라도 책을 읽으면서 진행이 막히거나, 함께 쿠버네티스를 공부하고 싶으신 분이라면
참고해주시면 감사하겠습니다 :)
참고로 k8s란 kubernetes 중 k'ubernete's 사이 알파벳 8개를 줄여 부른다는 의미에서 'k8s'입니다!
Mac OS 2021년 1월 이후 VBox가 최신 버전이 아니면 잘 작동하지 않는 이슈가 있습니다. vagrant up
, vagrant ssh
등에서 정상적으로 진행되지 않는 문제가 있어 책에서 진행된 호환성(VBox 6.1.12)가 아닌 최신 버전으로 진행합니다.
진행하다보니 책은 window 기준으로 작성되어있고, 책과 다르게 mac에서 실습이 가능하게 작성되었습니다. VM 세션을 다루는 부분을 제외하면 크게 다르지 않습니다만 책을 보고 실습하신다면 window에서 진행하시길 추천드립니다.
brew install -cask virtualbox
저는 허용 후에도 계속해서 설치가 실패했습니다. 그래서 아래와 같이 진행했습니다.
1) 컴퓨터에 남아있는 VirtualBox 잔존파일 삭제
sudo /Volumes/VirtualBox/VirtualBox_Uninstall.tool
2) Application 폴더 확인 : 폴더를 확인해보니 응용 프로그램이 설치되어 있었습니다. 클릭해보니
실행이 되어 일단 넘어갑니다.
$ cd Desktop
$ mkdir vagrant
$ cd vagrant
$ vagrant init
3. 다양한 문서 에디터 툴(vim,vs code 등)을 이용하여 Vagrantfile(베이그런트 스크립트 파일)을 열고 config.vm.box="base"
라는 내용이 있는지 확인합니다.
4. 아무것도 변경하지 않고 닫은 후(:q!) vagrant up
(Vagrant파일을 읽어 프로비저닝 진행)을 실행합니다.
5. 그럼 이미지명이 "base"로 명시되어 있으나 해당 이미지를 찾지 못해 에러가 발생합니다.
6. 가상 이미지를 내려받습니다. 이미지 확인
7. 검색창에 sysnet4admin
을 입력하면 저자가 올려 둔 파일을 볼 수 있습니다. 이 가운데 sysnet4admin/CentOS-k8s
를 확인합니다.
8. 앞서 확인했던 Vagrantfile을 다시 열어 config.vm.box="sysnet4admin/CentOS-k8s"
로 변경하고 저장합니다.
9. 다시 vagrant up
을 실행하고 해당 가상 머신 이미지를 내려받는지 확인합니다.
마지막 단계에서 발생하는 에러(Vagrant was unable to mount Virtualbox shared folders)는 Virtualbox의 게스트 에디션이 설치되지 않아서 발생합니다. 이 책에선 필요하지 않아 설치하지 않습니다.
저는 해당 에러가 아닌
```There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
Command: ["startvm", "04ed37d7-f5d0-4887-9c6b-7c3307d2e9b4", "--type", "headless"]
Stderr: VBoxManage: error: The virtual machine 'vagrant_default_1630399327933_10351' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine```
이러한 에러가 발생하여, 아래와 같은 방법으로 해결했습니다.
* 1. brew install -cask virtualbox
vagrant ssh
명령을 실행해 CentOS에 ssh 접속을 합니다.vagrant destroy -f
를 실행합니다. -f 옵션은 가상머신을 강제 종료하는 옵션입니다.이ㄴ에는 Vagrantfile을 수정해 원하는 구성이 자동으로 CentOS에 입력되도록 해봅시다.
베이그런트 파일을 다음과 같이 수정하고 저장합니다. 기존의 주석은 삭제해도 무방합니다.
# 에디터에 현재 파일이 루비임을 인식하게 하는 호환코드, ft는 file type의 약자이며 해당 내용은 실행에 아무런 영향을 끼치지 않음
# -*- mode: ruby -*-
# vi: set ft=ruby :
# "2"는 베이그런트에서 루비로 코드를 읽어 들여 실행할 떄 작동하는 API 버전, do |config|는 베이그런트 설정의 시작을 알림
Vagrant.configure("2") do |config|
# VBox에서 보이는 가상 머신을 "m-k8s"로 정의, do |cfg|를 추가해 원하는 설정으로 변경!, do |이름|으로 시작한 작업은 end로 종료한다.
config.vm.define "m-k8s" do |cfg|
# 기본값 config.vm.box를 do |cfg|에 적용한 내용을 받아 cfg.vm.box로 변경한다.
cfg.vm.box = "sysnet4admin/CentOS-k8s"
# 베이그런트의 프로바이더가 VBox라는 것을 정의. 프로바이더: 베이그런트를 통해 제공되는 코드가 실제로 가상 머신으로 배포되게하는 소프트웨어
cfg.vm.provider "virtualbox" do |vb| # 버추얼박스에서 필요한 설정 정의
# VBox에 생성한 가상 머신 이름, CPU 수, 메모리 크기, 소속된 그룹 명시, end로 설정을 종료한다
vb.name = "m-k8s(github_SysNet4Admin)"
vb.cpus = 2
vb.memory = 2048
vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
end
# 가상머신 자체에 대한 설정, do |cfg|에 속한 작업이다.
cfg.vm.host_name = "m-k8s"
# 호스트 전용 네트워크, eth1 인터페이스를 호스트 전용으로 구성하고 IP를 지정한다
cfg.vm.network "private_network", ip: "192.168.1.10"
# ssh 통신은 호스트 60010번을 게스트 22번으로 전달되도록 구성, 포트 중복을 대비해 auto_correct: true를 설정한다(자동변경)
cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
# 호스트(PC or 노트북)와 게스트(가상 머신) 사이에 디렉토리 동기화가 이뤄지지 않게 설정
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
end
end
수정한 Vagrantfile로 가성 머신을 생성합니다.
vagrant ssh
를 이용해 가상 머신에 접속합니다.
CentOS에서 ip addr show eht1
명령을 입력해 IP가 제대로 설정됐는지 확인합니다.
CentOS 접속을 종료합니다. exit
Vagrantfile에 셸 프로비전을 추가합니다.
Vagrantfile이 위치한 디렉토리에서 스크립트를 다음과 같이 작성하고 install_pkg.sh라는 이름으로 저장합니다.
Vagrantfile에서 호출한 install_pkg.sh로 입력해 둔 배시 셸 파일을 실행해 EPEL(Extra Packages for Enterprise Linux) 저장소와 코드 하이라이트를 위한 Vim의 추가 기능을 설치합니다.
zsh(명령 프롬프트)에서 vagrant provision 명령으로 추가한 프로비전 구문을 실행합니다.
...[생략]
CentOS에 접속합니다. vagrant ssh
yum repolist
명령으로 추가한 EPEL 저장소가 구성됐는지 확인합니다.
vi .bashrc
를 실행해 문법 하이라이트 적용여부를 확인하고 :q!
로 저장하지 않고 종료합니다.
종료exit
후 vagrant destroy -f
명령으로 생성한 가상 머신을 삭제합니다.
베이그런트로 운영 체제를 자동으로 설치하고 구성하면 편리하지만, 단순히 OS 1개를 구성하려고 베이그런트를 사용하지는 않습니다. 그래서 기존에 설치한 가상 머신 외의 3대를 추가로 설치해보고 서로간의 네트워크 통신이 원활하게 작동하는지 확인해봅시다.
# 에디터에 현재 파일이 루비임을 인식하게 하는 호환코드, ft는 file type의 약자이며 해당 내용은 실행에 아무런 영향을 끼치지 않음
# -*- mode: ruby -*-
# vi: set ft=ruby :
# "2"는 베이그런트에서 루비로 코드를 읽어 들여 실행할 떄 작동하는 API 버전, do |config|는 베이그런트 설정의 시작을 알림
Vagrant.configure("2") do |config|
# VBox에서 보이는 가상 머신을 "m-k8s"로 정의, do |cfg|를 추가해 원하는 설정으로 변경!, do |이름|으로 시작한 작업은 end로 종료한다.
config.vm.define "m-k8s" do |cfg|
# 기본값 config.vm.box를 do |cfg|에 적용한 내용을 받아 cfg.vm.box로 변경한다.
cfg.vm.box = "sysnet4admin/CentOS-k8s"
# 베이그런트의 프로바이더가 VBox라는 것을 정의. 프로바이더: 베이그런트를 통해 제공되는 코드가 실제로 가상 머신으로 배포되게하는 소프트웨어
cfg.vm.provider "virtualbox" do |vb| # 버추얼박스에서 필요한 설정 정의
# VBox에 생성한 가상 머신 이름, CPU 수, 메모리 크기, 소속된 그룹 명시, end로 설정을 종료한다
vb.name = "m-k8s(github_SysNet4Admin)"
vb.cpus = 2
vb.memory = 2048
vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
end
# 가상머신 자체에 대한 설정, do |cfg|에 속한 작업이다.
cfg.vm.host_name = "m-k8s"
# 호스트 전용 네트워크, eth1 인터페이스를 호스트 전용으로 구성하고 IP를 지정한다
cfg.vm.network "private_network", ip: "192.168.1.10"
# ssh 통신은 호스트 60010번을 게스트 22번으로 전달되도록 구성, 포트 중복을 대비해 auto_correct: true를 설정한다(자동변경)
cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
# 호스트(PC or 노트북)와 게스트(가상 머신) 사이에 디렉토리 동기화가 이뤄지지 않게 설정
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
# 프로비저닝 스크립트를 추가함, 경로(path)에 있는 install_pkg.sh를 게스트(CentOS) 내부에서 호출해 실행되도록 함.
cfg.vm.provision "shell", path: "install_pkg.sh"
# 파일을 게스트 운영체제에 전달하기 위해 셸이 아닌 파일 구문으로 변경, 호스트에 있는 ping_2_nds.sh파일을 게스트의 홈 디텍토리
# (/home/vagrant)로 전달한다.
cfg.vm.provision "file", source: "ping_2_nds.sh", destination: "ping_2_nds.sh"
# config.sh를 게스트(CentOS)에서 실행한다.
cfg.vm.provision "shell", path: "config.sh"
end # cfg가 끝나는 구문
#=============#
# Added Nodes #
#=============#
(1..3).each do |i| #1부터 3까지 3개의 인자를 반복해 i로 입력
config.vm.define "w#{i}-k8s" do |cfg| # {i} 값이 1,2,3 차례대로 치환됨, 새로운 cfg 구문 시작
cfg.vm.box = "sysnet4admin/CentOS-k8s"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "w#{i}-k8s(github_SysNet4Admin)" # {i} 값은 순서대로 치환됨
vb.cpus = 1
vb.memory = 1024 # 메모리를 1GB로 사용하도록 변경
vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin"]
end
cfg.vm.host_name = "w#{i}-k8s"
cfg.vm.network "private_network", ip: "192.168.1.10#{i}"
cfg.vm.network "forwarded_port", guest: 22, host: "6010#{i}", auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", path: "install_pkg.sh"
end
end
end
4대의 가상 머신을 구성해보겠습니다. vagrant up
을 실행해 4대의 CentOS를 설치하고 구성합니다.
vagrant ssh
로 접속합니다. 설처된 가상 머신이 여러 대라서 접속 할 가상 머신의 이름을 입력해야 한다는 메세지가 출력됩니다.
vagrant ssh m-k8s
로 접속합시다. m-k8s는 가장 먼저 설치된 가상 머신의 이름입니다.
업로드된 ping_2_nds.sh 파일을 실행해 3대의 CentOS(192.168.1.101~103)와 통신하는데 문제가 없는지 확인합니다.
4대의 가상 머신이 모두 이상 없음이 확인됐으니 exit
로 종료합니다.
이미 확인한 것처럼 vagrant ssh <이름>
은 여러 개의 가상 머신에 접근할 때는 유용한 방법이 아닙니다. 그래서 한 번에 접속할 수 있도록 구성해봅시다.
터미털 접속 프로그램 중에서 가장 많이 사용되는 것이 푸티입니다. 가볍고 무료이며 다양한 플러그인을 통해 여러 대의 가상 머신에 접근할 수 있습니다. 또한 접속 정보를 저장하고 바로 불러와 실행할 수도 있습니다.
window 기준
푸티 실행 파일을 저장할 디텍토리를 생성합니다.
슈퍼푸티는 다중 접속을 위해 푸티 여러 개를 띄워놓지 않아도 되는 프로그램입니다. 저는 mac 사용자이기 때문에 건너뛰도록 하겠습니다. 다운로드 후 putty.exe Location에서 푸티의 위치를 지정해주시고, 사용법에 대한 자세한 정보는 다른 자료를 참고해주시면 감사하겠습니다.
다운로드 | 참고
mac OS 기준
mac APP STORE에서 SSH Client
를 다운로드 받습니다.
화면 좌 상단의 SSH Client 우측 +
버튼을 눌러 새로운 Group의 이름을 k8s로 생성해줍니다.
새 그룹 k8s가 생성되었으면 우측의 +
버튼을 클릭하여 서버 정보를 하나씩 입력해줍니다.(4번 반복)
1. 서버 이름은 m-k8s, w1-k8s, w2-k8s, w3-k8s로 순서대로 하나씩 생성합니다.
2. Hostname은 모두 동일하게 127.0.0.1
로 입력합니다.
3. Username도 모두 동일하게 root로 입력합니다.
4. Password도 모두 동일하게 vagrant로 입력합니다.
5. port는 위의 서버 순서대로 위에서 지정한 60010, 60101, 60102, 60103으로 지정합니다.
6. 포드포워딩은 추후에 진행하겠습니다, 이 외의 사항들은 건드리지 않고 우상단 Save를 클릭해주세요!
서버 정보가 제대로 들어갔는지 확인하고 접속해봅시다!
네 서버 모두 클릭해서 각각 실행시켜주어야 하며(슈퍼푸티와 같이 한번에 실행시키는 기능이 없나봅니다.) 서버 실행 후에는 서버 정보를 변경할 수 있었던 i 버튼이 마운트와 같은 모양으로 변하고 터미널 창이 열리는 것을 볼 수 있습니다.
본 게시물은 "컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음(2021)" 기반으로 작성되었습니다.
안녕하세요! 저도 관련 책으로 실습을 진행하던중 윈도우 실습 환경과 달리 맥 사용자라 어려움점이 많았는데, 블로그를 잘 정리해두셔서 잘 보고있습니다!
혹시 이렇게 진행하셨을때, 마스터노드에서 kubectl 명령어가 인식되었나요? 저는 계속 kubectl command not found 에러가 뜨길래 혹시나하고 궁금하여 여쭤봅니다!