본문 바로가기

Automation/system

[자동화] AI 개발환경 구축기 #3-Kubernetes Cluster(with kubespray)

머신러닝과 딥러닝, 그리 AI(인공지능)!!!

AI 서비스를 개발하기 위한 환경을 만들어본다.

최종 목표는 Kubeflow 기반의 AutoML 환경 구성이고, IaC(Infra as Code) 기반으로 Automation 하는것이 목적이다.

 

 

3편 Ansible를 활용한 Kubernetes Cluster 환경 구성

 

이전에 이미 Kubespray로 Kubernetes(이하 k8s) Cluster를 생성해 보았다. 하지만 자동화를 통한 손쉬운 환경에는 다소 아쉬움이 있었다. Ansible과 Kubespray를 잘 활용하면 조금 더 편리한 환경 구성이 가능할 것이다.

 

kubespray로 쿠버네티스 설치하기 #1 

 

kubespray 로 쿠버네티스 설치하기 #1-사전준비

쿠버네티스를 설치하는 방법은 여러가지가 있다. 그 중 내가 직접 구성해본 방법은 5가지다. Rancher로 K8S 클러스터를 구성하는 방법 kubespray로 K8S 클러스터를 구성하는 방법 kubeadm으로 K8S 클러스

jarikki.tistory.com

kubespray로 쿠버네티스 설치하기 #2

 

kubespray 로 쿠버네티스 설치하기 #2-설치하기

kubespray로 쿠버네티스를 설치한다. kubespary 디플로이하기 전에 마스터 및 워커 노드간 통신을 위한 인증작업과 통신환경 설정을 완료했다. (kubespary 설치 사전 준비 참고) kubespray 로 쿠버네티스 설

jarikki.tistory.com

1편에서는 Vagrant를 사용하여 가상화된 인프라를 만들었고, 2편에서는 Vagrant로 생성한 가상머신을 프로비저닝할 수 있도록 Ansible을 적용해 보았다.

이제 Kubespary를 활용해서 k8s 클러스터를 자동화하기만 하면 AI 개발을 위한 기본 인프라 자동화(IaC)의 기본적인 구색이 맞춰진다. Kubespray가 Ansible로 만들어져 있기 때문에 몇 가지 Ansible 템플릿만 몇가지 추가하거나 기존 script를 수정하면 간단히 구성이 될 것이라 생각했다. 그런데 "A worker was found in a dead state", "SSH permission denied", "Node unreachable" 등 다양한 문제가 발생했다.

아마도 Vagrant와 Ansible의 서로 다른 계정으로 인한 권한 문제와 SSH 접속 문제 등이 발생하는 것 같다.

 

우선 자동화 전에 현재 Vagrant 환경에서 Kubespary를 수동으로 설치하면서 자동화해야 할 중요 포인트를 정리하는 것이 좋을 것 같다. 쿠버네티스 자동화를 위한 명확한 작업 포인트를 찾기 위해 Kubespary를 수동으로 설치하는 방법을 정리한다. 

 

[논리 구성도]

  • Ansible Master(이하 A-Master) : 1core, 300mb memory(default)
  • Controle Plane (이하 K-Master) : 3core, 8gb memory
  • Nodes (이하 Woker) : 3core, 8gb memory

[k8s 네트워크 사용 포트 정리]

Control Plane(K-Master)
Worker

Kubespary 설치 작업에 앞서 위에 정의한 대로 Vagrant를 이용하여 총 4개의 VM을 생성하였다. 그리고 모든 노드에 git, net-tools, python3-pip을 설치하였으며, vagrant 계정에 대한 sudo 권한 및 NOPASSWD 설정을 적용하였다. 또한 방화벽 사용을 중지(disable)하였다.

 

1. A-Master(controlz) 노드 작업 #1

A-1. A-Master 접속

vagrant ssh controlz

A-2. Kubespray 의존성 설치

# vagrant 계정으로 작업
cd
git clone https://github.com/kubernetes-sigs/kubespray.git     # kubespray 다운로드
cd kubespray
sudo pip3 install -r requirements.txt     # 의존성 모듈 설치, Ansible도 포함되어 설치됨

A-3. 공개키 기반 SSH 접속 환경 설정 #1

cd
ssh-keygent     # SSH 인증키 생성

sudo apt-get install -y sshpass

 

2. 모든 노드에서 작업(A-Master 제외)

B-1. 공개키 기반 SSH 접속환경 설정

# vagrant  계정으로 작업

sudo vi /etc/ssh/sshd_config
--------------------------------------
PubkeyAuthentication yes로 변경
PasswordAuthentication yes로 변경
---------------------------------------
sudo service ssh restart

