mingming

Vagrant로 kubernetes Cluster 구축하기 본문

kubernetes

Vagrant로 kubernetes Cluster 구축하기

mingming_96 2023. 9. 1. 23:20

 

 

Vagrant

Vagrant는 가상 개발 환경을 관리하고 구축하기 위한 오픈 소스 소프트웨어 입니다. Vagrant를 사용해 VirtualBox , VMware등 가상 개발 환경을 프로비저닝할 수 있습니다. 

 

Vagrant 장점 

1. 일관성 유지 : Vagrant를 통해 개발환경을 프로비저닝 하게 되면 동일한 개발환경을 구성할 수 있습니다. 

2. 재현성 : Vagrant 환경을 코드로 정의하므로 환경을 언제든지 재현할 수 있습니다.

3. 다양한 환경 지원 : 다양한 가상화 플랫폼 ( VirtualBox , VMware , Hyper-V ) 을 지원합니다.  

4. 빠른시작 : 수십대의 가상머신을 하나의 Vagrantfile로 정의해 가상머신을 생성할수 있습니다.

 

Vagrant 설치하기

vagrant 공식 사이트를 이용해 간편하게 설치할 수 있습니다.  각 OS에 맞게 설치해줍니다. 

 

Vagrant 시작하기

Vagrant 를 시작할 디렉터리에서 vagrant init 명령어를 실행해 줍니다. init 하게 되면 Vagratnfile이 생성됩니다.  

Vagrantfile은 Vagrant 소프트웨어를 사용하여 가상 환경을 정의하고 구성하는 데 사용되는 설정파일 입니다. 

VagrantfileRuby 프로그래밍 언어를 기반으로 작성되며, Vagrant가 가상 머신을 생성하고 구성하는 방법을 정의 합니다.

 

실습 환경

Provider : VitualBox

Master : 1 

Node : 1

OS : Ubuntu 20.04 

CPU : 2 

Memory : 2048

CNI : weavenet

Vagrantfile

Vagrant init 후 생성된 Vagrantfile에 다음과 같이 작성해줍니다. 

Vagrant.configure("2") do |config|

#================#
#  Master Node   #
#================#

    config.vm.define "k8s-master" do |cfg|    
      cfg.vm.box = "ubuntu/focal64"
      cfg.vm.provider "virtualbox" do |vb|
        vb.name = "k8s-master" 
        vb.cpus = 2
        vb.memory = "2048"
        vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]
      end
      cfg.vm.host_name= "master" 
      cfg.vm.network "public_network", ip: "192.168.0.129"
      cfg.vm.network "forwarded_port", guest:22, host:60014, auto_correct: true, id: "ssh"
      cfg.vm.synced_folder "../data","./vagrant", disabled:true
      cfg.vm.provision "shell", path: "init.sh"
      cfg.vm.provision "shell", path: "master.sh"
    end

    
#================#
#  Worker Nodes  #
#================#

    config.vm.define "k8s-worker" do |cfg|    
      cfg.vm.box = "ubuntu/focal64"
      cfg.vm.provider "virtualbox" do |vb|
        vb.name = "k8s-worker" 
        vb.cpus = 2
        vb.memory = "2048"
        vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]        
      end
      cfg.vm.host_name= "worker" 
      cfg.vm.network "public_network", ip: "192.168.0.130"
      cfg.vm.network "forwarded_port", guest:22, host:60015, auto_correct: true, id: "ssh"
      cfg.vm.synced_folder "../data","./vagrant", disabled:true
      cfg.vm.provision "shell", path: "init.sh"
      cfg.vm.provision "shell", path: "worker.sh"
    end
end

현재 Vagrantfie 에선 Master 와 Worker 각각 한대씩 정의하고 있지만 필요에 따라 Worker를 추가할 수 있습니다. 

 

 

init.sh

 Master와 Worker 모두에게 적용할 쉘 스크립트 입니다. ssh 설정과 Docker, Kubernetes 설치하는 스크립트 입니다.

 

