1. Kubeflow를 위한 Kubernetes 클러스터 환경 구축 (온프레미스-가상머신)

Jk Lim·2023년 10월 5일
0
post-thumbnail

Kubeflow를 위한 Kubernetes 클러스터 구축 Part입니다.
진행 환경은 Ubuntu 20.04, VirutalBox 6.1버전을 사용하였습니다.

진행 순서

  1. Vagrant를 통한 가상머신 배포 (Control Plane 1개, Worker Node 1개)
  2. Kubespray를 통해 Kubernetes 클러스터 배포

1. Vagrant 가상머신 배포

  • Vagrant를 통해 Control Plane, Worker Node로 사용할 가상머신을 각각 1개씩 생성합니다.
  • 컴퓨팅 리소스는 CPU 6개, 메모리 24GB, 스토리지 100GB로 할당하였습니다. (최소요구사양 : CPU 4개, 메모리 12GB, 스토리지 50GB)
  • Vagrantfile 구성은 다음과 같습니다.
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.define "control" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.hostname = "control"
    config.vm.network "private_network", ip: "192.168.56.101"
    config.disksize.size = "100GB"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "control"
      vb.cpus = 6
      vb.memory = 24576
    end
  end
  config.vm.define "worker1" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.hostname = "worker1"
    config.vm.network "private_network", ip: "192.168.56.102"
    config.disksize.size = "100GB"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "worker1"
      vb.cpus = 6
      vb.memory = 24576
    end
  end

  # Hostmanager plugin
  config.hostmanager.enabled = true
  config.hostmanager.manage_guest = true

  # Enable SSH Password Authentication
  config.vm.provision "shell", inline: <<-SHELL
    sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
    sed -i 's/archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
    sed -i 's/security.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
    systemctl restart ssh
    systemctl start systemd-timesyncd
    timedatectl set-timezone UTC
  SHELL
end
  • Vagrantfile이 있는 위치에서 vagrant up 명령어를 통해 가상머신을 설치 및 실행하고, vagrant halt 명령어를 통해 종료 할 수 있습니다.
$ vagrant up
$ vagrant halt


2. kubespray를 통한 Kubernetes 클러스터 배포

  • kubespray github 파일을 통해 kubernetes 클러스터를 배포합니다.
  • kubespray는 ansible기반의 k8s 배포 및 관리 도구입니다.
  • kubespray를 사용하려면 가상머신끼리 암호 없이 통신이 가능해야 합니다. 따라서 ansible-playbook 명령을 실행할 가상머신(여기서는 Control)에서 ssh 키를 생성하고 모든 가상머신으로 복사합니다.
$ vagrant ssh control # 가상머신 접속

# ssh 키 생성 및 배포
# 패스워드 없이 로그인 할 수 있는 환경을 구성

# 키 생성 [control 가상머신]
$ ssh-keygen # 엔터 세번

# 키 배포
# 비밀번호는 vagrant
$ ssh-copy-id vagrant@localhost
$ ssh-copy-id vagrant@192.168.56.102
  • kubespary v2.21.0 버전을 사용하면 kubernetes 1.25.6 버전을 설치할 수 있습니다.
  • 클러스터에 배포되는 구성요소에 대한 자세한 정보는 kubespray 공식 github에서 확인할 수 있습니다. (https://github.com/kubernetes-sigs/kubespray/tree/release-2.21)
  • kubespray를 다운받고 환경을 구성합니다. Control 가상머신에서 진행합니다.
$ git clone -b v2.21.0 https://github.com/kubernetes-sigs/kubespray

$ sudo apt-get update
$ sudo apt-get install python3 python3-pip -y

$ cd kubespray
$ sudo pip3 install -r requirements.txt # 필요한 패키지 설치

# inventory 템플릿 복사
$ cp -rfp inventory/sample inventory/mycluster
  • inventory.ini 파일을 클러스터 구성요소에 맞게 수정합니다.
# inventory 파일 수정
$ vim inventory/mycluster/inventory.ini

# [inventory.ini]
[all]
control     ansible_host=192.168.56.101    ip=192.168.56.101        ansible_connection=local
worker1     ansible_host=192.168.56.102    ip=192.168.56.102
 
[all:vars]
ansible_python_interpreter=/usr/bin/python3
 
[kube_control_plane]
control
 
[etcd]
control
 
[kube_node]
worker1
 
[calico_rr]
 
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
  • 클러스터 내에 필요한 addon을 설정합니다.
  • 여기서는 metric server, ingress, metallb를 추가하고 필요한 설정을 하였습니다.
$ vim inventory/mycluster/group_vars/k8s_cluster/addons.yml

# [addons.yml]
16 metrics_server_enabled: true
...
100 ingress_nginx_enabled: true
...
165 metallb_enabled: true
...
167 metallb_ip_range:
168   - "192.168.56.200-192.168.56.210"
...
195 metallb_protocol: "layer2"
$ vim inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml

# [k8s-cluster.yml]
129 kube_proxy_strict_arp: true
  • 구성이 완료되면 모든 가상머신들이 통신하는지 확인하고, ansible-playbook 명령어로 배포를 시작합니다.
# 모든 가상머신이 서로 통신하는지 확인
$ ansible all -i inventory/mycluster/inventory.ini -m ping
# 출력값
control | SUCCESS => {
    "changed": false,
    "ping": "pong"      # 모든 가상머신에 대해 ping, pong 확인
}
...

# 모든 가상머신에서 apt update 실행
$ ansible all -i inventory/mycluster/inventory.ini -m apt -a "update_cache=yes" --become
# 출력값
control | CHANGED => {
    "cache_update_time": 1688092019,
    "cache_updated": true,     # 모든 가상 머신에 대해 true가 출력되는지 확인
    "changed": true     # 모든 가상 머신에 대해 true가 출력되는지 확인
}
...

# 배포 시작
$ ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml --become
# 30~40분 정도 소요
  • 설치가 완료되면 클러스터 설정 파일을 control 가상머신의 홈 디렉토리에 복사하여 kubectl 명령어를 사용할 수 있도록 구성합니다.
  • kubectl get nodes 명령어를 사용해서 모든 노드들의 상태를 확인할 수 있습니다. STATUS가 Ready로 출력되면 정상입니다.
$ mkdir ~/.kube
$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config
$ sudo chown vagrant:vagrant ~/.kube/config

# 명령어 자동완성 편의기능
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
$ exec bash

# 노드 상태 출력 (Ready 확인)
$ kubectl get nodes
NAME         STATUS   ROLES           AGE    VERSION
control      Ready    control-plane   119m   v1.25.6
worker1      Ready    <none>          117m   v1.25.6

여기까지가 Vagrant 및 Kubespray를 사용한 Kubernetes 클러스터를 배포 과정입니다. 다음 글부터는 공식 Manifest 파일을 사용하여 Kubeflow 설치를 진행해 보겠습니다.

0개의 댓글