[K8s] 쿠버네티스 (겨우) 설치 - 궁금한 것들과 에러 해결…? ㅠ

sookyoung.k·2024년 11월 7일
0

🌿 교보DTS TIL

목록 보기
25/39
post-thumbnail

쿠버네티스 이 미친것

하루 종일 강사님 포함 모든 사람들이 각종 에러에 맞서 싸우며 힘들게 한 실습 내용들을 정리해보려고 작성한다. 하... 진짜 욕나옴...
정말 계속 에러가 발생하고 눈물날 것 같았지만... 태초마을로 몇 번이고 되돌아가서 결국 해결하긴 했다! 암튼 까먹을 것 같아서 적어두고, 적는 김에 궁금했던 내용들을 구글링 + ai에게 물어보면서 공부하고... 겸사겸사 벨로그 업로드~~


base

VirtualBox 및 VM 설치, 각 VM마다 Ubuntu 설치 && 고정 IP 주소 할당하고 동일한 네트워크 내에서 통신 가능하도록 설정

VirtualBox는 이미 설치가 되어 있었고, VM도 원래 쓰던거에서도 써보고 복제를 해서도 새로 생성하고 이랬는데 ^^

안되면 그냥 새로 만들자. 그냥 이게 답이다. 아직 아무것도 설치되지 않은 순수한... VM을 만들어서 겨우 성공했다. 미친것 같다 걍... VM 새로 만들어서 Ubuntu 설치하는 것도 시간이 오래걸리지만... 어차피 답도 안보이길래 새로 설치했다. 하아 개빡침...

  • VM1: Master노드
  • VM2, VM3: Worker노드

이렇게 사용할 것이다.

몇 번을 설치했나 몰라요 ^^... 엉엉

설치 전 VM 공통 준비사항

이 부분은 크게 설명이 필요 없는 부분이기에 그냥 명령어만 적고 지나가겠다!

  1. 운영체제 업데이트
sudo apt update && sudo apt upgrade -y

* -y는 그냥 다 자동으로 yes! 하게 해주는 옵션

  1. 필수 패키지 설치
sudo apt install -y python3 python3-pip sshpass
sudo apt install git

* sshpass는 왜 설치하는 걸까?!
👉 sshpass는 SSH 암호를 자동으로 전달할 수 있게 해준다! 얘가 있으면 SSH 연결 시 사용자 입력 없이 암호를 제공할 수 있다.

Kubernetes 클러스터를 구축할 때, 노드 간 SSH 연결이 필요할 때가 많다. 특히 우리처럼 Ansible과 Kuberspray를 사용할 때는 연결 자동화를 위해 sshpass가 유용하기 때문에 필수 패키지가 된 것이다. 보안상 취약점이 있기 때문에 가능하면 SSH키 기반 인증이 더 안전하기 때문에 그것을 사용하는 것이 좋다.

  1. 호스트명 및 IP 주소 설정

* ifconfig 명령어를 사용하기 위해서는 sudo apt install net-tools를 먼저 해줘야 함 ㅠ net-tools 패키지가 있어야 저 명령어로 ip주소 확인이 가능하다. 새로 만든 내 vm은 아주 퓨어한 태초의 vm이기 때문에 설치가 필요했다.

각 VM마다 다른 VM의 IP주소와 호스트명을 추가해준다.

# 호스트명 설정 
sudo hostnamectl set-hostname master 
# VM1, VM2 IP 주소와 호스트명 추가
echo "192.168.0.20 worker1" | sudo tee -a /etc/hosts
echo "192.168.0.91 worker2" | sudo tee -a /etc/hosts

