Notice
Recent Posts
Recent Comments
Today
Total
05-02 00:04
Archives
관리 메뉴

Jeongchul Kim

VMWare를 활용한 Ubuntu 22.04 server 기반 Kubernetes 클러스터 구축 본문

카테고리 없음

VMWare를 활용한 Ubuntu 22.04 server 기반 Kubernetes 클러스터 구축

김 정출 2023. 1. 11. 16:09

VMWare를 활용한 Ubuntu 22.04 server 기반 Kubernetes 클러스터 구축

 

VMWare를 활용해 Ubuntu 22.04 Server로 설치하여 Kubernetes를 구축할 예정입니다.

  • VMware: Workstation Player 17
  • Host OS: Ubuntu 22.04 Desktop Jammy Jellyfish  
  • VM OS: Ubuntu 22.04 Server Jammy Jellyfish
  • Docker: 20.10.22
  • Kubernetes: 1.26.0
  • Master: 1
  • Wokrer 3

 

VMware Workstation Player 설치 

 

https://www.vmware.com/kr/products/workstation-player.html

위에 웹 페이지 링크로 이동하여 무료 다운로드 버튼을 클릭하고 VMware Workstation Player를 다운 받습니다.

다운받은 VMware-Player-Full-17.0.0-20800274.x86_64.bundle을 shell로 실행합니다.

sudo sh VMware-Player-Full-17.0.0-20800274.x86_64.bundle

 

다음의 창에서 설치를 진행합니다.

완료되면 VMware Workstation 17 Player 창이 열립니다.

 

Ubuntu 22.04 Server 이미지 다운로드

 

 

다음의 웹 페이지 링크에서 Ubuntu Server 22.04 ISO 파일을 다운로드 받습니다.

https://ubuntu.com/download/server 

 

다운로드가 완료되었다면 VM 생성 준비가 완료 되었습니다.

 

Master VM 생성

Master VM 생성을 먼저 진행하고, OS 설정 및 필요한 설치를 진행한 이후에 해당 VM을 복제하여 여러 Worker VM을 생성하는 것으로 진행하겠습니다.

 

Create a New Virtual Machine 버튼을 클릭합니다. 

위에서 다운받은 Ubuntu 22.04 Server ISO 이미지를 선택합니다.

 

OS 설정은 자동으로 입력됩니다.

 

Virtual Machine Name을 입력합니다. Location은 VM에서 사용하는 스토리지 저장 공간을 나타냅니다.

 

사용 가능한 Disk 사이즈를 입력합니다.

 

다음은 VM 하드웨어에 대한 설정이 가능합니다. Customize Hardware… 버튼을 클릭합니다.

 

Memory 설정을 진행합니다.

 

Processors에서 CPU Core수를 설정합니다.

 

마지막 화면입니다. Close 버튼을 클릭하고 VM 생성이 시작됩니다.

 

VM 커널이 로드되고, Ubuntu 22.04 Server 설치가 진행됩니다.

 

 

Language 설정을 진행합니다.

 

Keyboard 레이아웃 설정을 진행합니다.

 

Ubuntu Server 전체 설치를 진행합니다.

다음은 네트워크 설정입니다. NAT를 통해 네트워크가 설정되도록 진행합니다. DHCPv4에 있는 IP는 NAT 네트워크 vmnet8의 IP 대역대에서 자동으로 할당받은 IP입니다. 

  • vmnet0: 자동 설정되는 브릿지 네트워크
  • vmnet1: Host-Only 네트워크 모드로 외부와 단절된 사설망으로 VM 간에 통신만 지원합니다.
  • vmnet8: NAT 네트워크로 Host 로부터 IP를 할당받아 자체 DHCP 서버를 통해 내부 네트워크 대역 할당 및 통신을 진행하고 외부 네트워크와 통신이 가능합니다.

Proxy 서버 주소를 입력합니다. 없는 경우 넘어갑니다.

 

Ubuntu 미러 주소 설정입니다.

 

스토리지 설정입니다. VM에 생성 시에 입력한 스토리지 크기가 할당됩니다. 

파일 시스템 요약 화면입니다. 

 

다음은 계정 설정 화면입니다. 유저 이름과 호스트 네임, 패스워드를 입력합니다.

다음은 서버에서 설치할 환경을 선택합니다. 이 부분은 Docker, k8s를 직접 설치할 예정으로 넘어가도록 하겠습니다.

 

SSH 접속이 가능하도록 Install OpenSSH server를 체크합니다.

 

설치가 진행됩니다.

 

설치가 완료되면 Reboot Now을 선택합니다.

 

VM이 재기동되면서 커널이 올라오고, 로그인이 진행됩니다.

