상세 컨텐츠

본문 제목

[Kubernetes] AWS EC2에 Kubernetes직접 구축하기 / EKS ❌

DevOps 연구 노트/아마존 웹 서비스

by bydawn25 2023. 9. 20. 21:21

본문

여러분 안녕하세요 ? ㅎ 새벽이는 잘 살아있답니다 ㅎㅎ..

 

회사에서 업무에 치이고, 과제에 치이고 개인 공부에 치이느라 기술블로그 관리를 소홀히 했어요.

 

이번에 수행한 과제가 직접 Kubernates구축하기 였는데 클라우드 업체가 제공하는 오케스트라 툴을 사용하지 않고 직접 컨테이너 환경을 구동하고 CI/CD를 이해하는 좋은 기회였어요.

 

 

 

그런데 자료가 너무 부족해서 시간이 오래걸렸어요 ㅠㅠ

 

제가 한달동안 그려모은 지식들 여기서 싹싹 풀어 놓을 테니 다들 당명하신 문제의 실마리를 가져가시기를 바래요!!

 

 

 

 

 

 

쿠버네티스란?

https://www.udemy.com/course/learn-kubernetes/

사실 저는 쿠버네티스가 정확이 뭔지도 몰랐어요 ㅋㅋㅋㅋ 

 

첨부한건 UDEMY강의인데 처음 강의를 수강하신다면 만 오천원에 수강하실 수 있습니다. 여기 살포시 제 링크를 놓고 갈께요. 여기를 통해 접속하시면 혜택을 받으실 수 이썽요.

 

 

 

 

 

위는 제가 설계한 쿠버네티스 설계도 입니다. 쿠버네티스는 컨테이너(도커!)를 안정적으로 실행시켜주는 툴이라고 생각하시면 됩니다.

 

저는 처음에 컨테이너가 이미 효율적인데 왜 오케스트라 역활까지 필요한거지? 했는데 사실상 도커가 부족한 부분을 채워주는 느낌이였어요.

 

 

 

이 포스팅은 쿠버네티스에 대한 자세한 개념을 설명하지는 않기에 개념이 필요하신 분은 인터넷 강의나 아래 공식 DOCUMMENTATION을 추천드립니다.

 

https://kubernetes.io/

 

Production-Grade Container Orchestration

Production-Grade Container Orchestration

kubernetes.io

 

 

 

 

 

 

AWS EC2에서 Kubernetes를 사용하기 위한 사양

제가 aws에서 사부작 사부작 가지고 놀기 위해서 사용하는 사양은 t2.micro인데요. 처음에는 이 사양으로 쿠버네티스 구축을 시도했어요 ㅋㅋ

 

근데 갑자기 안됨 ㅠㅠ

 

 

찾아보니 쿠버네티스는 최소 2개의 cpu를 가지고 있어야 설치가 가능하다고 합니다.

 

 

 

 

 

 

최소 사양으로 실습을 하시는 분이면 t2.medium으로 설치하시면 됩니다.

돈은 나가겠지만 어쩌겠어용! ㅋㅋㅋㅋ

 

 

 

 

 

 

이제 진짜 쿠버네티스를 설치해봅시다.

 

Kubelet : 마스터가 아닌 워커노드(실행노드)의 상태를 관리해주는 컴포넌트
Kubectl : Kubernetes api를 통해서 kubernetes와 소통을 도와주는 명령어 컴포넌트
Kubeadm : Kubernetes 클러스터 실행과 배포를 도와주는 오픈소스 프로젝트 도구

쿠버네티스를 간편하게 실행시켜주는 Minikube라는 툴이 있습니다. 하지만 저는 정공법으로 직접 클러스터를 구축할 것이기 때문에 Kubernetes를 운영하는데 필요한 Kublet, Kubeadm, Kubectl을 설치해볼께요.

 

 

 

 

 

위의 구성도를 참고해주세요. 저대로 만들어 볼꺼에요!

저는 마스터 노드1개와, 워커노드 2개로 구성해보겠습니다. 

 

위에 말씀드린 t2.medium으로 3개의 인스턴스를 생성하시고 각자 이름을 붙여서 구분해주세요.

 

 

 

 

 

먼저 마스터 노드를 구축해 보겠습니다.

쿠버네티스는 마스터 노드를 control plane이라고 하기도 해요. 쿠버네티스 클러스터의 대왕으로 여기서 모든일을 분배하고 관리하기 때문에 먼저 마스터 노드를 설정해야 합니다.

 

 

 

1. 쿠버네티스는 루트 권한을 요구합니다. 루트 계정으로 바꿔주세요.

sudo su

 

 

 

 

2. 필요한 라이브러리를 먼저 설치해 줍니다

apt update && apt install -y jq apt-transport-https ca-certificates libseccomp2

여기서 앞에 두 라이브러리는 kubernetes에 앱을 deploy할때 https로 접근하기 위해 필요한 라이브러리입니다.

 