sshd_config 설정을 변경하지 않고, A-Master 노드에서 다른 노드로 SSH 접속을 하면 "permission denied" 오류가 발생한다. 즉 이 작업은 A-Master에서 다른 노드에 접속하기 위해서나 공개키를 배포하기 위해서 미리 설정해야 한다.

 

3. A-Master(controlz) 노드 작업 #2

A-3. 공개키 기반 SSH 접속 환경 설정 #1

# vagrant 계정으로 작업
cd

# A-Master의 비밀키를 다른 노드에 배포
ssh-copy-id vagrant@node01          # kmaster01
ssh-copy-id vagrant@node02          # worker01
ssh-coipy-id vagrant@node03         # worker02

키가 정상적으로 복사되면 아래 같은 결과를 확인할 수 있음.

"B-1" 을 설정하지 않고 ssh-copy-id 를 수행하면 아래와 같은 오류가 발생함

이로써 A-Master에서 다른 노드로 별도의 비밀번호 없이 SSH 접속이 가능하게 되었다.

 

[참고] SSH 접속 또는 ansible -m ping 등 접속 테스트 시 오류가 나는 경우 "ssh -v -i vagrant node01" 명령으로 접속환경 디버깅 해볼 것.

 

A-4 Ansible 환경 설정

# vagrant 계정으로 작업

cd ~/kubespray

vi ansible.cfg
# 아래 캡처와 같이 내용 수정
- remote_user 설정(Ansible 실행을 위한 기본 계정을 설정함)
- private_key_file 설정(SSH 접속을 위한 비밀키 정보를 설정함)
- privilege_escalation 설정(k8s 등 특정 SW를 root 계정으로 실행/설치할 수 있도록 설정함)

A-5 Ansible Inventory(host) 파일 작성

# vagrant 계정으로 작업

cd ~/kubespray
cp -rfp inventory/sample inventory/my-cluster
cp inventory/my-cluster/inventory.ini inventory/my-cluster/hosts.ini
vi inventory/my-cluster/hosts.ini
# 아래 화면 캡처대로 hosts.ini 파일을 수정

# Ansible 상태 확인
ansible all -i inventory/my-cluster/hosts.ini -m shell -a "hostname"

모든 노드와 통신이 정상적인 경우 아래와 같은 결과를 볼 수 있다.

A-6 Kubespray 설치

# flannel Network 사용
vi inventory/my-cluster/group_vars/k8s-cluster/k8s-net-flannel.yml
# flannel_interface 설정

k8s의 가상 네트워크로 flannel를 사용하기 위해서는 호스트 전용 인터페이스를 설정해야 한다. 각 노드에서 "ip addr" 명령을 사용하여 IP를 할당하고 있는 인터페이스 명을 확인할 수 있다.

# addon 활성화
vi inventory/my-cluster/group-vars/k8s-cluster/addon.yml
------------------------
- helm 활성화
- metrics_server 활성화
- ingress_controler 활성화
------------------------
# 아래 캡처 참고

                       ...

# proxy mode 변경
vi inventory/my-cluster/group_vars/k8s-cluster/k8s-cluster.yml
# 아래 캡처 참고

# Kubespray 설치
cd ~/kubespray
ansible-playbook --flush-cache -i inventory/my-cluster/hosts.ini cluster.yml -v

Kubespray가 k8s 클러스터가 정상적으로 설치하면 아래와 같은 결과를 확인할 수 있다.


맹목적으로 Ansible의 자동화 스크립트를 작성하다 보니 자동화를 위해 필요한 작업을 명확히 구분하지 못했었다. 수동으로 Kubespray를 다시 실행해 보면서 Vagrant 계정을 통한 Ansible 실행 환경 구성이 필요함을 알게 되었다.

자동화를 위한 몇 가지 단계를 정리해 보면...

 

1. Vagrant로 VM을 생성한다.

2. 모든 노드에 기본적인 SW 패키지(git, net-tools 등)들을 설치한다.

3. 모든 노드에 vagrant 계정의 sudo 권한 및 sudo 사용 시 no password 설정을 추가한다.

4. A-Master에서 kubespray를 다운로드한다.

5. A-Master에서 kubespary 의존성 모듈을 설치한다.

6. A-Master에서 ansible.cfg를 수정하여 Ansible을 통한 SSH 접속, 사용계정, Root사용 설정 등을 설정한다.

7. A-Master에서 vagrant 계정으로 SSH 키를 생성한다.

8. 모든 노드의 sshd_config 를 수정하고, "6"에서 생성한 키를 노드들에게 배포(복사)한다.

9. Kubespray의 network, proxy, addon 등을 설정한다.

10. ansible-playbook을 통해 k8s를 설치한다.

 

이제 이 10가지를 주요 작업을 자동화하기 위해 공통적인 단계와 개별 단계 및 순서를 정하여 스크립트를 개발하면 된다.

 

4편 Ansible를 활용한 Kubernetes Cluster 자동화