본문 바로가기

IT 엔지니어/CLOUD

K8S -kubespray

KUBERNETES

[ KUBERNETES ]

  • Container를 자동으로 배포하고 관리해 주는 플랫폼
  • 많은 서버에 Container가 돌아가는데, 이걸 자동으로 설치하고 실행 상태를 관리해 주는 시스템
  • Docker Container를 직접 띄우면 발생하는 문제를 해결해 줌
    • 여러 대 Server에 Container 배포하려면 일일이 명령어 입력
    • 하나가 다운되면 자동 재시작이 안 됨
    • 트래픽이 많아지면 Container 자동 증가 안 됨

[ KUBERNETES 핵심 구성요소 ]

Master Node
Cluster 전체를 제어하는 관리자 역할
Worker Node
실제 Container(Pod)를 실행하는 일꾼
Pod
Container를 실행하는 최소 단위 (보통 1Pod = 1 Container)
Delpoyment
Pod의 생명주기를 관리 (언제 몇 개 만들지 등)
Service
Pod에 접근하기 위한 Network 설정 (Load Balancing 포함)
kubelet
각 노드에서 Pod 상태를 감시하고 master와 통신
kube-proxy
Network Routing 담당

[ KUBERNETES 작동 원리 ]

  1. 사용자가 kubectl로 Container 앱 배포 요청
  2. Master(Node)가 그걸 받아서 어느 Worker에 띄울지 결정
  3. Worker Node의 kubelet이 Pod 생성
  4. Pod 안에 Container 실행됨
  5. Service를 통해 외부 요청을 해당 Pod로 Routing
  6. 문제가 생기면 자동 재시작 or 다른 노드로 재배포

KUBERNETES CLUSTER

[ KUBESPRAY ]

  • Kubernetes Cluster를 자동으로 설치해 주는 도구

master/node1/node2/node3 총 4대를 묶어서 Kunetbetes Cluster로 만들 것이다. hosts는 동일하게 입력해 주고, 192.168.10.50/100/150/200 모두 hosts, hostname 등록해 준다

[ KUBESPRAY 다운로드 ]

  • Kubespray 설치파일을 .tar.gz 형식으로 다운로드

[ KUBESPRAY 압축 해제 ]

# tar -xzf v2.23.2.tar.gz

압축 해제 후 디렉터리 이름을 kuberspray로 변경해 준다.

# tar -xzf v2.23.2.tar.gz

# mv kubespray-2.23.2/ kubespray

# cd kubespray

[ SAMPLE INVENTORY 복사 ]

  • Cluster에 들어갈 노드들 정보 설정하는 파일 (Cluster 설정용 Sample)
# vi /kubernetes/inventory/sample

kubernetes/inventory/sample(예시 파일)을 복사해서 이름을 변경해 준다.(damicluster)

# cd kubespray/inventory

# cp -rfp sample ./damicluster

[ 노드들의 IP 주소 저장 ]

  • IPS=() 배열로 IP를 저장
  • 나중에 이 배열을 가지고 자동으로 설정 파일 생성 가능
# declare -a IPS=(IP IP IP ...)

# cd /root/kubespray

# declare -a IPS=(192.168.10.50 192.168.10.100 192.168.10.150 192.168.10.200)

 

 

 

  1. kubespray 설치
wget <https://github.com/kubernetes-sigs/kubespray/archive/refs/tags/v2.23.2.tar.gz>

tar zxf v2.23.2.tar.gz
----------------------------------------------------------------------------------------
mv kubespray.v2.23.2  kubespray

cd kubespray/
cp -rfp inventory/sample inventory/mycluster

declare -a IPS=(192.168.10.50 192.168.10.100 192.168.10.150 192.168.10.200)
---------------------------------------------------------------------------------------------------


dnf -y install python3-pip wget git vim sshpass && sleep 1 && python3 -m pip install --upgrade pip
--------------------------------------------------------------------------------------------------
pip3 install ruamel.yaml <- 중요
--------------------------------------------------------------------------------------------
pip3 install -r requirements.txt