위에서 설정한 유저 계정을 입력해 로그인을 진행합니다.

net-tools을 설치해 ip를 확인해봅니다. 위에서 자동으로 할당받는 IP가 확인됩니다.

sudo apt install net-tools
ifconfig

 

할당받은 IP를 고정 IP로 설정 진행합니다. VM 재기동 시에 IP가 동적으로 변경될 경우 Kubernetes 각 Node 간에 통신 시에 이슈가 발생되어 고정 IP로 변경합니다.

 

Gateway 주소를 확인합니다.

ip route
ip addr

기존에서 추가되는 부분은 dhcp관련 no로 설정하여 IP 동적 할당받지않도록 설정하고, IP와 Gateway, Nameserver를 수동으로 설정합니다. 

sudo vi /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no
      addresses: [172.16.189.128/24]
      gateway4: 172.16.189.2
      nameservers:
        addresses: [8.8.8.8]
  version: 2

위에서 설정한 netplan을 적용합니다.

sudo netplan apply

Host Machine에서 VM으로 SSH 접속을 진행합니다.

ssh dev@MASTER_IP

 

OS 설정하기

VM에 zsh 설치 및 OhMyZsh 테마 적용은 다음의 내용을 참고해주세요

https://jeongchul.tistory.com/702 내에 zsh, ohmyzsh 참고

 

서버의 시간을 Seoul 로 변경하여 설정합니다.

date
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date

 

Kubernetes의 kubelet이 정상적으로 동작하기 위해서는 swap을 꺼야합니다.

sudo -i
swapon -s # swap 상태 확인
swapoff -a # swap 끄기

 

재부팅 시에도 swap을 사용하지 않도록 fstab 파일을 수정합니다. 