* /etc/hosts 파일`
👉 운영체제 내에서 호스트 이름과 IP 주소간의 매핑을 정의하는 파일

네트워크 관리사 2급 CBT 준비할 때 엄청 많이 나왔던 친구 ^^ 살짝 정리하고 가자면,

  • 호스트 이름 확인
    • 네트워크 상 다른 호스트에 연결할 때 /etc/hosts 파일을 참조하여 호스트 이름을 IP 주소로 변환한다 (호스트 이름을 입력하면 자동으로 IP 주소로 해석될 수 있도록)
  • 로컬 네트워크 내 이름 확인
    • 로컬 네트워크 내의 호스트 이름과 IP 주소 매핑 정의
  • 보안 및 성능 개선
    • DNS 조회를 우회하고 로컬호스트 이름-IP 매핑을 사용해서 성능 향상
    • 특정 호스트 연결 차단하는데 사용 가능 (보안)
  1. SSH 설정

아까 sshpass를 설치했으니! 써먹어야겠죠? 클러스터 노드 간 암호 없이 통신하기 위해서!! 각 VM에서 SSH키를 생성하고 각 VM에 상호 간 키를 추가해주는 과정이다.

# 키 생성 
ssh-keygen -t rsa -b 2048

# 키 추가
ssh-copy-id test@192.168.0.20 # worker1에 추가
ssh-copy-id test@192.168.0.91 # worker2에 추가

#만약 뭐가 안된다! 싶으면 상태 확인. 난 ssh가 없었다. 
sudo systemctl status ssh

# 만약 설치되어 있지 않다면 설치... 이러면 무사히 잘 된다.
sudo apt update
sudo apt install openssh-server

# 파일 권한 제어
chmod 600 ~/.ssh/authorized_keys
  • ssh-keygen으로 SSH 키 쌍을 생성
  • ssh-copy-id 명령어를 통해 worker 노드들의 authorized_keys 파일에 공개키를 추가

위 과정을 거치면 master 노드에서 worker 노드로 SSH 접속이 가능하다.
모든 노드에서 키를 생성할 필요는 없고, Master 노드에서 생성한 키를 Worker노드에 배포하면 된다!

authorized_keys 권한을 변경하는 건, SSH 보안을 위해서다. 파일 소유자에게 읽기, 쓰기 권한을 부여하고 다른 사용자에게는 접근을 금지하는 권한 설정을 해주었다. 파일에 대한 접근을 최소화하기 위해서다.


이제 본격적인 시작이다. Kuberspray를 설치해줄건데...!

이 자식 설치하느라고 머리가 제일 아팠다. 일단 뭔지도 모르고 설치하라니까 하긴 하는데 하 얘 때문에 vm을 몇 번을 버리고 몇 번을... (생략)

그래서 이것이 무엇이냐! 정리를 한 번 해보고 넘어가려고 한다.

Kuberspray

Kubernetes 클러스터를 배포하고 관리하기 위해 Ansible을 사용하는 오픈소스 프로젝트

쿠버네티스를 쉽게 설치하게 도와주는 자동화 도구이다. (쉽게 도와주는거라매) Ansible을 통해서 구축하고자하는 설정값만 맞게 변경해주면 Kubernetes cluster 구축을 자동으로 도와준다. Kubernetes 배포에 필요한 모든 구성 요소를 자동으로 설치하고 구성해주기 때문에 자주 사용한다.

Kuberspray를 사용하면 Kubernetes 클러스터 구축 프로세스를 크게 간소화할 수 있다! 단순히 Ansible Playbook을 실행하기만 하면 Kubernetes 클러스터가 자동으로 배포된다.

Ansible

서버 설정을 자동화하고, 인프라를 구성하는데 주로 사용되는 오픈소스

어차피 곧 나올 내용이니 Ansible도 같이 설명한다. 간단하게 요약하자면 구성 관리 및 자동화 도구이다. Kubernetes에서만 사용하는게 아닌 일반적인 구성 관리 도구이고, Kuberspray는 Kubernetes 클러스터를 구축하기 위해 Ansible을 활용하는 것이다.

Ansible Playbook이라는 YAML 파일을 사용해서 여러가지 작업을 순서대로 정의할 수 있다. 간단한 구성은 물론이고 복잡한 워크플로우까지 다양한 작업을 자동화할 수 있다.

Kuberspray 설치 (VM1)

본격적인 설치다.

  1. kubespray git clone
git clone https://github.com/kubespray/kubespray.git

웃기게도 오타 하나 없이 잘 입력해도 git clone이 안 되는 경우가 있다. 그럴 땐 그냥 Kuberspray 공식 깃허브 레포에 들어가서 주소를 복사한 후 clone 해주면 된다. 웃기죠?...

  1. 가상환경 생성
python3 -m venv myenv
source myenv/bin/activate

가상환경을 사용하는 이유는 예전 글에에서 작성한 적 있으므로 패스.

  1. Kuberspray에 필요한 Python 라이브러리 설치
# 폴더 이동! 뒤에 있을 명령어들의 경로에 영향을 주니 빼먹지 말것. 주의!
cd kubespray
# 종속성 설치
pip3 install -r requirements.txt

Kuberspray는 Ansible을 사용하여 쿠버네티스 클러스터를 배포한다. 때문에 Ansible과 관련된 Python 라이브러리들이 필요하다! 그리고 requirements.txt 파일에는 Kuberspray에 필요한 파이썬 종속성들이 정의되어 있다. 때문에 install 명령어를 실행하면 해당 라이브러리들이 설치되어 Kuberspary가 필요로하는 모든 종속성을 설치할 수 있다.

  1. inventroy 파일 생성 (사용자 고유 클러스터 구성 파일 생성)
cp -rfp inventory/sample inventory/mycluster

기본적인 인벤토리 샘플을 mycluster라는 새 디렉토리에 복사한 후 나만의 고유한 클러스터 구성 파일을 생성할 수 있다.

디렉토리를 복사한 후

# inventory.ini 
[all]
master ansible_host=192.168.0.18
worker1 ansible_host=192.168.0.20
worker2 ansible_host=192.168.0.91

[kube_control_plane]
master

[kube_node]
worker1
worker2

[etcd]
master

[k8s_cluster:children]
kube_controle_plane
kube_node

inventory.ini 파일을 위와 같이 작성해준다.

Kubernetes 클러스터 설치 (Ansible) (VM1)

그럼 이제 본격적으로 쿠버네티스 클러스터 설치 시작이다!

  1. Ansible 버전 확인

이게... 버전문제가 있는건지 없는건지 잘 모르겠는데... 버전 관련해서 문제가 참 많았다. 또, ansible을 설치하면 자동으로 ansible-core도 설치된다 ^^ 닌자처럼 잠입해 아주 그냥... 그래서 혹시라도 삭제 후 재설치를 해야 하는 일이 생긴다면 꼭 두 패키지 모두 삭제를 해주어야 한다.

# ansible 버전 확인 명령어
ansible --version
# 삭제 후 재설치
pip3 uninstall ansible ansible-core
pip install ansible==9.8.0 ansible-core==2.16.9
  1. Ansible 설정

Ansible은 호스트를 관리하기 위해서 기본적으로 /etc/ansible/hosts 파일을 사용한다.

sudo vi /etc/hosts

위 명령어를 통해서 파일에 접근한 후

192.168.0.18 master

VM1의 IP와 호스트명을 추가해준다.

  1. 쿠버네티스 클러스터 설치 (Ansible-playbook)

그 후 Kuberspray에서 제공하는 Ansible 플레이북을 통해 쿠버네티스 클러스터를 설치한다.

ansible-playbook -i inventory/mycluster/inventory.ini --become --become-user=root --private-key=~/.ssh/authorized_key --ask-become-pass -v cluster.yml

👉 --become --become-user=root: Ansible이 각 노드에서 루트 사용자 권한으로 작업을 수행하도록 지정한다
👉 --private-key=~/.ssh/authorized_key: 각 노드에 대한 SSH 연결에 사용할 개인 키 파일의 경로 지정 (앞서 생성한 SSH 키쌍의 개인키)
👉 --ask-become-pass: 루트 사용자 권한을 위한 암호를 묻는데, 각 노드의 root 계정 암호이다
👉 -v: 상세한 로그 출력 활성화
👉 cluster.yml: Kubernetes 클러스터 배포를 정의한 Ansible Playbook 파일의 이름이다. cat cluster.yml 명령어를 입력하면 볼 수 있다.

* 경로 주의!

test@master:~$ ansible-playbook -i inventory/mycluster/inventory.ini --become --become-user=root cluster.yml
ERROR! the playbook: cluster.yml could not be found

이런 에러가 뜬다면 경로 문제다. cluster.yml 파일은 Kuberspray 디렉토리 안에 있다. 따라서 cd kuberspary 명령어를 통해 디렉토리 이동 후 명령어를 실행해야 한다.

참고로 이 과정이 정말... 빡쳤다. 기본적으로 설치 자체가 엄청 오래 걸린다. 그래서 에러인지, 정상적으로 설치가 되는건지 구분이 안 감 ^^ 하염없이 기다리게 될 수 있음... 최소 5분은 기다려야 하고, 만약에... 10분이 넘어가도 아무런 반응이 없다?... 그럼 다시 태초마을로 돌아가시길 권장한다...

Kuberctl 설정

  1. Curl을 사용하여 Kubctl 바이너리 설치
# 최신 릴리즈 다운로드
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 바이너리 검증
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
# kubectl 바이너리를 체크섬 파일을 통해 검증 
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check

👉 curl -LO: cURL 명령어로 kubectl 바이너리 파일을 다운로드 한다. 공식다운로드 사이트에서 제공하는 최신 버전의 바이너리 파일을 다운로드 받을 수 있다.
👉 첫 번째 명령어를 실행하면 현재 디렉토리에 kubectl 파일이 생성된다.
👉 두 번째 명령어는 kubectl 바이너리의 SHA256 체크섬 파일을 다운로드 한다.
👉 세 번째 명령어의 sha256sum --check: 가져온 체크섬 값과 실제 파일의 체크섬을 비교하여 무결성을 확인한다.

신뢰할 수 있는 kubectl 바이너리 파일을 설치하는 과정!

  1. kubectl 설치
# kubectl 설치 
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 최신 버전인지 확인하자! 
kubectl version --client

👉 앞서 다운로드한 kubectl 바이너리 파일을 시스템의 /usr/local/bin 디렉토리에 설치한다!
👉 -o root -g root: 파일 소유자와 그룹을 root로 지정
👉 -m 0755: 파일 권한을 rwxr-xr-x로 설정한다. 모든 사용자가 kubectl 명령을 실행할 수 있게 하는 것이다.

  1. kubectl 구성 파일 설정
mkdir -p ~/.kube

cp /etc/kubernetes/admin.conf ~/.kube/config

sudo chown $(id -u):$(id -g) ~/.kube/config

👉 ~/.kube 디렉토리를 생성한다. 쿠버네티스 클라이언트 구성 파일인 config를 저장할 장소이다.
👉 admin.conf 파일에는 Kubernetes API 서버에 연결하기 위한 인증 정보가 담겨있다. 그걸 복사해오면 kubectl이 쿠버네티스 클러스터에 연결할 수 있게 된다.
👉 복사한 후 파일 소유권을 현재 사용자로 변경한다. 이를 통해서 파일에 접근이 가능해진다.

Kubernetes 클러스터에 접근할 수 있도록 kubectl 클라이언트를 구성하는 과정!

  1. 클러스터 상태 확인

길고 힘들었던 과정이 드디어 끝났다... 마지막으로 노드들이 연결이 잘 되었나 확인만 하면 된다. 엉엉...

kubectl get nodes

? 왜 때문에 Not Ready...? 분명 아까는 잘 됐는데 (소름짤 주의 ㅅㅂ) 하... 하.... ㅅㅂ 처음엔 잘 됐어요 분명히... 암튼... 지금은 복습하는 중이니깐 넘어간다...

지금 vm 또 네트워크 유실되고 지랄... 아!!!!!!!!!!!!! 진짜 왜그러는데!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 왜 또 지랄인데 아 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

암튼 저게 원래는 다 ready로 뜹니다....

노드 상태 확인

일단 의욕이 좀 사라지긴 했는데... 암튼... 하... 우리는 VM1과 VM2, VM3가 서로 잘 연결이 되었는지 확인을 해야 한다.

ssh test@192.168.0.18

kubectl get noded

👉 마스터 노드에 ssh로 접속한 후
👉 쿠버네티스 클러스터의 모든 노드를 확인한다.

아깐 다 ready였는데 말입니다... 지금은 worker2가 파업 중이다. 미친놈인가? 일단... 암튼 그렇습니다....

각 노드의 Pod 상태 확인

  1. Kubernetes 핵심 Pod 확인
kubectl get pods --all-namespaces -o wide

👉 다양한 Pod들이 표시되는데 대충 각 노드가 클러스터 구성 요소를 올바르게 실행하고 있는지 확인 가능한 명령어다.

이런식으로 뜨면 된다.

  1. 마스터에ㅐ서 워커 노드로 ping

원래는 다 잘 됐거든요...? 위는 성공이고 아래는 성공하지 못했다. Worker2가 죽었기 때문이다. 완전 럭키 비키네... 벨로그에 성공, 실패 사례 둘 다 캡쳐해서 올릴 수도 있고...

  1. Kubernetes 클러스터 네트워크 확인
# replica 명령어 사용 불가함 
kubectl run test-pod --image=nginx --replicas=2

# 아래 명령어를 사용해야 한다!
kubectl create deployment test-pod --image=nginx --replicas=2

# 기존 pod 삭제
kubectl delete pod test-pod
# 기존 deployment 수정 
kubectl scale deployment test-pod --replicas=2

하 분명히 아까는 다 잘됐었거든요.

노드 간 네트워크 연결 확인 & 시스템 로그 오류 확인

  1. Pod 간 통신 테스트
kubectl exec -it test-pod-5d5589b8d9-8tvrq -- /bin/bash ping 192.168.0.91
# 👉 worker1 노드에서 worker2 노드로 ping 때리기 안됨
# 👉 결론적으로 컨테이너 내부에 ping 명령어가 없기 때문임 

# 1. 해당 pod 내부 패키지 목록 확인
kubectl exec -it test-pod-5d5589b8d9-8tvrq -- apt list --installed
# 👉 ping 없음 
# 2. ping 패키지 설치
kubectl exec -it test-pod-5d5589b8d9-8tvrq -- apt update
kubectl exec -it test-pod-5d5589b8d9-8tvrq -- apt install -y iputils-ping
# 3. `/bin/sh -c`는 컨테이너 내부에서 명령어 직접 실행 가능
kubectl exec -it test-pod-5d5589b8d9-8tvrq -- /bin/sh -c "ping 192.168.0.91"

컨테이너 이미지에 따라서 기본 ping 명령어가 포함이 되어있지 않을 수 있다!

  1. 노드 이벤트 확인
kubectl get events --all-namespaces

노드 연결 문제를 진단하기 위해 위 명령어를 사용할 수 있다.

  1. Kubelet 서비스 로그 확인
sudo journalctl -u kubelet -f 

각 워커 노드와 kubelet 서비스 로그를 확인해서 올바르게 통신하고 있는지 확인할 수 있다. vm2, vm3에서 실행하면 된다.

나는 갑자기 문제가 생겨버렸는데 ^^...
일단 다 잘 작동하는 걸 처음에 확인하긴 했다. 쿠버네티스 클러스터를 잘 설치하면 웬만하면 이후에는 문제없이 잘 확인할 수 있을 것이다.


느낀점

아… 아 진짜 너무 화가 났다. 왜…? 왜 안돼!!!!!!!!!! 정말 하루를 거의 날렸다. 그마나 나는 마지막에 어케 되기라도 했지… 그냥 VM 새로 설치하는게 답이었는데, 이것도 안 되시는 분이 많았고… 그리고 나 왜 갑자기 네트워크 유실돼…? 이해가 안 간다.
태초마을로 돌아가는 건 참 크고 슬픈 결심인데 다행(?)이랄까… 모두 다같이 막혀서 안되길래 그냥 큰맘먹고 우분투까지 새로 깔아가며 해결할 수 있었다. 하하?^^… 후… 안됐으면 걍 소주 마시러 갈뻔^^… 한 수십번쯤 지금 마시는 핫식스가 소주이길 정말 간절히 바랐음…

정말 힘들었는데 이게 또 해결된아고 이렇게 기쁠일이야? 또 이게 성공하면 도파민 싹 돎… 안되면 야먀 도는거지 뭐… 암튼 겨우… 끝? 냈다. 하… 이런 수준인데 내일 쿠버네티스 끝? 리얼리? 이제 책보고 독학할 시기가 됐다! 잘 배워두려고 했는데 실습은 역시 쉽지 않다. 그래도 파이팅~~


본 포스팅은 글로벌소프트웨어캠퍼스와 교보DTS가 함께 진행하는 챌린지입니다.

profile
영차영차 😎

0개의 댓글