우선 프로젝트를 진행할 당시 공모전 단체에서 클러스터를 제공해줬기에 클러스터 생성은 내가 하지 않았다.
이후에 공부할 겸 한 번 직접 만들어봤는데 https://dev-gallery.tistory.com/66 이 블로그를 보고 하니 잘 됐다.
또 공모전이 끝난 지금 내가 클러스터에 접근할 수 없기 때문에, 아래 적은 방법들은 내가 직접 배포할 때 간단하게 기록해놓은 것을 바탕으로 한다는 것을 적어둔다.
그래서 기록하지 말까도 생각해봤는데, 미래의 나를 위해서 시행착오를 겪은 경험이라도 적어두는게 나을 것 같아서 기록한다.
그래서 사진이 없을 수도, 정확하지 않은 정보가 있을 수도 있다.
공모전 기관이 제공해준 인프라는 Naver Cloud Platform 의 Ncloud Kubernetes Service, SourcePipeline등 이다.
쿠버네티스는 애플리케이션이 아니라 컨테이너 단위로 앱을 실행하고 관리한다.
따라서 msa 구조에 적합한 도구이다.
https://kubernetes.io/ko/docs/concepts/overview
1. 자동화된 복구 : 실행중인 컨테이너가 문제가 생겨 동작하지 않으면, 자동으로 다시 시작한다.
2. 로드밸런싱 : 트래픽이 한 곳으로 쏠리지 않게 여러 컨테이너에 골고루 나누어 준다.
3. 무중단 배포 : 서비스를 끄지 않고도 새 버전을 배포할 수 있고, 문제가 생기면 순식간에 이전 버전으로 되돌릴 수 있다.
msa 구조는 관리해야 할 서비스가 많아지기 때문에 직접 하나하나 관리하기에는 어려움이 있다. 쿠버네티스는 msa구조에서 발생할 수 있는 문제들을 자동으로 관리해주기 때문에 자연스럽게 사용하게 되었다.
ci/cd를 통해 자동으로 배포를 할 수도 있지만, 처음에 쿠버네티스가 제대로 동작하는지 확인하고 싶어서 처음에는 직접 이미지를 올리고 진행했다.
쿠버네티스는 컨테이너 이미지를 기반으로 실행되기 때문에 먼저 DockerFile을 작성하고 빌드해 이미지를 Container Registry에 올려두었다.
NCP Container Registry 를 참고해서 진행하였다.
# user-service/Dockerfile
# 자바 런타임 환경 설정
FROM amazoncorretto:17
# 애플리케이션이 배포될 독립 디렉터리 생성
RUN mkdir -p /usr/app/user-service
# 애플리케이션이 위치할 경로 환경 변수로 설정
ENV APP_HOME=/usr/app/user-service
# 작업 디렉토리 설정
WORKDIR ${APP_HOME}
# JAR 파일 복사
ARG JAR_FILE=build/libs/user-service-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} user-service.jar
# 컨테이너에서 노출할 포트
EXPOSE 8080
# Spring 프로파일을 동적으로 설정할 수 있도록 CMD 명령어 수정
ENV SPRING_PROFILES_ACTIVE=k8s
CMD ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "user-service.jar"]
서비스마다 Dockerfile을 작성하여 각각 빌드해야 한다.
빌드 명령어 : ./gradlew clean build
빌드시 무슨 에러가 엄청 뜨는데 eureka 서버가 안띄워져 있다는 뜻이었다.
docker container 이미지 빌드 : docker build -t [이미지명] .
마지막 '.'을 꼭 붙여줘야 한다. (빌드 경로)
docker login : docker login [레지스트리 주소]
이후 username과 password에 api인증키 입력
이미지 태그 만들기 : docker tag [기존_이미지명]:[기존_태그] [새_이미지명]:[새_태그]
이때 NCP Container Registry 에 올릴 거면 새 이미지를
[레지스트리 이름].kr.ncr.ntruss.com/[이미지이름]:[태그]
이런 식으로 만들면 편리하다.
이미지를 저장소에 push : docker push [새_이미지명]:[새_태그]
클러스터를 관리하기 위해 kubectl을 사용해 클러스터에 접속해야 한다.
powershell에서 작업을 수행할 때 관리자 권한으로 접속하자.
kubectl 설치 : 클러스터를 제어하는 데 사용되는 CLI
powershell 터미널에서 진행하면 된다.
choco install kubernetes-cli (설치) -> kubectl version --client (설치 및 버전 확인)
ncp-iam-authenticator 설치 : IAM 인증 도구
ncp-iam-authenticator 설치 (windows) 를 보고 진행하였다.
powershell에서 다음 명령어 수행
curl -o ncp-iam-authenticator.exe -L https://github.com/NaverCloudPlatform/ncp-iam-authenticator/releases/latest/download/ncp-iam-authenticator_windows_amd64.exe
(그새 명령어가 바뀐 모양이다)
curl.exe -LO "https://dl.k8s.io/release/v1.35.0/bin/windows/amd64/kubectl-convert.exe"
C: 에 폴더 생성후 다운받은 실행 파일 집어넣기

시스템 속성 - 고급 - 환경 변수 - 시스템 변수 path 에 넣어주기

ncp-iam-authenticator 설치 확인
ncp-iam-authenticator help 에러가 안뜨면 잘 설치가 된거다.

vi ~/.ncloud/configurencloud_access_key_id = {accesskey} // 본인 access key 입력
ncloud_secret_access_key = {secretkey}
ncloud_api_url = https://ncloud.apigw.ntruss.com
kubeconfig 생성
ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid { 본인의 cluster uuid } --output kubeconfig.yaml

테스트
kubectl get namespaces --kubeconfig kubeconfig.yaml

환경변수 등록
기본경로가 아닌 폴더에 configure를 만들었기에 window에게 configure 파일위치를 알려줘야 한다.
setx KUBECONFIG "C:\경로\kubeconfig.yaml"

연결 확인 (새 터미널에서)
kubectl get nodes
