쿠버네티스 : 컨테이너 인프라 환경 구축(1)

노하람·2021년 8월 31일
4
post-custom-banner

안녕하세요! 오늘부터 인프라 환경 구축을 위한 실습을 책을 보며 함께 진행해보려고 합니다.
중요한 포인트나, 해결해야 할 버그가 있다면 포스팅을 하게 될 것 같은데
혹시라도 책을 읽으면서 진행이 막히거나, 함께 쿠버네티스를 공부하고 싶으신 분이라면
참고해주시면 감사하겠습니다 :)

  • 참고로 k8s란 kubernetes 중 k'ubernete's 사이 알파벳 8개를 줄여 부른다는 의미에서 'k8s'입니다!

  • Mac OS 2021년 1월 이후 VBox가 최신 버전이 아니면 잘 작동하지 않는 이슈가 있습니다. vagrant up, vagrant ssh 등에서 정상적으로 진행되지 않는 문제가 있어 책에서 진행된 호환성(VBox 6.1.12)가 아닌 최신 버전으로 진행합니다.

  • 진행하다보니 책은 window 기준으로 작성되어있고, 책과 다르게 mac에서 실습이 가능하게 작성되었습니다. VM 세션을 다루는 부분을 제외하면 크게 다르지 않습니다만 책을 보고 실습하신다면 window에서 진행하시길 추천드립니다.

2장 테스트 환경 구성하기

버추얼 박스 설치하기

  1. Mac OS 이용자는 추후 과정에서 에러 방지를 위해 최신버전을 설치합니다. 아래의 VBox 설치과정은 무시하셔도 됩니다. brew install -cask virtualbox
  2. 운영체제에 맞는 6.1.12 버전을 내려받습니다.
    다운로드
  • 책에서 테스트 된 다양한 도구와의 호환성을 유지하기 위해 이전 버전을 다운로드 받습니다.
    (VirtualBox 6.1.12)
  • Mac OS 사용자는 OS X hosts를 받으면 됩니다.
  • 기본설정을 그대로 유지하며 설치해주시면 됩니다.
  1. 설치를 진행해주세요.

  1. 설치 중 오류가 나면 차단된 설정을 변경해주세요.

저는 허용 후에도 계속해서 설치가 실패했습니다. 그래서 아래와 같이 진행했습니다.

1) 컴퓨터에 남아있는 VirtualBox 잔존파일 삭제
sudo /Volumes/VirtualBox/VirtualBox_Uninstall.tool
2) Application 폴더 확인 : 폴더를 확인해보니 응용 프로그램이 설치되어 있었습니다. 클릭해보니
실행이 되어 일단 넘어갑니다.

  1. 어떤 VM도 없이 깨끗한 실행 상태를 확인해주세요

베이그런트 설치하기

  • 베이그런트 : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요할 때 시스템을 사용할 수 있는 상태로 만들어 줍니다.(프로비저닝)

다운로드

  1. 버전에 상관없이 홈페이지에서 찾아주는 운영 체제에 맞게 바로 설치하면 됩니다.
    • mac은 brew로 설치하는 것을 추천드립니다.

베이그런트 구성하고 테스트하기

  1. 명령 프롬프트를 실행하고 베이그런트 작업환경 디렉토리 생성 후 이동
  2. 베이그런트 초기화 명령을 실행해 프로비저닝에 필요한 기본 코드 생성
$ 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

  1. 설치가 끝나면 VBox(Virtualbox)를 실행해 가상 머신이 제대로 생성됐는지 확인합니다.
  2. CLI로 돌아와 vagrant ssh 명령을 실행해 CentOS에 ssh 접속을 합니다.
  3. 설치가 정상적으로 이루어졌는지 실행 시간(uptime)과 운영 체제의 종류(cat /etc/redhat-release)를 확인합니다
  4. 본격적인 실습을 위해 설치한 가상머신을 삭제합니다. 먼저 exit로 빠져나온 다음 vagrant destroy -f를 실행합니다. -f 옵션은 가상머신을 강제 종료하는 옵션입니다.

베이그런트로 테스트 환경 구축하기

이ㄴ에는 Vagrantfile을 수정해 원하는 구성이 자동으로 CentOS에 입력되도록 해봅시다.