#!/bin/bash -xe

echo "[TASK 1] Setting sshd config"
sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart ssh

echo "[Task 2] Change Timezone & Setting Profile"
# Change Timezone
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

echo "[TASK 3] Disable ufw" 
systemctl stop ufw && systemctl disable ufw

echo "[TASK 4] Install base Package"
apt update && apt install -y tree jq sshpass bridge-utils net-tools bat nfs-common sysstat
echo "alias cat='batcvat --paging=never'" >> /etc/profile

echo "[TASK 5] Setting Local DNS Using Hosts file"
echo "192.168.0.129 master" >> /etc/hosts
echo "192.168.0.130 worker" >> /etc/hosts

echo "[TASK 6] docker install"
# docker gpg key add
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# docker repository add 
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

# docker install
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

echo "[TASK 7] swwap memory off"
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

echo "[TASK 8] edit iptables"
echo "net.bridge.bridge-nf-call-ip6tables = 1" | sudo tee /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.d/k8s.conf
sudo sysctl --system

echo "[TASK 9] kubernetes install"
apt-get install -y apt-transport-https ca-certificates
sudo curl -s /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
rm /etc/containerd/config.toml
systemctl restart containerd
apt-get update
apt-get install -y kubelet kubeadm kubectl 
systemctl daemon-reload
systemctl restart kubelet

 

master.sh

Master 에게만 적용할 쉘 스크립트 입니다.  Kubernetes cluster 구성과 Config 파일 설정하는 스크립트 입니다. 

#!/bin/bash -xe
echo " K8S Master config start "

echo "[TASK 1] Initial Kubernetes - Pod CIDR 10.32.0.0/12 , Service CIDR 10.200.1.0/24 , API Server 192.168.0.129"
kubeadm init --token 123456.1234567890123456 --token-ttl 0 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.0.129 --service-cidr 10.200.1.0/24

echo "[TASK 2] Setting kube config file"
mkdir -p /root/.kube
cp -i /etc/kubernetes/admin.conf /root/.kube/config
chown $(id -u):$(id -g) /root/.kube/config

echo "[TASK 3] Alias kubectl to k"
echo 'alias k=kubectl' >> /etc/profile
echo 'complete -F __start_kubectl k' >> /etc/profile

echo "[TASK 4] Install Helm"
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

echo "[TASK 5] Install weavenet CNI"
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

echo " K8S Master config End "

 

worker.sh

kubernetes Controlplane join 및 기타 패키지 설치하는 스크립트 입니다.

임의로 토큰 값을 지정 후 인증 절차를 스킵했습니다. 테스트 환경으로만 사용하시길 권장합니다.

#!/bin/bash -xe
echo " K8S Node config start "

echo "[TASK 1] K8S Controlplane Join - API Server 192.168.10.10" 
kubeadm join --token 123456.1234567890123456 --discovery-token-unsafe-skip-ca-verification 192.168.0.129:6443

echo "[TASK 2] Alias kubectl to k"
echo 'alias k=kubectl' >> /etc/profile
echo 'complete -F __start_kubectl k' >> /etc/profile

echo "[TASK 3] Install Helm"
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

echo " K8S Node config End "

 

vagrant up

위의 스크립트 파일을 Vagrantfile과 같은 경로에 작성 후 vagrant up 을 실행해 줍니다. 

 

vagrant ssh k8s-master

 

master로 접속해 클러스터 구성이 성공적으로 되었는지 확인합니다. 

username : vagrant . password : vagrant 

 

kubectl get nodes

 

실습이 끝나면 vagrant destroy -f 명령어를 통해 환경을 삭제해 줍니다. 

'kubernetes' 카테고리의 다른 글

kubernetes controller - ReplicaSet  (1) 2023.09.03
kubernetes controller - Replication Controller  (1) 2023.09.03
Kubernetes Pod Resoure 할당하기  (0) 2023.08.31
EKS Prometheus & Grafana  (1) 2023.08.31
kubernetes static Pod  (2) 2023.08.30