swap으로 기록된 부분을 주석(#)으로 칩니다.

vi /etc/fstab

 

Docker 설치

Docker 최신 버전(20.10.22)을 설치합니다. 이와 더불어 Kubernetes에서 사용하는 Container Runtime Interface(CRI)가 필요한데 Docker Engine의 경우 CRI 구현하지 않아 추가적으로 cri-dockerd를 설치해야 합니다. 우선 Docker Engine 부터 설치를 진행해보겠습니다.

 

다음의 웹 페이지 링크에서 Ubuntu에서 Docker Engine 설치 메뉴얼을 보고 진행합니다.

https://docs.docker.com/engine/install/ubuntu/

 sudo apt-get update

 sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

 

설치가 완료되어 Docker Engine 버전을 살펴봅니다.

sudo docker version

systemd에서 관리되는 docker 서비스의 상태를 확인해봅니다.

sudo systemctl status docker

 

cri-dockerd 설치

cri-dockerd 설치를 진행하겠습니다. 다음의 GitHub 페이지로 이동하여 최신 Releases로 이동합니다.

https://github.com/Mirantis/cri-dockerd

https://github.com/Mirantis/cri-dockerd/releases/tag/v0.3.0 

Ubuntu 22.04에 맞는 jammy deb 파일 링크를 복사하고 설치를 진행합니다.

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.0/cri-dockerd_0.3.0.3-0.ubuntu-jammy_amd64.deb

sudo dpkg -i cri-dockerd_0.3.0.3-0.ubuntu-jammy_amd64.deb

설치가 완료되고 나서 systemd에 등록된 cri-docker 서비스 상태를 확인합니다.

systemctl status cri-docker

 

Docker Engine의 Cgroup 드라이버가 systemd인지 확인합니다.

docker info | grep -i group

 

Kubernetes 설치

Kubernetes는 최신 버전인 v1.26을 진행할 예정이고 여기서는 kubeadm을 통해 설치를 진행합니다.

다음의 웹 페이지 링크의 설치 메뉴얼을 참고해주세요.

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

sudo apt-get install -y apt-transport-https ca-certificates curl

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 

설치가 완료되었습니다. kubectl 버전을 확인해봅니다.

kubectl version

 

systemd에 등록된 kubelet 서비스의 상태를 확인해봅니다.

systemctl status kubelet

 

VM 복제를 통한 Worker VM 생성

기본적으로 Docker Engine과 Kubernetes 설치까지 완료되었습니다. 이제 Master VM을 복제하여 여러 Worker VM 생성을 진행해보겠습니다.

Master VM을 우선 종료합니다.

sudo shutdown -h now

다음 호스트 PC에서 VMware의 VM이 저장되는 공간으로 이동하고 master directory를 통채로 worker-0 복사합니다.

 

Workerstation Player를 실행하고 Open a Virtual Machine을 클릭합니다.

 

worker-0에 있는 vmx을 선택하고 오픈합니다.

 

새로 복제된 VM을 선택하고 Virtual Machine Settings을 클릭하여 VM 이름을 변경합니다.

 

완료가 되면 다음과 같이 VM 2대로 구성됩니다.

 

worker-0 VM을 실행합니다. 초기 실행 시에 Question으로 VM이 복사가 되었는데 동일한 설정과 네트워크 설정을 복사할 것인지 이동할 것인지를 확인합니다. Moved It으로 할 경우 기존 Master VM과 충돌이 되므로 Copied It을 통해 복사를 진행합니다.



 

해당 worker-0에 dev 유저 계정으로 로그인 시에 hostname과 IP를 재설정해야 합니다.

sudo hostnamectl set-hostname worker-0

cat /etc/hostname

source ~/.basrhc
source ~/.zshrc

IP는 뒷자리에 1을 증가시켜 변경하겠습니다. 나머지는 동일합니다.

sudo vi /etc/netplan/00-install-config.yaml

 

위에서 설정한 네트워크 설정을 적용합니다.

sudo netplan apply

Master VM도 실행하여 Host 로컬에서 VM 2대로 SSH 접속을 실행합니다. 정상적으로 동작이 됩니다!

 

위 방식을 그대로 나머지 Worker VM 1, 2에도 동일하게 진행하여 VM 2대를 추가로 더 생성합니다. hostname과 IP 변경!!!

 

로컬 호스트 PC에 전체 VM IP를 호스트 정보에 등록합니다.

sudo vi /etc/hosts

XXX.XXX.XX.XX[\tab]master
…

 

VM 전체 4대를 실행합니다.

 

동일하게 전체 Node에 SSH로 접근합니다.

 

전체 VM(Master, Worker 3)에 로컬 Host에서 설정한 VM IP들을 설정합니다.

sudo vi /etc/hosts

 

Kubernetes 클러스터 구축

Master VM으로 접속하여 kubeadm을 활용해 클러스터 구축을 진행하겠습니다.

Pod Network CIDR은 네트워크 플러그인인 Calico에서 설정될 값입니다. Socket 주소는 cri-dockerd을 입력합니다.

sudo -i

kubeadm init --pod-network-cidr=10.10.0.0/16 --cri-socket unix://var/run/cri-dockerd.sock

 

k8s control-plane 초기화가 완료되면 k8s 클러스터 접근할 kube config 파일을 root와 dev 계정에 복사합니다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes

 

 

이어서 Worker VM들을 Worker 노드로 지정하기 위해 kubeadm join으로 시작되는 명령어를 복사하고, --cri-socket에 cri-dockerd 소켓 주소를 지정합니다. Worker VM에 접속하여 명령어를 실행합니다. 

kubeadm join 172.16.189.128:6443 \
  --token i6ko2b.lcrc7zddim48c3ik \
  --discovery-token-ca-cert-hash sha256:058f5627ef2490f3b837e7bfb0e1fc8d8d6c4e9d9b2881558f08c98100f36294 \
  --cri-socket unix:///var/run/cri-dockerd.sock

전체 Namespace에 실행 중인 Pod들을 확인해봅니다. coredns pod가 실행되지 않고 있습니다.

kubectl get pod -A

Node 정보를 확인 시에도 NotReady 상태로 확인이 됩니다. Pod 네트워크 구성이 이루어져 있지 않기 때문에 Pod 네트워크 구성이 필요합니다.

kubectl get node

Calico

 

Pod 네트워크 구성을 위해 Calico를 사용하도록 하겠습니다. VM이나 컨테이너를 위한 네트워킹, IP 관리, 접근 제어, 모니터링 등 다양한 네트워크 기능을 제공하는 오픈소스 프로젝트입니다. k8s 각 Node에 설치되어 각 Pod 간에 네트워크 통신이 가능하도록 도와줍니다.

k8s 클러스터에 Calico 배포를 진행해보겠습니다. 다음의 웹 페이지 링크를 참고해주세요.

https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart

tigera operator를 배포합니다.

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/tigera-operator.yaml

 

Custom 리소스는 다운받아 YAML 파일 수정이 필요합니다.

mkdir k8s && cd k8s

wget  https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/custom-resources.yaml

vi custom-resources.yaml

cidr내에 k8s Pod Network CIDR을 입력하고 저장합니다.

 

해당 YAML 파일을 배포합니다. 

sudo kubectl create -f custom-resources.yaml

 

calico 관련된 pod들과 calico-node가 각 Node에 배포 됩니다.

kubect get pod -A

 

k8s 노드들의 상태를 확인합니다. 정상적으로 Ready 상태가 연결되어 Kubernetes 구축이 완료 되었습니다.

 

 

이상입니다. 수고하셨습니다 :D

 

Comments