가상머신에 필요한 설정 자동으로 구성하기

  • 베이그런트 코드는 루비(Ruby) 언어로 작성합니다. 다만 어렵지 않으니 부담없이 시작해도 됩니다.
  1. 베이그런트 파일을 다음과 같이 수정하고 저장합니다. 기존의 주석은 삭제해도 무방합니다.

    • 수정할 부분이 많으니 저는 VSCODE를 활용했습니다.
    • 호스트 전용 네트워크는 호스트 내부에 192.168.1.0대의 사설망을 구성합니다. 가성 머신은 NAT(Network Address Translation, 네트워크 주소 변환) 인터페이스인 eth0을 통해서 인터넷에 접속합니다.
    # 에디터에 현재 파일이 루비임을 인식하게 하는 호환코드, 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
  2. 수정한 Vagrantfile로 가성 머신을 생성합니다.

    • 인터페이스를 설정을 허용하겠냐는 메세지가 두번 나오는데 새로운 호스트 전용 네트워크를 설정하는 메세지입니다. 모두 허용해줍니다.
  3. vagrant ssh를 이용해 가상 머신에 접속합니다.

  4. CentOS에서 ip addr show eht1 명령을 입력해 IP가 제대로 설정됐는지 확인합니다.

  5. CentOS 접속을 종료합니다. exit

가상 머신에 추가 패키지 설치하기

  • CentOS에 필요한 패키지를 설치하는 방법을 알아봅시다.

코드 입력

  1. Vagrantfile에 셸 프로비전을 추가합니다.

  2. Vagrantfile이 위치한 디렉토리에서 스크립트를 다음과 같이 작성하고 install_pkg.sh라는 이름으로 저장합니다.

  3. Vagrantfile에서 호출한 install_pkg.sh로 입력해 둔 배시 셸 파일을 실행해 EPEL(Extra Packages for Enterprise Linux) 저장소와 코드 하이라이트를 위한 Vim의 추가 기능을 설치합니다.

코드 실행

  1. zsh(명령 프롬프트)에서 vagrant provision 명령으로 추가한 프로비전 구문을 실행합니다.
    ...[생략]

  2. CentOS에 접속합니다. vagrant ssh

  3. yum repolist 명령으로 추가한 EPEL 저장소가 구성됐는지 확인합니다.

  4. vi .bashrc 를 실행해 문법 하이라이트 적용여부를 확인하고 :q!로 저장하지 않고 종료합니다.

  5. 종료exitvagrant destroy -f 명령으로 생성한 가상 머신을 삭제합니다.

가상 머신 추가로 구성하기

베이그런트로 운영 체제를 자동으로 설치하고 구성하면 편리하지만, 단순히 OS 1개를 구성하려고 베이그런트를 사용하지는 않습니다. 그래서 기존에 설치한 가상 머신 외의 3대를 추가로 설치해보고 서로간의 네트워크 통신이 원활하게 작동하는지 확인해봅시다.

코드 입력

  1. Vagrantfile에 CentOS 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
  1. install_pkg.sh 스크립트는 작성해놓았으니, ping 테스트 파일을 작성합니다.(ping_2_nds.sh)
    • 추가로 설치한 CentOS 3대로 ping을 보내 네트워크 작동을 확인합니다. -c 옵션은 몇 번의 ping을 보내는지 지정합니다.
  2. 설정을 변경하는 스크립트로 작성합니다.(config.sh)
    • ping 테스트 파일이 업로드되고 난 후 실행할 수 있도록 권한을 744로 변경해줍니다.

코드 실행

  1. 4대의 가상 머신을 구성해보겠습니다. vagrant up을 실행해 4대의 CentOS를 설치하고 구성합니다.

    • 동일한 과정이 m-k8s, w1-k8s, w2-k8s, w3-k8s의 이름으로 반복되며 진행됩니다.
    • Vagrantfile에서 #{i}를 통해 인자를 대체했던 부분들이 변경되며 진행되니 이상한 부분이 있다면 코드를 다시 확인해보세요.
  2. vagrant ssh로 접속합니다. 설처된 가상 머신이 여러 대라서 접속 할 가상 머신의 이름을 입력해야 한다는 메세지가 출력됩니다.

  3. vagrant ssh m-k8s로 접속합시다. m-k8s는 가장 먼저 설치된 가상 머신의 이름입니다.

  4. 업로드된 ping_2_nds.sh 파일을 실행해 3대의 CentOS(192.168.1.101~103)와 통신하는데 문제가 없는지 확인합니다.

  5. 4대의 가상 머신이 모두 이상 없음이 확인됐으니 exit로 종료합니다.


