Kubeflow를 위한 Kubernetes 클러스터 구축 Part입니다.
진행 환경은 Ubuntu 20.04, VirutalBox 6.1버전을 사용하였습니다.
진행 순서
# -*- 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
$ vagrant up
$ vagrant halt
$ vagrant ssh control # 가상머신 접속
# ssh 키 생성 및 배포
# 패스워드 없이 로그인 할 수 있는 환경을 구성
# 키 생성 [control 가상머신]
$ ssh-keygen # 엔터 세번
# 키 배포
# 비밀번호는 vagrant
$ ssh-copy-id vagrant@localhost
$ ssh-copy-id vagrant@192.168.56.102
$ 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 파일 수정
$ 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
$ 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 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분 정도 소요
$ 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 설치를 진행해 보겠습니다.