프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

** 아래의 게시글을 참조해서 설치하였습니다. **

https://lewis-kku.tistory.com/112

 

Kubernetes | Kubespray 설치 방법

Kubespray 이번엔 kubeadm이 아닌 Kubespray를 설치해본다. kubeadm은 수동으로 모듈을 하나씩 설치하지만 kubespray는 Ansible 기반의 배포툴로 매우 간단하다. https://kubernetes.io/ko/docs/setup/production-environment/tool

lewis-kku.tistory.com

 

 

 

 

KubeSpary

 

 

 

Kubespray는 Ansible을 통해 쿠버네티스 클러스터를 유연하고 쉽게 배포 및 관리하기 위한 강력한 오픈 소스 툴이다. Kubespray는 Ansible 플레이북, 인벤토리, 프로비저닝 도구와 일반적인 운영체제, 쿠버네티스 클러스터의 설정 관리 작업에 대한 도메인 지식의 결합으로 만들어졌다.

 

 

Kubeadm과의 차이

Kubeadm은 클러스터의 기본 구성을 위한 도구이고, Kubespray는 Ansible 기반의 다양한 환경에서의 배포 도구이다.

Kubeadm은 직접 서버와 네트워크 인프라를 구축하여 그 위에 쿠버네티스를 설치한다.

반면에 Kubespray는 OS/커널 설정부터 애드온 배포에 이르기까지 더 넓은 범위에 대해 자동화를 지원한다. 따라서 설치가 비교적 쉽다.

 

Kubespray설치의 핵심 툴은 Ansible이다.

 

 

 

 

Ansible

Ansible은 오픈소스 IT 자동화 도구로, 구성 관리, 배포, 작업 자동화 등 다양한 작업을 수행하는 데 사용됩니다. Ansible은 간단한 구문과 모듈 기반 아키텍처를 사용하여 시스템 관리를 자동화하고 스케일링 가능한 방식으로 확장할 수 있다.

 

 

에이전트리스

Ansible은 에이전트리스 아키텍처를 사용하며 SSH를 통해 원격 시스템에 접속하여 작업을 수행합니다. 따라서 따로 무언가를 설치할 필요가 없습니다.

 

 

선언형 구성

사용자는 시스템의 상태를 설명하는 구성 파일을 작성하며, Ansible은 해당 상태로 시스템을 설정합니다. 이는 변경 사항을 지속적으로 추적하고 관리할 수 있도록 합니다.

 

 

플레이북과 역할

Ansible은 YAML 형식의 플레이북을 사용하여 여러 작업을 그룹화하고, 역할을 사용하여 모듈과 변수를 재사용할 수 있습니다.

 

 

모듈 기반

Ansible은 다양한 작업을 처리하기 위한 모듈을 제공합니다. 이러한 모듈은 시스템 설정, 패키지 설치, 서비스 관리 등 다양한 작업을 수행합니다.

 

따라서 Ansible은 IT 인프라의 구성 관리 및 자동화, 애플리케이션 배포, 클라우드 프로비저닝 등에 널리 사용된다.

 Ansible의 인벤토리(Inventory)와 플레이북(Playbook)은 Ansible에서 중요한 개념이다.

 

 

인벤토리 (Inventory)

인벤토리는 Ansible이 관리할 호스트(서버 또는 네트워크 장비)의 목록을 정의하는 파일입니다. 이 파일에는 호스트의 IP 주소 또는 호스트명, 연결에 사용되는 사용자명, SSH 키 파일 경로 등과 같은 정보를 포함할 수 있습니다.

 

[webservers]     # webservers 그룹

web1.example.com

web2.example.com

 

[databases]

db1.example.com

db2.example.com

 

 

위의 인벤토리 파일에서 [webservers]와 [databases]는 그룹을 정의합니다. 그룹은 관련된 호스트를 그룹핑하는 데 사용됩니다. 이 파일을 사용하여 Ansible은 정의된 그룹에 대한 작업을 수행할 수 있습니다.

 

 

플레이북 (Playbook)

플레이북은 Ansible에서 수행할 작업을 정의하는 YAML 형식의 파일입니다. 각 플레이북은 하나 이상의 '플레이'로 구성되어 있습니다. 각 플레이는 특정 호스트 그룹 또는 호스트에 대해 실행되는 작업 단위입니다. 플레이북은 주로 구성 관리, 배포, 작업 자동화 등을 수행하는데 사용됩니다.

 

- name: Install nginx      # 플레이(작업 단위) 이름

  hosts: webservers      # 대상 인벤토리 그룹

  tasks:

    - name: Install nginx

      apt:

        name: nginx

        state: present

 

- name: Restart nginx   # 플레이(작업 단위) 이름

  hosts: webservers

  tasks:

    - name: Restart nginx

      service:

        name: nginx

        state: restarted

 

위의 플레이북은 nginx를 설치하고 웹 서버를 재시작하는 데 사용될 수 있습니다. 첫 번째 플레이는 webservers 그룹에 속한 호스트에 대해 실행되며, 두 번째 플레이는 동일한 그룹에 대해 실행됩니다.

 

 

이러한 Ansible의 인벤토리와 플레이북을 k8s 설치를 위해 사용해보자.

 

 

 

Vagrantfile로 VM 올리기

 

