kubernetes

20210820 (금) Kubespray로 쿠버네티스 설치하기

gusalstm 2021. 8. 20. 18:05
반응형

쿠버네티스 설치

minikube 테스트 환경용 (기본 1대)
kubeadm 온프레미스 환경에서 설치
명령어 2~3 개 입력으로 간단하게 설치
사전 요구 사항을 만족 (사전 설정 필요)
버전 관리가 어렵다.
→ kubelet 과의 버전이 마이너 1개 차이
kubespray kubeadm 도구 + Ansible 을 사용
자동화 구성, 버전 관리가 조금 더 쉬움
kops AWS와 같은 퍼블릭 클라우드에서 인스턴스를 이용한 배포
→ 클라우드 환경의 배포 도구

 

 

  kubespray 배포도구를 통한 실습

 

( https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/ )

  <버전정보>

  vagrant : win10 가상머신 배포

  vagrant box : ubuntu/focal64     (virtualbox, 20210816.0.0)

  kubespray 2.14 (ansible 2.10.11, python version = 3.8.10)

 

  <vagrant plugin>

PS C:\Users\user\k8s> vagrant plugin install vagrant-vbguest

PS C:\Users\user\k8s> vagrant plugin list
vagrant-disksize (0.1.3, global)
vagrant-hostmanager (1.8.9, global)
vagrant-vbguest (0.30.0, global)

 

728x90

 

 

0. vagrantfile 작성

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

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

##### MASTER (control plane) #####

  config.vm.define "k8s-master" do |cfg|
    cfg.vm.box = "ubuntu/focal64"
    cfg.vm.provider "virtualbox" do |vb|
      vb.name="k8s-master"
      vb.memory=4096
      vb.cpus=1
    end
    cfg.vm.host_name = "master"
    cfg.vm.network "private_network", ip: "192.168.56.11"
    cfg.vm.synced_folder "../data", "/vagrant", diabled: true
  end

##### WORKER NODES #####

  config.vm.define "worker1" do |cfg|
    cfg.vm.box = "ubuntu/focal64"
    cfg.vm.provider "virtualbox" do |vb|
      vb.name="k8s-worker1"
      vb.memory=2048
      vb.cpus=1
    end
    cfg.vm.host_name = "worker1"
    cfg.vm.network "private_network", ip: "192.168.56.21"
    cfg.vm.synced_folder "../data", "/vagrant", diabled: true
  end

  config.vm.define "worker2" do |cfg|
    cfg.vm.box = "ubuntu/focal64"
    cfg.vm.provider "virtualbox" do |vb|
      vb.name="k8s-worker2"
      vb.memory=2048
      vb.cpus=1
    end
    cfg.vm.host_name = "worker2"
    cfg.vm.network "private_network", ip: "192.168.56.22"
    cfg.vm.synced_folder "../data", "/vagrant", diabled: true
  end

  config.vm.define "worker3" do |cfg|
    cfg.vm.box = "ubuntu/focal64"
    cfg.vm.provider "virtualbox" do |vb|
      vb.name="k8s-worker3"
      vb.memory=2048
      vb.cpus=1
    end
    cfg.vm.host_name = "worker3"
    cfg.vm.network "private_network", ip: "192.168.56.23"
    cfg.vm.synced_folder "../data", "/vagrant", diabled: true
  end
end



#### ubuntu 설정파일 수정 및 ssh 설정 ####

가능하다면, 마스터+노드들에 provision 세팅도 해줄 것.
모든 노드가 생성된 후 실행되어야함. (실행순서 체크)

 cfg.vm.provision "shell", inline: sudo sed -i 's/archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
 cfg.vm.provision "shell", inline: sudo sed -i 's/security.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
  PasswordAuthentication yes
  ChallengeResponseAuthentication yes
 cfg.vm.provision "shell", inline: ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa" -P ""
 cfg.vm.provision "shell", inline:

또는

 cfg.vm.provision "shell", inline: <<-SHELL 
   sudo sed -i 's/archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
   sudo sed -i 's/security.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
   ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa" -P ""
   ssh-copy-id vagrant@192.168.56.11  → localhost
   ssh-copy-id vagrant@192.168.56.21  → node1
   ssh-copy-id vagrant@192.168.56.22  → node2
   ssh-copy-id vagrant@192.168.56.23  → node3


