본문 바로가기
프로그래밍

[kubernetes] 쿠버네티스 환경 구축

by choihyuunmin 2024. 6. 11.

쿠버네티스 클러스터를 구성하는 방법을 실습해보겠습니다. 우선 가상머신을 생성하고, 생성된 가상머신 내에 쿠버네티스를 설치해보겠습니다.

1.  가상머신 생성(ubuntu)

저는 애플 실리콘이 탑재된 mac 운영체제를 사용하고 있습니다. 무료로 사용할 수 있는 가상머신 프로그램이 아직 마땅치 않은 것 같아 UTM 프로그램을 사용해서 가상머신을 생성했습니다. ubuntu 20.04 버전의 이미지를 다운로드 받아서 utm에 마운트 시키겠습니다.

https://releases.ubuntu.com/focal/

 

Ubuntu 20.04.6 LTS (Focal Fossa)

Select an image Ubuntu is distributed on three types of images described below. Desktop image The desktop image allows you to try Ubuntu without changing your computer at all, and at your option to install it permanently later. This type of image is what m

releases.ubuntu.com

 

새 가상머신 버튼 클릭

Virtualize 클릭

 

 

Linux 클릭

 

나머지 뒷부분에서는 서버의 리소스를 설정하고, 서버의 기본적인 설정(호스트, 볼륨 등)을 지정합니다.

설정이 끝나면 UTM의 가상머신 목록에 방금 생성한 이름의 서버가 보이게됩니다.

이제 생성된 서버를 실행 버튼을 클릭하여 설치를 진행해줍니다.

저는 아래의 블로그를 참고해서 설치를 진행했습니다.

https://velog.io/@suzu11/Mac-M1-%EC%97%90%EC%84%9C-%EC%9A%B0%EB%B6%84%ED%88%AC-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-UTM

 

Mac M1 에서 우분투 설치하기 ( UTM )

🐧 우분투를 깔기 위한 여정 🐧

velog.io

 

모든 설치 과정을 default로 지정했고, 호스트네임과 유저네임도 따로 설정했습니다.

중간 설정과정에서 openssh 설치여부를 물어보는데, 저는 맥북에서 ssh로 붙어서 작업을 할 예정이라 openssh까지 설치를 진행했습니다.

 

이렇게 쿠버네티스 마스터노드와 워커노드를 모두 설치해줍니다. 저는 마스터노드 1개, 워커노드 2개해서 총 3개의 가상이미지를 설치했습니다.

 

2. 네트워크 및 호스트 설정

 

1) 호스트명

다음으로는 가상머신의 호스트명을 설정해줍니다.

ubuntu를 가상이미지에 설치할 때 호스트명을 설정하는 부분이 있었지만, 이미지 자체를 복사해서 설치하신 분들은 따로 설정해 줄 필요가 있습니다.

 

쿠버네티스 클러스터는 네트워크에서 각 워커노드를 구분할 때 서버의 호스트명을 사용합니다.

호스트명을 변경하는 방법에는 일시적으로 변경하는 방법과 영구적으로 변경하는 방법이 있습니다.

 

일시적인 방법으로는 hostname 명령어 뒤에 변경하고자 하는 hostname을 입력해줍니다. 이 명령어는 sudo 권한으로 실행해야합니다.

choi@ubun20-01:~$ sudo hostname ubun2000
choi@ubun20-01:~$ hostname
ubun2000

 

 

영구적으로 변경하는 방법은 hostnamectl 서비스를 이용해서 변경할 수 있습니다. 해당 명령어 역시 sudo 권한이 필요합니다.

choi@ubun20-01:~$ sudo hostnamectl set-hostname ubun20-01
choi@ubun20-01:~$ cat /etc/hostname
ubun20-01

 

위의 방법으로 생성한 세개의 이미지 모두 hostname을 설정해줍니다.

 

 

2) IP 변경

쿠버네티스 클러스터 노드들의 원활한 관리를 위해 IP도 변경해주겠습니다. 가상이미지에서 부팅한 서버는 사설IP가 자동으로 할당됩니다.

제가 실행한 UTM의 경우 192.168.64.0/24 대역의 IP를 순서대로 할당해주는데, 이미지를 실행하고 종료할 때마다 IP가 자동으로 할당되는 불편함이 있습니다(DHCP). IP가 변경되지 않도록 고정해주겠습니다.

 

choi@ubun20-01:~$ sudo vi /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
#network:
#  ethernets:
#    enp0s1:
#      dhcp4: true
#  version: 2
#
#
network:
  ethernets:
    enp0s1:
      addresses: [192.168.64.11/24]
      gateway4: 192.168.64.1
      nameservers:
        addresses: [8.8.8.8]
  version: 2

 

ubuntu 20.04 버전 기준 /etc/netplan아래의 00-installer-config.yaml파일을 수정해줍니다.

