Computing

Kubespray를 통한 Kubernetes 배포(설치) 본문

Cloud/Kubernetes

Kubespray를 통한 Kubernetes 배포(설치)

jhson989 2022. 12. 13. 22:10

이전글

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

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

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

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

 

이전 jh 실습 시리즈를 통해 쿠버네티스 클러스터 개념 및 배포에 대해서 실습을 통해 정리하였다. 이전 포스터에서 매우 간단히 Kubespray 개념 및 Kubespray를 통한 쿠버네티스 클러스터 배포(deployment, 간단하게 설치라고도 하겠다) 방법에 대해서 정리하였다. 그간 Kubespray 및 Kubernetes architecture 공부를 하였고, 이번 글에서는 공부한 것을 바탕으로 Kubespray에 대해서 좀 더 깊이있게 정리하고자 한다.

 

 

 

Kubernetes Cluster와 Kubespray

Kubespray는 Kubernetes Cluster(쿠버네티스 클러스터)를 실제 제품 환경 수준으로 배포하는 도구[1]이다. 간단히 말하자면 여러 대의 컴퓨터로 구성된 클러스터에 쿠버네티스 클러스터를 설치 및 구성하는 도구이다. 클러스터는 컴퓨터(서버, 노드)들의 집합을 의미한다. 쿠버네티스는 이 클러스터 내에서 Pod들을 안전하고 효율적으로 배포(=실행)시키는 역할을 한다. 

 

Kubespray는 쿠버네티스 클러스터에 포함된 컴퓨터(서버, 노드)들에 쿠버네티스 관련 패키지, 이미지 등을 설치하고 쿠버네티스가 동작할 수 있도록 여러 설정을 자동으로 진행한다. 사용자가 원하는 쿠버네티스 구성 정보를 Kubespray에 전달하면, Kubespray는 해당 정보를 바탕으로 클러스터에 필요한 것을 설치하고, 구성 및 실행한다. Kubespray를 통해 생성된 쿠버네티스 클러스터는 곧바로 파드 운영등에 사용 가능하다.

 

Fig 1. Kubernetes Cluster 예시[2]

 

 

 

Kubespray의 작동 방식: Ansible과 Jinja2

Kubespray는 내부적으로 Ansible을 사용하여 컴퓨터들의 클러스터에 쿠버네티스를 설치한다. 이전 포스터에서 Ansible에 대해서도 정리하였는데, Ansible은 소프트웨어 프로비저닝, 구성 관리 애플리케이션 자동 배포 도구(IT Automation tool)이다. Ansible은 원격으로 컴퓨터에 필요한 소프트웨어 설치, 환경 설정 등 소프트웨어적으로 처리 가능한 일들을 자동화해주는 도구이다. Fig 2.는 Ansible의 작동을 잘 나타낸 그림이다.

 

Fig 2. Ansible의 작동[3]

 

Ansible을 통해 컴퓨터 한대(Control node라고 함)에서 다른 여러 대의 컴퓨터(Managed node라고 함)들의 환경 설정을 원격으로 할 수 있다. 이때 컨트롤 노드는 SSH 통신을 통해 매니지드 노드들에 원격 명령어를 실행시킨다. 매니지드 노드는 컨트롤 노드에 의해 실행하도록 명령 받은 명령어를 직접 실행한다. 

 

Fig 2.에서 보듯, Ansible은 두 가지 파일, Host Inventory(ini or yaml 파일)와 Playbook(yaml 파일)이 필요하다. Host Inventory는 매니지드 노드를 명시한 파일로 각 매니지드 노드의 IP를 명시한다. Playbook은 각 매니지드 노드에 어떤 일(task)를 해야 할 지를 명시한 파일로, 어떤 걸 설치하고, 어떤 설정을 하고 등등이 적혀있다. 

 

앞서 말했듯, Kubespray는 Ansible을 이용하여 쿠버네티스 클러스터에 포함되는 컴퓨터들을 구성한다. 즉 Kubespray는 Ansible에 필요한 Host Inventory와 Playbook을 생성(제공)하는 역할만 수행한다. 실제 설치 및 구성은 Ansible이 수행한다.

 

Kubespray는 Ansible에 필요한 Host Inventory template과 Playbook template(?)을 제공한다. 사용자는 Inventory template에 맞추어 자신의 구성에 맞게 inventory를 작성하면 된다. Kubespray가 제공하는 Playbook template에는 쿠버네티스 설치를 위한 모든 task들이 이미 작성되어 있고, 사용자는 Kubespray가 뚫어둔 변수만을 수정하여 자신이 원하는 쿠버네티스 설치를 진행할 수 있다. 예를 들면, 쿠버네티스 버전이나, CRI, CNI, CSI로 뭘 사용할 지, 어떤 Addon(Helm, MetalLB)들을 함께 설치할 지 등을 명시할 수 있다.

 

쿠버네티스는 Jinja[4]를 통해 Playbook template에 이 변수들을 반영한 최종 yaml 파일을 생성한다. 이 yaml 파일이 Playbook이 되고 Ansible은 이 파일에 명시된 대로 실행된다. Jinja가 template에 변수들을 반영하여 yaml 파일을 만드는 과정을 렌더링이라고 한다.

 

 

 

Kubespray가 지원하는 변수들

Kubespray 2.20 버전 기준으로 Kubespray가 지원하는 사용자가 변경가능한 변수들은 [inventory/group_vars] 폴더에 위치해 있다. [inventory/group_vars/k8s_cluster] 폴더에 위치한 변수들은 쿠버네티스 설치에 필요한 필수 변수들이고,   [inventory/group_vars/all] 폴더에 위치한 변수들은 쿠버네티스 설치 시 추가적으로 설정 가능한 변수들이다.

 

[inventory/group_vars/k8s_cluster] 폴더에는 k8s-cluster의 기본 설정들과 CNI 설정, 같이 설치할 addons 설정 관련 변수들이 위치해 있다.  [k8s-cluster.yml] 파일에는 쿠버네티스 버전 설정, Container Runtime 설정, CNI plugin 설정 등을 위한 변수들이 위치해 있다. [k8s-net-calico.yml], [k8s-net-weave.yml], [k8s-net-flannel.yml] 등의 파일에는 각 CNI plugin별 설정을 위한 변수들이 위치해 있다. [addons.yml]에는 쿠버네티스 설치 이후 같이 설치 가능한 addon(ex, helm, CSI, ingress_nginx, metalLB 등)들을 위한 변수들이 위치해 있다.

 

자세한 설명은 공식 홈페이지[5]에서 확인할 수 있다.

 

 

 

Reference

[1] https://kubespray.io/#/

[2] https://stackoverflow.com/questions/59950463/objects-resources-and-controllers-in-kubernetes

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

[4] https://jinja.palletsprojects.com/en/3.1.x/

[5] https://github.com/kubernetes-sigs/kubespray/blob/master/docs/vars.md