Kubernetes

[Kubernetes] 쿠버네티스 클러스터 생성

운덩하는 개발자 2023. 11. 26.
반응형

1. XShell 설치

 

2. VirtualBox 설치 (7.0.8 버전)

https://www.virtualbox.org/wiki/Downloads

 

Downloads – Oracle VM VirtualBox

Download VirtualBox Here you will find links to VirtualBox binaries and its source code. VirtualBox binaries By downloading, you agree to the terms and conditions of the respective license. If you're looking for the latest VirtualBox 6.1 packages, see Virt

www.virtualbox.org

 

3. Vagrant설치 및 설치 스크립트 실행

// 폴더 생성
C:\Users\사용자>mkdir k8s
C:\Users\사용자>cd k8s 

// Rocky Linux Repo 세팅
C:\Users\사용자\k8s> curl -O https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/vagrant-2.3.4/rockylinux-repo.json
C:\Users\사용자\k8s> vagrant box add rockylinux-repo.json

// Vagrant Disk 설정 Plugin 설치 
C:\Users\사용자\k8s> vagrant plugin install vagrant-vbguest vagrant-disksize

 

 

명령어를 수행 한 후 k8s 디렉토리

 

 

그리고 위의 k8s경로에 vagrantfile을 작성해줍니다.

3.1 Vagrantfile 작성

puts '======== [1] 노드 개수 설정 ========'
NodeCnt = 2

puts '======== Vagrant 버전 2로 설정 ========'
Vagrant.configure("2") do |config|
  
puts '======== VM 설정 ========'
  puts '======== rockylinux/8로 설정 ========'
  config.vm.box = "rockylinux/8"  
  
  puts '======== 디스크 크기 30GB ========'
  config.disksize.size = "30GB"  
  
  puts '======== VirtualBox Guest Additions 비활성화 ========'
  config.vbguest.auto_update = false
  
  puts '======== 기본 동기화 폴더 비활성화 ========'
  config.vm.synced_folder "./", "/vagrant", disabled: true  
  
puts '======== VM 설정 ========'
  puts '======== $install_common_tools 스크립트를 높은 권한으로 실행합니다. ========'
  config.vm.provision :shell, privileged: true, inline: $install_common_tools

  puts '======== 마스터 노드 설정 ========'
  config.vm.define "k8s-master" do |master|
  	
	puts '======== 이름 "k8s-master" ========'
    master.vm.hostname = "k8s-master"
    
    puts '======== 프라이빗 네트워크 설정, 고정 IP "192.168.56.30" 할당 ========' 
	master.vm.network "private_network", ip: "192.168.56.30"
    
    puts '======== 마스터 노드 VirutalBox 설정  ========'
    master.vm.provider :virtualbox do |vb|
      puts '======== memory = 5120 ========'
      vb.memory = 5120
      puts '======== cpus = 4  ========'
      vb.cpus = 4
      puts '======== VM의 펌웨어를 EFI로 설정 ========'
      vb.customize ["modifyvm", :id, "--firmware", "efi"]
	end
    # 마스터 노드를 구성하는 $provision_master_node 스크립트를 높은 권한으로 실행
    master.vm.provision :shell, privileged: true, inline: $provision_master_node
  end

  puts '======== "k8s-node1", "k8s-node2" 워커 노드 정의를 위한 루프 ========'
  (1..NodeCnt).each do |i|
    config.vm.define "k8s-node#{i}" do |node| 
      node.vm.hostname = "k8s-node#{i}"
      node.vm.network "private_network", ip: "192.168.56.#{i + 30}"
      node.vm.provider :virtualbox do |vb|
        puts "======== k8s-node#{i}의 메모리를 3096MB로 설정 ========" 
        vb.memory = 3096
        puts "======== k8s-node#{i}의 CPU를 2개로 설정 ========"  
        vb.cpus = 2
        puts "======== k8s-node#{i}의 펌웨어를 EFI로 설정 ========" 
        vb.customize ["modifyvm", :id, "--firmware", "efi"]
	  end
    end
  end
end


$install_common_tools = <<-SHELL

echo '======== [4] Rocky Linux 기본 설정 ========'
echo '======== [4-1] 패키지 업데이트 ========'
yum -y update

echo '======== [4-2] 타임존 설정 ========'
timedatectl set-timezone Asia/Seoul