일단 Vagrant와 virtual box의 설치가 필요하다.

[Window] Vagrant 설치 및 활용 (synced_folder, Docker)

 

[Window] Vagrant 설치 및 활용 (synced_folder, Docker)

IaC(Infrastructure as Code)를 위해 사용할 수 있는 Vagrant에 대해 정리하고 실습해 보자. 코드형 인프라(Infrastructure as Code, IaC)는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는

everenew.tistory.com

 

 

 

 

Vagrant.configure("2") do |config|
    # Define VM
    config.vm.define "k8s-node1" do |ubuntu|
        ubuntu.vm.box = "ubuntu/focal64"
        ubuntu.vm.hostname = "k8s-node1"
        ubuntu.vm.network "private_network", ip: "192.168.100.100"
        ubuntu.vm.provider "virtualbox" do |vb|
            vb.name = "k8s-node1"
            vb.cpus = 2
            vb.memory = 3000
        end
    end
    config.vm.define "k8s-node2" do |ubuntu|
        ubuntu.vm.box = "ubuntu/focal64"
        ubuntu.vm.hostname = "k8s-node2"
        ubuntu.vm.network "private_network", ip: "192.168.100.101"
        ubuntu.vm.provider "virtualbox" do |vb|
            vb.name = "k8s-node2"
            vb.cpus = 2
            vb.memory = 3000
        end
    end
    config.vm.define "k8s-node3" do |ubuntu|
        ubuntu.vm.box = "ubuntu/focal64"
        ubuntu.vm.hostname = "k8s-node3"
        ubuntu.vm.network "private_network", ip: "192.168.100.102"
        ubuntu.vm.provider "virtualbox" do |vb|
            vb.name = "k8s-node3"
            vb.cpus = 2
            vb.memory = 3000
        end
    end

    config.vm.provision "shell", inline: <<-SHELL
      sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/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
      systemctl restart ssh
    SHELL
end

 

 

 

vagrant up으로 file 실행.

 

 

Ssh-config로 정보 확인 후, ssh로 각각에 접속

 

mobaXterm의 경우

 

 

 

 

각각 노드에 kubespray 소스코드 다운

 

cd ~	# 계정의 root 폴더로 이동

# kubespray 2.18 버전 다운로드
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git  
cd kubespray

 

 

 

우리가 사용할 것은 spray 2.18버전이다.

https://github.com/kubernetes-sigs/kubespray/tree/release-2.18?tab=readme-ov-file

 

GitHub - kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster

Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.

github.com

 

최신 버전을 깔고 싶다면, 위의 공식 링크에서 설치 가이드를 참조하자.

 

 

 

 

 

 

kubespray라는 폴더가 새로 만들어지고, 필요한 파일들이 다운로드되었다.

 

 

 

 

설치에 필요한 python 라이브러리 설치

sudo apt update && sudo apt install python3-pip -y && sudo pip3 install -r requirements-2.11.txt
#해당 requirements-2.11.txt에 적힌 라이브러리를 버전대로 설치
# 또는 requirements-2.10.txt도 설치 가능.

 

 

requirements

 

 

 

Ansible이 핵심 라이브러리이다.

 

 

 

 

Ansible 인벤토리 구성

 

cp -rpf inventory/sample/ inventory/mycluster

sudo nano inventory/mycluster/inventory.ini

 

#인벤토리 그룹 설정

[all]  	# 각 노드들의 ip 설정(같은 네트워크 세팅하여 서로 통신 가능하도록 해야 한다.)
node1 ansible_host=192.168.100.100 ip=192.168.100.100
node2 ansible_host=192.168.100.101 ip=192.168.100.101
node3 ansible_host=192.168.100.102 ip=192.168.100.102

[kube_control_plane]		# control_plane은 마스터 노드만
node1

[etcd]		# etcd도 마스터 노드만
node1

[kube_node]
node1
node2
node3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

 

기존에 존재하는 파일

 

 

 

 

 

노드들 간의 ssh 연결

 

Ansible은 노드간의 ssh 연결을 사용한다.

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

 

위의 명령어 실행 시, 서로 간의 ssh 통신이 되지 않는 것이 확인된다.

따라서 노드들 간의 통신을 위한 ssh 키 생성 후에 전달해야 한다.

 

 

ssh-keygen  	# 키 생성

# 다른 노드들에게 전달
ssh-copy-id vagrant@192.168.100.100	
ssh-copy-id vagrant@192.168.100.101
ssh-copy-id vagrant@192.168.100.102

 

키 생성

 

전달

 

 

 

이 후에 정상적으로 통신이 된다.

 

 

 

 

 

 

Master(control) 노드에서 Ansible 플레이북 실행

 

ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b 

 

 

마스터 노드가 데이터를 받아서 작업 노드에게 전달하고 명령을 내리는 작업이 10분 정도 진행된다.

 

 

 

 

 

모두 완료되면, 아래와 같은 메시지가 출력된다.

 

 

 

 

마스터 노드의 계정에서 kubectl 세팅

 

mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown vagrant:vagrant ~/.kube/config

 

 

 

 

 

이제  모든 과정이 완료되었다.

 

 

 

 

 

 

마스터 노드에서 실행되어야 할 서비스 컨테이너들이 정상적으로 실행되었다.

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함