기존에 설정되어있던 dhcp 는 주석처리하고 정적으로 IP를 할당해줍니다.

저는 host ID를 11번부터 차례대로 부여해줬습니다.

 

yaml파일을 수정 및 저장후에 netplan 명령어를 통해 네트워크를 재할당시켜줍니다.

choi@ubun20-01:~$ sudo netplan apply

 

 

3) DNS 설정

호스트명과 IP변경까지 끝마쳤으면 이제 각 서버에 DNS설정을 진행합니다.

DNS는 IP주소와 호스트명을 매핑시키는 과정으로, 외우기 어렵고 관리가 힘든 IP주소에 이름을 지어주는 과정입니다.

DNS는 각각의 서버에 모두 지정해주는데 /etc 디렉토리 아래의 hosts 파일을 수정해줍니다.

 

참고로, DNS는 웹상에 서버로도 존재합니다. 우리가 네이버나 구글에 접속할 때 www.naver.com,  www.google.com과 같이 도메인을 통해 들어갈 수 있도록 해주는 것이 DNS서버의 역할입니다. 만약 DNS가 없다면 네이버, 구글의 IP주소를 외워서 접속할 때마다 IP주소를 통해 접속해야한다는 단점이 있습니다.

hosts는 이런 DNS를 내 로컬에 구현한 것으로 웹상에 존재하는 DNS서버보다 우선권을 가지게 됩니다.

내 hosts파일에 www.naver.com 호스트명을 다른 IP로 지정하면 엉뚱한 네이버 화면이 나오게 만들 수도 있습니다.

 

이제 hosts파일을 수정해보겠습니다. 

 

choi@ubun20-01:~$ sudo vi /etc/hosts
127.0.0.1 localhost localhost.localdomain
127.0.1.1 ubun20-01

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback localhost6 localhost6.localdomain
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


192.168.64.11 ubun20-01
192.168.64.12 ubun20-02
192.168.64.13 ubun20-03

 

11번 서버에서 설정한 모습입니다. 이와 동일하게 나머지 두개의 서버에서도 dns 설정을 진행합니다.

이렇게 설정하면 ssh로 원격 접속시에 IP가 아닌 호스트명으로 접속이 가능합니다.

 

choi@ubun20-01:~$ ssh choi@ubun20-02
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-169-generic aarch64)

Last login: Tue Jun 11 13:56:07 2024
choi@ubun20-02:~$

 

3. 방화벽 해제 및 swap 해제

마지막으로 각 노드의 방화벽을 해제합니다.

쿠버네티스 클러스터에서는 마스터 노드와 워커 노드 간의 통신이 빈번하게 이루어집니다. 이 통신에는 API 서버, kubelet, etcd, kube-proxy, DNS 등 여러 구성 요소가 포함되는데, 만약 방화벽이 활성화되어 있다면 통신이 차단될 수 있습니다. 또한 쿠버네티스 클러스터 내의 pod간 통신에도 지장을 주지 않기 위해 방화벽을 해제합니다.

 

각 노드들에서 ufw를 비활성화하겠습니다.

choi@ubun20-01:~$ sudo ufw status
Status: inactive

 

 

만약 Status가 inactive 상태면 비활성화 된 상태입니다. 활성화되어 있다면 아래 명령어를 통해 비활성화해줍니다.

 

choi@ubun20-01:~$ sudo ufw disable

 

 

 

다음으로는 swap 메모리를 비활성화 시키겠습니다.

방화벽과 마찬가지로 쿠버네티스 클러스터의 최적의 성능을 위해서 swap을 비활성화 시킵니다.

swap이 활성화된 상태에서는 노드의 메모리가 부족할 때 디스크로 데이터를 옮기게 되는데,  이는 메모리보다 훨씬 느립니다. 이러한 swap 동작은 쿠버네티스 클러스터의 성능 저하를 유발하고, 쿠버네티스의 자원 관리 로직에 혼란을 줄 수 있기 때문에 swap 기능을 종료합니다.

 

먼저 free 명령어를 통해 swap 메모리 할당 여부를 확인합니다.

choi@ubun20-01:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.8Gi       365Mi       5.5Gi       1.0Mi       1.9Gi       7.2Gi
Swap:            0B          0B          0B

 

 

 

저는 지금 swap 메모리 영역이 0인 것을 보아 비활성화되어 있는 상태입니다.

 

choi@ubun20-01:~$ swapoff -a
choi@ubun20-01:~$ swapon -a

 

swapoff와 swapon 명령어를 통해 swap 메모리 영역을 관리합니다.

 

지금까지 쿠버네티스 클러스터 설치를 위해 서버에서 설정해야 하는 부분들을 알아보았습니다.

이제 직접 쿠버네티스를 설치해서 설정해놓은 노드들을 연결하는 일만 남았습니다. 다음 포스팅을 통해 쿠버네티스를 설치해보겠습니다.