##### ssh-keygen #####
  ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa" -P "" 
    type : rsa
    file : ~/.ssh/id_rsa
    Password : "" null
→ id_rsa / id_rsa.pub 두개생성


※ ubuntu/focal64 박스의 자동생성된 vagrant사용자는 sudo 명령어가 가능한 상태로 생성된다. 

 

1. master (control plane) 설정

vagrant@master:~$ sudo apt update

vagrant@master:~$ sudo apt upgrade

vagrant@master:~$ sudo apt install git python3 python3-pip -y

 

1-1. git

vagrant@master:~$ git clone https://github.com/kubernetes-sigs/kubespray.git

vagrant@master:~$ cd kubespray

vagrant@master:~/kubespray$ git checkout -b release-2.14  → 릴리즈 버전에 맞게 브랜치 버전 변경

vagrant@master:~/kubespray$ sudo pip3 install -r requirment.txt → 지정된 파일의 패키지들 설치

vagrant@master:~/kubespray$ cp -rfp inventory/sample inventory/mycluster → 샘플파일 복사

 

 

2. 설정 :  group_vars 디렉터리의 설정파일 편집

  <관련경로>

  /home/vagrant/kubespray/inventory/mycluster/group_vars/k8s_cluster/addons.yml
  /home/vagrant/kubespray/inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

  /home/vagrant/kubespray/inventory/mycluster/inventory.ini

  → hostname세팅과 인벤토리의 hostname을 일치하도록 세팅(언더바 불가)

  /home/vagrant/kubespray/cluster.yml

  /home/vagrant/kubespray/reset.yml (설치도중 문제발생시 초기화 playbook)

  /home/vagrant/kubespray/scale.yml (노드 수 변경)

  /home/vagrant/kubespray/recover-control-plane.yml

 필요하면 ansible.cfg 파일도 편집

 

 

3-1. ansible-playbook 준비

실행전 환경 확인(ansible.cfg, inventory.ini)

    (현재) 작업디렉터리에 있는 ansible.cfg
    ~/.ansible/ansible.cfg
    /etc/ansible/ansible.cfg

vagrant@master:~/kubespray$ ansible --version
ansible 2.10.11
  config file = /home/vagrant/kubespray/ansible.cfg
  configured module search path = ['/home/vagrant/kubespray/library']
  ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.10 (default, Jun  2 2021, 10:49:15) [GCC 9.4.0]

vagrant@master:~/kubespray$ ansible-playbook cluster.yml --list-hosts

호스트 확인 (필요시, --syntax-check, -C 등 실행)

 

3-2. ansible-playbook 실행

 

설치 명령어

vagrant@master:~/kubespray$ ansible-playbook cluster.yml --become --become-user=root -i inventory/mycluster/inventory.ini

▶  Friday 20 August 2021  08:42:07 +0000 (0:00:00.329)       1:34:02.974 *********

 약 1시간 30분 넘게 소요. playbook 양이 많음.

 

반응형

 

4. 설치완료 후 admin.conf 파일 복사 

vagrant@controlplane:~$ pwd
/home/vagrant

vagrant@controlplane:~$ mkdir .kube
vagrant@controlplane:~$ sudo cp -i /etc/kubernetes/admin.conf ~/.kube/
vagrant@controlplane:~$ sudo chown vagrant:vagrant ~/.kube/admin.conf

 

5. 간단 명령어
vagrant@controlplane:~$ kubectl get pod

vagrant@controlplane:~$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
vagrant@controlplane:~$ kubectl get node
NAME           STATUS   ROLES                  AGE   VERSION
controlplane   Ready    control-plane,master   21m   v1.21.3
node1          Ready    <none>                 20m   v1.21.3
node2          Ready    <none>                 20m   v1.21.3
node3          Ready    <none>                 20m   v1.21.3

 

vagrant@controlplane:~$ kubectl get node -o=jsonpath='{.items[0].metadata.name}'
controlplane

728x90