마지막 라이브러리는 우분투 리눅스 상 파일 시스템 호환을 위해 필요한 라이브러리 입니다. 

 

 

 

 

3. 쿠버네티스가 Docker와 소통하기 위해 필요한 CRI-O설치하기

//도커 환경이 사용하는 커널 모듈 설치
modprobe overlay
modprobe br_netfilter

//쿠버네티스가 도커를 알아볼 수 있도록 Iptable 설정하기
//이 부분이 제대로 되지 않으면 쿠버네티스 내부에서 서로를 찾지 못한다
cat <<EOF> /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/#:~:text=Docker%20Engine%2C%20being%20a%20project,containers%20with%20the%20Docker%20runtime.

 

The differences between Docker, containerd, CRI-O and runc

The container ecosystem is full of terms you’re expected to know. We’ve decoded them for you.

www.tutorialworks.com

쿠버네티스는 도커 등의 컨테이너 서비스를 운영해주는 오케스트라이기 때문에 컨테이너와 소통하기 위한 사전 설치가 필요하다.

 

그래서 CRI가 뭔데? 궁금하다면 위 링크 클릭클릭. 설명이 잘 되어 있다.

 

 

 

 

 

4. CRI-O설정을 잘 마쳤다면 반영해주기

sysctl --system

 

 

 

 

5. 설정해 놓은 CRI-O 정보를 바탕으로 설치하기

{
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list
curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_18.04/Release.key | sudo apt-key add -
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list

apt update && apt install -y cri-o cri-o-runc
}

 

 

 

 

23년 9월 20일 기준 설치에 문제가 없으나 혹시 설치가 되지 않는다면 해당하는 레포지토리 주소에 접속하여 최신 URL을 가져와서 시도해 보시길 추천드려요!

 

 

 

 

 

 

6. CRI-O를 설치했으니 다시 가동해 줍시다.

rm -rf /etc/cni/net.d
{
systemctl daemon-reload
systemctl enable crio
systemctl restart crio
}

 

 

 

 

7. 사전준비 끝! Kubectl, kubelet, kubeadm 설치하기

{
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt update &&apt install -y kubelet kubeadm kubectl
}

인증키 -> 설치리스트 -> apt으로 라이브러리 설치 후 필요한 kubernetes 도구들 설치!

 

여기까지 잘 진행이 되셨다면 이제 여러분들의 ec2에는 쿠버네티스가 깔린겁니다.

 

 

 

 

하지만 아직 아무것도 볼 수 없어요!

 

systemctl status kubelet

위 명령어를 입력하면 우리가 설치한 서비스가 잘 돌아가고 있음을 확인할 수 있습니다.

 

 

 

 

8. 이제 가장 중요한 마스터 노드를 설치하겠습니다.

kubeadm init

이게 있어야 노드도 만들고 pod도 만들고 로드 밸런싱도 하고 요리조리 가지고 놀 수 있어요.

 

 

 

 

실행중. 두구두구

 

 

 

 

 

이 문구가 나온다면 설정에 성공하신 거에요!

 

 

 

 

 

9. 환경설정을 해줄께요.

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

화면에 나온 명령어를 그대로 따라해주세요.

 

이 부분이 없으면 터미널에서 kubernetes서비스에 접속할 수 없습니다.

 

 

 

 

10. 여기까지 했으면 master node를 확인할 수 있습니다.

kubectl get node

 

짠 생성된걸 확인할 수 있어요.

 

NotReady인 상태는 쿠베네티스 가동에 필요한 추가적인 네트워크 설치를 해주지 않았기 때문입니다.

 

 

 

 

 

11. 마지막 단계인 네트워크 설치하기

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

쿠버네티스는 위에 환경설정을 해줬는데 또하죠 ? ㅎ

 

운영은 끈임없는 설정과의 싸움이지 않습니까. 우리 조금만 힘내봐요 ㅋㅋ

 

 

 

 

CNI는 Container Network Interface의 약자로 컨테이너간의 네트워킹을 제어할 수 있는 플러그인의 표준입니다. 이 표준이 있어야 쿠버네티스는 Pod들 간의 통신을 할 수 있습니다.

 

저는 Weavenet이 문제없이 돌아가 사용했고 오픈소스중 어떤 제품을 사용해도 상관없습니다.

 

우다다 무언가가 나온다면 잘 적용이 되었다고 생각하면 됩니다.

 

 

 

 

아래명령어를 통해 확인하면 모든 준비가 끝났음을 확인할 수 있어요.

kubectl get node

 

 

 

 

 

여기까지 따라오느라 수고하셨어요!

 

다음편에는 워커 노드를 구성하고 마스터 노드에 촥촥 붙이는 작업까지 해볼께요.

 

 

 

 

감사합니다.

 

꼭 금방봐요!

 

 

 

 

 

관련글 더보기