Vagrant 다운로드 및 설치
- 설치 파일 및 패키지(수동 설치) :
<https://www.vagrantup.com/downloads.html>  

vagrant 설치 후 cmd 나 파워쉘 등등 cli 환경 실행

powershell에서
cd c:\\
mkdir kubetest
cd kubetest

다음 명령어 실행

### 플러그인 설치  
vagrant plugin install vagrant-hostmanager  
vagrant plugin install vagrant-disksize
vagrant plugin list
vagrant box add ubuntu/bionic64
vagrant box list

특정 디렉토리 생성 후 이동
 
mkdir c:\\kube
cd kube  

Vagrantfile 파일 작성
(중요:vagrant 명령어를 실행할 위치에 Vagrantfile이 있어야 함.)

> Vagrantfile 내용

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.define "kube-master1" do |config|
    config.vm.box = "ubuntu/bionic64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "kube-master1"
      vb.cpus = 2
      vb.memory = 3072
    end
    config.vm.hostname = "kube-master1"
    config.vm.network "private_network", ip: "192.168.56.11"
    config.disksize.size = "30GB"
  end
  config.vm.define "kube-node1" do |config|
    config.vm.box = "ubuntu/bionic64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "kube-node1"
      vb.cpus = 2
      vb.memory = 3072
    end
    config.vm.hostname = "kube-node1"
    config.vm.network "private_network", ip: "192.168.56.21"
    config.disksize.size = "30GB"
  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
  SHELL
end

status

| Master       | IP               | CPU | Memory | Disk |
|--------------|------------------|-----|--------|------|
| kube-master1 | 192.168.56.11/24 | 2   | 3072MB | 30G  |

| Node         | IP               | CPU | Memory | Disk |
|--------------|------------------|-----|--------|------|
| kube-node1   | 192.168.56.21/24 | 2   | 3072MB | 30G  |

| Node         | IP               | CPU | Memory | Disk |
|--------------|------------------|-----|--------|------|
| kube-node2   | 192.168.56.22/24 | 2   | 3072MB | 30G  |

| Node         | IP               | CPU | Memory | Disk |
|--------------|------------------|-----|--------|------|
| kube-node3   | 192.168.56.23/24 | 2   | 3072MB | 30G  |

vagrant 명령어

VM 배포
vagrant up

VM 상태확인
vagrant status

VM 접속
vagrant ssh kube-master1

VM 종료
vagrant halt

VM 스냅샷 생성
vagrant snapshot save 스냅샷명

VM 스냅샷 적용
vagrant snapshot restore 스냅샷명

=====================================================================================
쿠버네티스를 설치하기 위한 준비

** Requirements => 설치 패키지들

- Ansible 2.7.16, python-netaddr
- Jinja 2.10.1
- 인터넷 연결(도커 이미지 가져오기)
- IPv4 포워딩
- SSH 키 복사
- 배포 중 문제가 발생하지 않도록 방화벽 비활성
- 적절한 권한 상승(non-root 사용자인 경우, passwordless sudo 설정)

-------------------------------------------------------------------

여기부터 설치 준비 

- SSH 키 복사

> ID/PW : vagrant/vagrant

ssh-keygen  
ssh-copy-id vagrant@localhost   //pw : vagrantd
ssh-copy-id vagrant@kube-node1 
ssh-copy-id vagrant@kube-node2
ssh-copy-id vagrant@kube-node3 

- python3, pip, git 설치

sudo apt update  
sudo apt install -y python3 python3-pip git

Kubespray 배포

- kubespray Git repository 클론

git clone --single-branch --branch v2.12.3 <https://github.com/kubernetes-sigs/kubespray.git>  

- 디렉토리 변경

cd kubespray

- requirements.txt 파일에서 의존성 확인 및 설치

sudo pip3 install -r requirements.txt  

- 인벤토리 준비

cp -rfp inventory/sample inventory/mycluster  

- 인벤토리 수정 

vi inventory/mycluster/inventory.ini

밑에 내용을 해당 인벤토리 파일 내용으로 수정

------------------------------------------------------------------------------------------

[all]  
kube-master1	ansible_host=192.168.56.11 ip=192.168.56.11 ansible_connection=local
kube-node1      ansible_host=192.168.56.21 ip=192.168.56.21
kube-node2      ansible_host=192.168.56.22 ip=192.168.56.22
kube-node3      ansible_host=192.168.56.23 ip=192.168.56.23

[all:vars]  
ansible_python_interpreter=/usr/bin/python3

[kube-master]  
kube-master1 

[etcd]  
kube-master1  

[kube-node]  
kube-node1  
kube-node2  
kube-node3  

[calico-rr]  

[k8s-cluster:children]  
kube-master  
kube-node  
calico-rr

-------------------------------------------------------------------------------------

- 파라미터 확인 및 변경

vi inventory/mycluster/group_vars/k8s-cluster/addons.yml

밑에 항목 true로 수정

metrics_server_enabled: true
ingress_nginx_enabled: true

- Ansible 통신 가능 확인

ansible all -i inventory/mycluster/inventory.ini -m ping

=> 각 호스트별로 엔서블로 통신 가능한지 확인 밑에 내용같이 나오면 설치 준비 완료

kube-master1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
kube-node1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

=> fail 결과가 있을 시 인벤토리 파일 내용에서 빠진 것이 없는지 확인하고 각 노드에 키 기반 로그인 설정 빼먹었는지 확인

- Apt 캐시 업데이트 (모든 노드)

ansible all -i inventory/mycluster/inventory.ini -m apt -a 'update_cache=yes' --become

해당 내용 출력시 준비 완료

kube-master1 | CHANGED => {
    "cache_update_time": 1584068822,
    "cache_updated": true,
    "changed": true
}
kube-node1 | CHANGED => {
    "cache_update_time": 1584068827,
    "cache_updated": true,
    "changed": true
}

- (옵션) apt 업데이트 시 오류가 난다면 해당 VM로 이동해서 아래와 같이 조치

sudo rm -rf /var/lib/apt/lists/*
sudo apt update --fix-missing
sudo apt update

- 플레이북 실행

ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml --become
=> 해당 내용 실행으로 엔서블을 통한 쿠버네티스 설치 시작

> 호스트 시스템 사양, VM 개수, VM 리소스 및 네트워크 성능에 따라 20분~40분 소요

- 자격증명 가져오기

mkdir ~/.kube
sudo cp ~root/.kube/config ~/.kube
sudo chown vagrant:vagrant -R ~/.kube

- kubectl 명령 자동완성

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
exec bash

- Kubernetes 클러스터 확인

kubectl get nodes
kubectl cluster-info