echo '======== [4-3] Disk 확장 / Bug: soft lockup 설정 추가========'
# https://cafe.naver.com/kubeops/25
yum install -y cloud-utils-growpart
growpart /dev/sda 4
xfs_growfs /dev/sda4
echo 0 > /proc/sys/kernel/hung_task_timeout_secs
echo "kernel.watchdog_thresh = 20" >> /etc/sysctl.conf

echo '======== [4-4] [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트 ========'
yum install -y yum-utils iproute-tc

echo '======== [4-5] Hosts 등록 ========'
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
192.168.56.31 k8s-node1
192.168.56.32 k8s-node2
EOF

echo '======== [5] kubeadm 설치 전 사전작업 ========'
echo '======== [5] 방화벽 해제 ========'
systemctl stop firewalld && systemctl disable firewalld

echo '======== [5] Swap 비활성화 ========'
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab


echo '======== [6] 컨테이너 런타임 설치 ========'
echo '======== [6-1] 컨테이너 런타임 설치 전 사전작업 ========'
echo '======== [6-1] iptable 세팅 ========'
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

cat <<EOF |tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

echo '======== [6-2] 컨테이너 런타임 (containerd 설치) ========'
echo '======== [6-2-1] containerd 패키지 설치 (option2) ========'
echo '======== [6-2-1-1] docker engine 설치 ========'
echo '======== [6-2-1-1] repo 설정 ========'
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

echo '======== [6-2-1-1] containerd 설치 ========'
yum install -y containerd.io-1.6.21-3.1.el8
systemctl daemon-reload
systemctl enable --now containerd

echo '======== [6-3] 컨테이너 런타임 : cri 활성화 ========'
sed -i 's/^disabled_plugins/#disabled_plugins/' /etc/containerd/config.toml
systemctl restart containerd


echo '======== [7] kubeadm 설치 ========'
echo '======== [7] repo 설정 ========'
cat <<EOF |tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

echo '======== [7] SELinux 설정 ========'
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

echo '======== [7] kubelet, kubeadm, kubectl 패키지 설치 ========'
yum install -y kubelet-1.27.2-0.x86_64 kubeadm-1.27.2-0.x86_64 kubectl-1.27.2-0.x86_64 --disableexcludes=kubernetes
systemctl enable --now kubelet

SHELL



$provision_master_node = <<-SHELL

echo '======== [8] kubeadm으로 클러스터 생성  ========'
echo '======== [8-1] 클러스터 초기화 (Pod Network 세팅) ========'
kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30
kubeadm token create --print-join-command > ~/join.sh

echo '======== [8-2] kubectl 사용 설정 ========'
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

echo '======== [8-3] Pod Network 설치 (calico) ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.25.1/calico.yaml
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.25.1/calico-custom.yaml


echo '======== [9] 쿠버네티스 편의기능 설치 ========'
echo '======== [9-1] kubectl 자동완성 기능 ========'
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc

echo '======== [9-2] Dashboard 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml

SHELL

 

4. VM 생성 및 스크립트 설치

vagrant up

 

vagrant up : VM 생성 및 스크립트 설치
(최초 VM생성 할때만 사용 합니다. 생성 이후 부터 VM 기동/중지는 Virtualbox UI를 사용하는걸 권해 드려요.)

vagrant destroy : 가상머신 삭제
(vagrant up으로 VM 생성 중 에러가 났을 때 이 명령으로 삭제 합니다.)

 

5. Worker Node 연결

5-1) XShell을 통해 master 접속 (id/pw: root/vagrant)
5-2) cat 명령으로 자신에 master 접근 token 확인 및 복사

[root@k8s-master ~]# cat ~/join.sh
kubeadm join 192.168.56.30:6443 --token bver73.wda72kx4afiuhspo --discovery-token-ca-cert-hash sha256:7205b3fd6030e47b74aa11451221ff3c77daa0305aad0bc4a2d3196e69eb42b7

 

5-3) worker node1, worker node2 접속 후 토큰 붙여넣기

[root@k8s-node1 ~]# kubeadm join 192.168.56.30:6443 --token bver73.wda72kx4afiuhspo --discovery-token-ca-cert-hash sha256:7205b3fd6030e47b74aa11451221ff3c77daa0305aad0bc4a2d3196e69eb42b7

 

 

5. 설치 확인

5-1) XShell을 통해 master 접속
5-2) kubectl 명령어

[root@k8s-master ~]# kubectl get pod -A
[root@k8s-master ~]# kubectl get nodes

6. 대시보드 접근

https://192.168.56.30:30000/#/login

반응형

댓글