Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
** 아래의 게시글을 참조해서 설치하였습니다. **
https://lewis-kku.tistory.com/112
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)
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로 각각에 접속
각각 노드에 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
최신 버전을 깔고 싶다면, 위의 공식 링크에서 설치 가이드를 참조하자.
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도 설치 가능.
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
이제 모든 과정이 완료되었다.
마스터 노드에서 실행되어야 할 서비스 컨테이너들이 정상적으로 실행되었다.
'개발 > Kubernetes' 카테고리의 다른 글
Kubernetes Pod 활용하기 (Pause container, label, volume) (0) | 2024.03.03 |
---|---|
Kubernetes Kubectl 기본 명령어 정리 (0) | 2024.03.03 |
Kubernetes Namespaces VS Linux Namespaces (Pause 컨테이너) (0) | 2024.03.03 |
[Vagrant] Kubeadm로 쿠버네티스 직접 설치하기 (0) | 2024.03.02 |
쿠버네티스 란? (0) | 2024.03.02 |