Computing

[jhKube][4] kubespary를 통한 쿠버네티스 클러스터 설치 (ansible 간단 정리) 본문

Cloud/jhVM

[jhKube][4] kubespary를 통한 쿠버네티스 클러스터 설치 (ansible 간단 정리)

jhson989 2022. 11. 23. 22:01

이전글

[jhVM][1] virt-manager, CentOS 7 qcow2 image (root password, 용량 설정 등)

[jhVM][2] CentOS 7 user 추가(sudo 권한 부여), 가상머신 네트워크 설정 및 virbr0(static internal IP 부여)

[jhVM][3] ssh 로그인 설정(비번 없이 로그인), qcow2 복사(VM 복제)

[jhKube][1] Kubernetes와 Linux Container 간단 정리

[jhKube][2] Kubernetes architecture 및 설치 방법 간단 정리

- [jhKube][3] kubeadm을 통한 쿠버네티스 클러스터 설치 (CentOS7, 가상머신 환경, cri-docker)

 

이전 글에 이어 CentOS 7 가상머신들을 이용한 쿠버네티스 환경 구축 과정에서 배운 내용을 정리하고자고 한다. jhVM 시리즈에서 가상머신 환경 구축은 끝났으니, 본격적으로 쿠버네티스를 설치해보려 한다. 공부 중인 단계에서 정리하는 글이기에 부족하거나 정확하지 않은 내용도 있을 수도 있다. 자세한 내용은 추후 다시 한번 정리해볼 예정이다.

Fig 1. Kubespray 로고 [1]

 

Kubespray와 Ansible

쿠베스프레이는 쿠버네티스 클러스터를 배포(deployment, 구축)하는 open source 도구이다. 쿠베스프레이는 Ansible을 사용하여 쿠버네티스를 배포한다. 쿠버네티스 클러스터에 포함될 노드를 사용자가 명시해주면 쿠베스프레이는 기본 제공되는 ansible 스크립트를 이용해 자동으로 쿠버네티스 클러스터를 구축한다. 

 

Ansible(앤서블)은 레드햇에서 개발한 소프트웨어 프로비저닝, 구성 관리 애플리케이션 자동 배포 도구이다. 말은 어렵지만 서버 구축 및 애플리케이션 배포를 자동으로 해주는 도구이다. 1천 대의 컴퓨터에 git에서 코드를 내려받아 실행시키고 싶은 경우가 있다고 하자. 일단 컴퓨터에 git(yum install git)부터 설치하고 git clone을 해서 코드를 다운 받아 빌드한 후, 마지막으로 프로그램을 실행시켜줘야 할 것이다. 1천 대의 컴퓨터 모두에서 이 일을 반복하는 것은 어려운 일은 아니지만 오랜 시간이 걸리는 일이 될 것이다.

 

Fig 2. Ansible 개념 [4]

 

이를 자동으로 해주는 것이 Ansible이다. Fig 2.는 Ansible 개념을 잘 보여주는 사진이다. 사용자가 Ansible에 제공해줘야 할 정보는 크게 2가지로 각각 inventory와 playbook이다. Inventory는 어떤 노드들에 배포할 지가 적힌 노드(IP주소) 리스트이고, playbook은 Ansible이 해당 노드들에 무엇을 할 지가 적힌 작업(task) 리스트이다.

 

서버 구축 및 앱 배포를 하고자 할때, 개발자는 inventory와 playbook만 작성해 Ansible에 제공하면 Ansible이 자동으로 해당 노드들에 playbook에 따라서 서버 구축 및 앱 배포를 한다. 이때 Ansible Engine이 설치된 노드를 컨트롤 노드(control node)라고 하고, Ansible Engine에 의해 프로비저닝될 노드들을 매니지드 노드(managed node)라고 한다. 컨트롤 노드에는 python 및 ansible package가 설치되어 있어야 한다. 매니지드 노드에는 특별히 설치되어 있어야 할 것은 없고 SSH로 접속가능하기만 하면 된다.

 

쿠베스프레이에서도 사용자는 어떤 노드들을 쿠버네티스 클러스터에 포함시킬 지, 어떤 구성으로 쿠버네티스 클러스터를 설치할 지만 명시해주면 쿠베스프레이가 자동으로 쿠버네티스 클러스터를 구축해준다. 쿠베스프레이는 기본적으로 쿠버네티스 클러스터 구축을 위한 playbook을 제공해준다. 이 playbook을 사용하여 쿠버네티스 클러스터를 구축해도 되고, 약간의 커스텀을 해줄 수도 있다.

 

 

 

Kubespray를 이용한 쿠버네티스 클러스터 설치 - 목표

앤서블 및 쿠베스프레이에 대해 어느정도 정리되었기에 본격적으로 쿠베스프레이를 통한 쿠버네티스 클러스터 설치를 시작하겠다.

 

<구축하고자 하는 쿠버네티스 클러스터의 구성은 다음과 같다>

- 3개의 가상머신이 참여하는 클러스터 구성

      - OS : CentOS 7

      - 하드웨어 : 2 CPU & 3GB 메모리 & 30GB 저장공간

- Control Plane (마스터 노드) : 1대

      - IP address : 192.168.122.21 (hostname: spray1)

- Worker Nodes : 2대

      - IP address : 192.168.122.22 (hostname: spray2)

      - IP address : 192.168.122.33 (hostname: spray3)

- Container Runtime : 쿠버스프레이에 버전에 맞는 CR 자동 설치

 

