1. 이 글을 통해 알아볼 내용
이번 글에서는 앞서 로컬 환경에서 웹 애플리케이션을 배포하고 프로메테우스와 그라파나로 모니터링 테스트를 했던 것에서 한 단계 더 발전시켜 클라우드 환경에서 쿠버네티스 클러스터에 애플리케이션을 배포하고 동작하는 것을 확인해 볼 계획입니다. 이를 위해서 먼저 쿠버네티스를 구축하는 방법에 대해 알아보도록 하겠습니다.
2. 구글 클라우드 플랫폼 계정 만들기
구글 클라우드 플랫폼에 처음 가입하면 무료로 3개월 동안 사용할 수 있는 300$의 크레딧을 준다. 이러한 혜택 때문에 구글 클라우드 플랫폼에서 쿠버네티스 클러스터를 구축해보기로 했다.
(구글 클라우드 플랫폼이라는 명칭이 길기 때문에 편의상 줄여서 GCP라고 표기하겠다.)
무료로 시작하기 버튼을 눌러준다.
약관 동의에 체크를 하고 계속 버튼을 눌러준다.
사업자가 아닌 개인으로 이용하는 것이기 때문에 계좌 유형을 개인으로 선택하고 이름 및 주소 정보를 입력해준다. 입력을 마쳤다면 계속 버튼을 눌러준다.
이름 및 주민등록번호 그리고 통신사 인증을 한 후에 계속 버튼을 눌러준다.
마지막으로 결제 수단인 카드 번호를 입력한 후에 무료로 시작하기 버튼을 누르면 GCP를 사용하기 위한 무료 체험판 계정 생성이 완료된다.
90일동안 사용할 수 있으며 300$에 해당하는 크레딧이 발급된 것을 확인할 수 있다. 여기서 일반 계정 활성화 버튼을 누르면 비용이 발생할 수도 있으니 주의해야겠다.
3. 쿠버네티스 클러스터 구축 준비
GCP에서 구축해 볼 쿠버네티스 클러스터 구조는 아래와 같다.
쿠버네티스 클러스터는 마스터 노드 한 대와 워커노드 세 대로 구성된다. 여기서 노드 하나는 한 대의 서버라고 보면 된다. 그래서 총 4대의 서버가 필요하고 VM 인스턴스를 사용하여 서버를 만들어보겠다.
GCP 콘솔 화면 좌측 메뉴에서 VM 인스턴스를 선택해준다.
그러면 Compute Engine API 를 사용할지 선택하는 화면이 나온다.
사용 버튼을 눌러준다.
그러면 로딩 표시가 돌아가면서 Compute Engine API 사용 준비 과정이 진행되는 데 약 2~3분 정도 기다리면 된다.
Compute Enging API 사용 준비가 완료되면 아래와 같이 VM 인스턴스 관리 화면이 나온다.
마스터 노드와 워커 노드는 동일한 스펙의 서버로 구성할 계획이다. 생성할 서버의 스펙은 아래와 같다.
구성 항목 | 설정값 |
이름 | k8s-${노드명} |
리전 | asia-northeast3(서울) |
영역 | asia-northeast3-a |
머신 | 범용 > E2 |
머신 유형 | e2-medium(vCPU 2개, 코어 1개, 메모리 4GB) (※ 쿠버네티스 노드는 CPU가 최소 2개 이상 필요) |
부팅 디스크 | 운영체제 : CentOS 버전 : CentOS Stream8 |
방화벽 | HTTP 트래픽 허용 HTTPS 트래픽 허용 |
4. 마스터 노드 생성
VM인스턴스 관리 화면에서 인스턴스 만들기 버튼을 눌러준다.
그러면 아래와 같이 인스턴스 만들기 화면이 나온다.
앞서 살펴봤던 서버 스펙에 맞게 각 항목 값을 설정해준다.
이렇게 설정하면 청구되는 월별 예상 가격은 아래와 같다.
만약 무료로 제공되는 3개월 300$ 크레딧으로 다양한 작업을 사용해보고 싶다면 월별 예상 가격을 고려하여 필요한 만큼만 GCP를 사용하면 좋을 것 같다는 생각이 든다.
만들기 버튼을 눌러준다. 조금 기다리면 아래와 같이 VM 인스턴스 생성이 완료된다.
이제 서버에 접속하여 마스터 노드 설정을 해야하기 때문에 SSH 버튼을 눌러 쉘에 접속한다.
(AWS는 Putty로 접속하기 위해 키페어를 설정해줘야하지만 GCP는 브라우저에서 바로 쉘에 접속이 가능하다.)
쉘 접속이 완료됐다. 아무것도 칠하지 않은 새하얀 도화지 같은 서버에 들어온 것이다. 이제 이 서버를 쿠버네티스 클러스터의 마스터 노드로 만들어줘야한다. (작업에 필요한 명령어는 k8s-master.sh 쉘 파일에 정리해두었다)
명령어를 실행시키며 차근차근 설치해보겠다.
echo '======== [0] 설정 변수 초기화 ========'
server_ip=$(hostname -I | cut -d' ' -f1)
pod_network=10.244.0.0/16
echo 'server_ip :' $server_ip
echo 'pod_network :' $pod_network
echo '======== [1] 패키지 업데이트 ========'
sudo yum -y update
echo '======== [2] 타임존 설정 ========'
sudo timedatectl set-timezone Asia/Seoul
echo '======== [3] 도커 레포지토리 추가 ========'
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo '======== [4] 도커 설치 ========'
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo '======== [5] 도커 시작 ========'
sudo systemctl start docker
sudo systemctl enable docker
echo '======== [6] 쿠버네티스 레포지토리 추가 ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
echo '======== [7] SELinux OFF ========'
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
echo '======== [8] 쿠버네티스 패키지 설치 ========'
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
echo '======== [9] kubeadm 으로 클러스터 생성 ========'
sudo sed -i 's/disabled/# disabled/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address 10.178.0.9
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo sed -i 's/disabled/# disabled/g' /etc/containerd/config.toml
sudo systemctl restart containerd
아래 에러를 방지하기 위해서 위 명령어를 실행시켜주어야 한다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address 10.178.0.9
--apiserver-advertise-address 옵션에 설정하는 IP는 서버의 내부 IP로 VM 인스턴스 관리화면에서 확인이 가능하다. 리눅스에서 ifconfig 명령어를 통해서도 IP 확인 가능하다.
sudo kubeadm join 10.178.0.9:6443 --token evzshs.dcso63oepm58e75h --discovery-token-ca-cert-hash sha256:da3ea39da172d577a15a10774e10ac3db68a21d9344d7092bec944071b302fb5
추후 워커 노드에서 쿠버네티스 패키지 설치가 완료되면 워커 노드가 쿠버네티스 클러스터에 포함되도록 위 명령어를 실행시켜준다.
echo '======== [10] calico 설치 ========'
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml -O
sudo sed -i "s|cidr: *.*.*.*/*|cidr: $pod_network|g" custom-resources.yaml
kubectl create -f custom-resources.yaml
마스터 노드를 성공적으로 생성하였다.
5. 워커 노드 생성
마스터 노드의 VM 인스턴스를 생성해주었던 것처럼 동일하게 워커 노드의 VM 인스턴스 3대를 생성해준다.
각 워커노드에 SSH로 접속하여 아래 워커 노드 설치 명령어를 실행시켜준다. 대표로 k8s-worker1 서버에 접속하여 워커 노드 설정을 진행해보겠다. 워커 노드 생성에 필요한 명령어는 k8s-worker.sh 쉘 파일에 정리해두었다
(마스터 노드 설정과 동일하게 실행되는 명령어는 결과 화면을 이미 확인하였기 때문에 워커 노드 생성 과정에서는 생략한다.)
echo '======== [1] 패키지 업데이트 ========'
sudo yum -y update
echo '======== [2] 타임존 설정 ========'
sudo timedatectl set-timezone Asia/Seoul
echo '======== [3] 도커 레포지토리 추가 ========'
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo '======== [4] 도커 설치 ========'
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo '======== [5] 도커 시작 ========'
sudo systemctl start docker
sudo systemctl enable docker
echo '======== [6] 쿠버네티스 레포지토리 추가 ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
echo '======== [7] SELinux OFF ========'
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
echo '======== [8] 쿠버네티스 패키지 설치 ========'
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
sudo sed -i 's/disabled/# disabled/g' /etc/containerd/config.toml
sudo systemctl restart containerd
쿠버네티스 패키기 설치까지 완료되면 아래 명령어를 실행시켜 워커 노드가 클러스터에 포함되도록 해준다.
sudo kubeadm join 10.178.0.9:6443 --token evzshs.dcso63oepm58e75h --discovery-token-ca-cert-hash sha256:da3ea39da172d577a15a10774e10ac3db68a21d9344d7092bec944071b302fb5
만약 토큰 또는 해시값 확인이 필요한 경우 아래 명령어를 통해 조회가능하다.
# token 확인
kubeadm token list
# token 생성 (token 없을 경우)
kubeadm token create
# hash 확인
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed "s/^.* //"
나머지 워커 노드 #2, #3 에 대해서도 동일하게 설치를 진행해준다.
6. 쿠버네티스 클러스터 정보 확인
짜자잔!
이제 마스터 노드에서 클러스터 노드를 조회해보면 아래와 같이 워커노드들이 보인다.
마스터 노드 1대와 워커 노드 3대가 Ready 상태로 클러스터에 있는 것을 확인할 수 있다. 여기까지 쿠버네티스 클러스터 구성 작업이 모두 완료되었습니다. 긴 글 끝까지 읽어주셔서 감사합니다. 🙇♂️
다음 글. 쿠버네티스 서비스 알아보기
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Nginx Ingress Controller 에서 Path 라우팅 적용하기 (0) | 2024.06.22 |
---|---|
[Kubernetes] 쿠버네티스 클러스터 모니터링해보기 [4/4] (0) | 2024.05.25 |
[Kubernetes] 쿠버네티스 서비스 알아보기 [3/4] (0) | 2024.05.11 |