터미널 프로그램으로 가상 머신 접속하기

이미 확인한 것처럼 vagrant ssh <이름>은 여러 개의 가상 머신에 접근할 때는 유용한 방법이 아닙니다. 그래서 한 번에 접속할 수 있도록 구성해봅시다.

푸티(PuTTY) 설치하기

터미털 접속 프로그램 중에서 가장 많이 사용되는 것이 푸티입니다. 가볍고 무료이며 다양한 플러그인을 통해 여러 대의 가상 머신에 접근할 수 있습니다. 또한 접속 정보를 저장하고 바로 불러와 실행할 수도 있습니다.

window 기준

  1. 푸티 실행 파일을 저장할 디텍토리를 생성합니다.

  2. 다운로드

    • Alternative binary files 항목에서 운영 체제 및 버전에 맞는 푸티 실행파일을 내려받습니다, 실행합니다.
  3. 슈퍼푸티는 다중 접속을 위해 푸티 여러 개를 띄워놓지 않아도 되는 프로그램입니다. 저는 mac 사용자이기 때문에 건너뛰도록 하겠습니다. 다운로드 후 putty.exe Location에서 푸티의 위치를 지정해주시고, 사용법에 대한 자세한 정보는 다른 자료를 참고해주시면 감사하겠습니다.
    다운로드 | 참고

mac OS 기준

  • macOS Big sur 11.5.2 버전 기준으로 설명합니다.
  • mac은 터미널로 keygen 사용이 가능하기에 PuTTY는 큰 의미가 없습니다.
  • PuTTY 자체는 mac에서 다양한 방법으로 대체할 수 있고, brew 등으로 PuTTY 자체를 다운로드하여 사용할 수도 있으나 superputty가 mac os를 지원하지 않기 때문에 다른 방법을 찾아 소개해드립니다. 책과 다른 방법으로 다중 가상 머신에 접속하여 운용해야 할 수 있다는 점 양해바랍니다.
  • 참고
  1. mac APP STORE에서 SSH Client를 다운로드 받습니다.

  2. 화면 좌 상단의 SSH Client 우측 + 버튼을 눌러 새로운 Group의 이름을 k8s로 생성해줍니다.

  3. 새 그룹 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를 클릭해주세요!

  4. 서버 정보가 제대로 들어갔는지 확인하고 접속해봅시다!

    • 구독알림창이 매번 뜨는데 결제하지 않고 Skip를 누르셔서 진행하시면 됩니다.

    네 서버 모두 클릭해서 각각 실행시켜주어야 하며(슈퍼푸티와 같이 한번에 실행시키는 기능이 없나봅니다.) 서버 실행 후에는 서버 정보를 변경할 수 있었던 i 버튼이 마운트와 같은 모양으로 변하고 터미널 창이 열리는 것을 볼 수 있습니다.

    • 아쉽게도 슈퍼푸티와 같이 터미널창을 분할하여 여러 서버를 동시에 조작하거나, 명령을 내리는 기능이 없는 것으로 보입니다. 추가 결제를 통해 기능을 업그레이드하면 가능하지 않을까 싶은데 추후에 살펴보겠습니다.

본 게시물은 "컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음(2021)" 기반으로 작성되었습니다.

profile
MLOps, MLE 직무로 일하고 있습니다😍
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 4월 19일

안녕하세요! 저도 관련 책으로 실습을 진행하던중 윈도우 실습 환경과 달리 맥 사용자라 어려움점이 많았는데, 블로그를 잘 정리해두셔서 잘 보고있습니다!
혹시 이렇게 진행하셨을때, 마스터노드에서 kubectl 명령어가 인식되었나요? 저는 계속 kubectl command not found 에러가 뜨길래 혹시나하고 궁금하여 여쭤봅니다!

답글 달기