---------------------------------------------------------------------------------------------------
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

 

 

 

 

[ 필수 패키지 설치 + PIP 업그레이드 ]

# dnf -y install python3-pip wget git vim sshpass && sleep 1 && python3 -m pip install --upgrade pip

이제 Kubespray 설치를 위한 환경 준비 + Cluster 설정 자동화 단계이다.

우선 필수 패키지를 설치하고, PIP 업그레이드를 한다.

WRANING은 root로 실행해서 생기는 일반적인 안내문일 뿐, Kubespray는 정상적으로 설치된 화면이다.

[ PYTHON 라이브러리 설치 ]

  • requirements.txt : Kubespray가 필요한 Python 패키지 목록이 들어있음
  • 추후 inventory 같은 파일을 실행할 수 있게 함
# python3 -m pip install -r requirements.txt

[ HOST 설정 자동 생성 ]

# CONFIG_FILE=inventory/damicluster/hosts.yaml \
python3 contrib/inventory_builder/inventory.py ${IPS[@]}

핵심 설정 파일인 hosts.yaml을 inventory/damicluster 폴더 안에 자동으로 생성해 줬다.

# CONFIG_FILE=inventory/damicluster/hosts.yaml \ python3 contrib/inventory_builder/inventory.py ${IPS[@]}

# cat inventory/damicluster/hosts.yaml

[ KUBERNETES CLUSTER 설치 ]

  • cluster.yml 이라는 Ansible Playbook 실행
# ansible-playbook -i inventory/damicluster/hosts.yaml --become --become-user=root cluster.yml

hosts.yaml 파일이 완성된 상태로, 이제 Ansible로 Kubernetes Cluster를 설치할 준비가 끝났다. 모든 노드에 Kubernetes를 자동 설치해 준다. SSH 연결을 해준 상태에서 실행이 되기 때문에 SSH 비밀번호 없이 접속 가능하게 설정해 준다.

# ssh-keygen

# ssh-copy-id root@192.168.10.50

# ssh-copy-id root@192.168.10.100

# ssh-copy-id root@192.168.10.150

# ssh-copy-id root@192.168.10.200

# ansible-playbook -i inventory/damicluster/hosts.yaml --become --become-user=root cluster.yml

Enter - Enter - Enter

해당 Server root passwd 입력 x4

passwd 없이 SSH 접속되지 확인

 

# dnf -y install yum-utils device-mapper-persistent-data lvm2

# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

systemctl enable --now docker

# ansible-playbook -i inventory/damicluster/hosts.yaml --become --become-user=root cluster.yml

 

 

 

 

 

 

 

5. 라벨 변경

kubectl label node node1 node-role.kubernetes.io/worker=worker
kubectl label node node2 node-role.kubernetes.io/worker=worker
kubectl label node node3 node-role.kubernetes.io/worker=worker

 

 

 

6. 확장

1️⃣ 추가 노드에 SSH 접속 확인

 

모든 노드에 마스터에서 SSH 접속 필수(ssh-copy-id 필요)

2️⃣ hosts.yaml에 노드 추가

  hosts:
    master:
      ...
    node1:
      ansible_host: 192.168.10.100
      ip: 192.168.10.100
      access_ip: 192.168.10.100
  children:
    kube_node:
      hosts:
        master:
        node1:  <- 새로 추가

3️⃣ 노드 join 플레이북 실행

ansible-playbook -i inventory/mycluster/hosts.yaml scale.yml -b -v

'IT 엔지니어 > CLOUD' 카테고리의 다른 글

Docker 기본 명령어  (0) 2025.05.20
Docker Kubespray -1  (0) 2025.05.19
Docker yml  (1) 2025.05.18
Docker Registry  (0) 2025.05.17
Docker image build  (0) 2025.05.16