또한 쿠베스프레이(앤서블)을 사용하기 위해서는 다음이 준비되어야 한다.

 

- Python 및 Ansible이 설치된 컨트롤 노드 (쿠버네티스 마스터 노드(192.168.122.11)가 컨트롤 노드 역할 수행)

- 쿠버네티스 클러스터가 설치될 매니지드 노드 (총 3대, 마스터 노드 1대 + 워커 노드 2대)

- inventory : 매니지드 노드 IP 주소 + 쿠버네티스 클러스터 구성(어떤 노드가 컨트롤 플레인, 어떤 노드가 워커 노드인지)

- playbook : 쿠베스프레이가 주는 기본 스크립트를 사용

 

 

 

 

Kubespray를 이용한 쿠버네티스 클러스터 설치 - 기본 세팅

공식 문서[3]에 따르면 다음 조건을 만족해야 한다. 

 

- 컨트롤 노드에 Ansible v2.11+ 이 설치되어 있어야 함

- 인터넷에 접속할 수 있어야 함

- IPv4 포워딩이 활성화되어 있어야 함

- 방화벽을 비활성화하는 걸 추천

 

(컨트롤 노드에서) 일단 컨트롤 노드에 python 및 kubespray를 설치하자. kubespray 설치 과정에서 Ansible은 자동으로 설치된다.

 

#########################################
### Python 3 설치
#########################################
$ sudo yum install python3

#########################################
### (선택사항) 기본 python 버전 2 -> 3
#########################################
$ sudo rm -f /usr/bin/python
$ sudo ln -s /usr/bin/python3 /usr/bin/python
$ sudo vim /usr/bin/yum # 1번째 줄 python -> python2
$ sudo vim /usr/libexec/urlgrabber-ext-down # 1번째줄 python -> python2

#########################################
### 쿠베스프레이 설치
#########################################
$ sudo yum install git
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray
$ sudo pip install -r requirements.txt # Ansible이 설치됨
$ sudo yum install -y sshpass # 이게 필요하던데 이유는 확인해보아야겠다.

 

(모든 노드에서) IPv4 포워딩 활성화를 해주자 

 

##########################################
### IPv4 포워딩 설정
##########################################
$ sudo vim /etc/sysctl.conf
# 추가 : net.ipv4.ip_forward = 1 

$ sysctl -p /etc/sysctl.conf
$ service network restart
$ cat /proc/sys/net/ipv4/ip_forward

 

(컨트롤 노드에서) 컨트롤 노드에서 워커노드로 비밀번호 없는 ssh 접속을 위해서 ssh key 복사를 해두자 

 

$ ssh-keygen -t rsa
$ ssh-copy-id [username]@[ip of managed node 1] 
$ ssh-copy-id [username]@[ip of managed node 2]

 

 

 

Kubespray를 이용한 쿠버네티스 클러스터 설치 - Kubespray 실행

환경설정이 끝났으면 쿠베스프레이로 쿠버네티스 클러스터 배포(구축, 설치)를 진행해보자. 앞서 말했듯 쿠베스프레이는 앤서블을 이용하므로 앤서블 컨트롤 노드(여기서는  192.168.122.21)에서 다음 코드들은 진행된다.

 

쿠베스프레이에 어떤 노드들이 참여할지 inventory를 만들어주자

 

########################################################
### 샘플 예제를 복사
########################################################
$ cd kubespray
$ cp -rfp inventory/sample inventory/mycluster

########################################################
### 참여 노드들 선언
########################################################
$ declare -a IPS=(192.168.122.21 192.168.122.22 192.168.122.23)
$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

########################################################
### 설정 확인
########################################################
cat inventory/mycluster/group_vars/all/all.yml
cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

 

위 명령어를 실행하면 [inventory/mycluster/hosts.yaml]이 생성된다. 해당 파일을 구성하고자 하는 쿠버네티스 클러스터에 맞게 수정하자. 다음은 나의 구성 예이다.

 

all:
  hosts:
    spray1:
      ansible_host: 192.168.122.21
      ip: 192.168.122.21
      access_ip: 192.168.122.21
    spray2:
      ansible_host: 192.168.122.22
      ip: 192.168.122.22
      access_ip: 192.168.122.22
    spray3:
      ansible_host: 192.168.122.23
      ip: 192.168.122.23
      access_ip: 192.168.122.23
  children:
    kube-master:
      hosts:
        spray1:
    kube-node:
      hosts:
        spray2:
        spray3:
    etcd:
      hosts:
        spray1:
    k8s-cluster:
      children:
        kube-master:
        kube-node:
    calico-rr:
      hosts: {}

 

playbook은 쿠베스프레이 기본버전으로 사용할 것이다. 그러면 이제 사용자가 준비할 모든 것(inventory, playbook)이 준비되었다. 다음 명령어를 통해 쿠베스프레이를 실행만 하면 된다.

 

#################################################
### 쿠베스프레이 실행 
### (root 계정 비밀번호를 입력해야 함)
#################################################
$ ansible-playbook -i inventory/mycluster/hosts.yaml -kK --become --become-user=root cluster.yml

#################################################
### 설치 확인
#################################################
$ kubectl get nodes

 

위와 같이 쿠베스프레이를 실행하면 몇분 정도가 걸린 후 설치가 완료된다. 

 

 

 

Reference

[1] https://kubespray.io

[2] https://www.ansible.com/

[3] https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/

[4] https://www.ibm.com/cloud/blog/end-to-end-application-provisioning-with-ansible-and-terraform