LKE (Linode Kubernetes Engine)과 Github Actions, ArgoCD를 이용하여 컨테이너 애플리케이션 CI/CD 파이프라인을 구축한다.
LKE(Linode Kubernetes Engine)은 Akamai Connected Cloud에서 제공하는 매니지드 쿠버네티스 서비스이다. 구성에 걸리는 시간이 짧고(생성 요청 후 2분 이내 생성) 가격이 저렴하여 PoC 할 때 유용하게 사용할 수 있다.
컨트롤 플레인 요금을 따로 청구하지 않으며 2GB RAM, 1 core CPU 스펙의 워커노드 3개를 사용하는 쿠버네티스 클러스터는 한달에 36달러만 지불하면 사용이 가능하다.
단점으로는 현재 한국 리전이 존재하지 않아 가장 가까운 일본 리전을 사용하고 있는데, 거리 차이가 크지는 않지만 통신 지연이 우려된다.
Akamai Connected Cloud(Linode)란?
Github Actions를 이용해 CI 환경을 구성하고 ArgoCD를 이용해 CD 환경을 구성한다.
Github Actions는 Github에서 제공하는 CI/CD 서비스이다. 레포지토리에 직접 yaml 파일을 이용해 구성할 수 있고 다양한 플러그인을 지원하기 때문에 빠르게 배포 환경을 구성하기에 용이하다.
ArgoCD는 쿠버네티스 클러스터 CD(Continuous Deployment)를 위한 도구이다. 쿠버네티스 애플리케이션 관리 시 deployment, service 등 여러 yaml 파일을 관리해야 하는데, 이를 Git 저장소에 정의하고 ArgoCD가 해당 구성을 Kubernetes 클러스터에 동기화하여 애플리케이션을 배포하여 SSOT(단일 진실 공급원)을 달성할 수 있다.
docker hub에 이미지 레포지토리를 생성한다.
백엔드 애플리케이션, 쿠버네티스 yaml 리소스를 위한 github 레포지토리를 생성한다.
Github 레포지토리 내 커밋을 추가하는 과정이 존재하기 때문에 해당 권한을 가진 Github 액세스 토큰을 준비한다.
Akamai Connected Cloud 콘솔에서 쿠버네티스 클러스터를 생성한다.
배포할 백엔드 애플리케이션을 생성한다. 이 글에서는 간단한 Spring Boot 애플리케이션을 사용한다. 간단한 GET API를 만들어 CI/CD 파이프라인이 정상적으로 작동하는지 테스트할 예정이다.
@RestController
@RequestMapping
public class TestController {
@RequestMapping
public String test() {
return "this is v1";
}
}
그 후 Dockerfile을 스프링부트 루트 폴더에 생성한다.
FROM openjdk:17-jdk-slim as builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT java -jar app.jar
쿠버네티스 클러스터 내 Helm을 이용하여 ArgoCD를 설치한다.
먼저 argoCD 헬름 차트를 등록한다.
helm repo add argo https://argoproj.github.io/argo-helm
위 레포지토리에서 values.yaml 파일을 다운받고 몇가지 정보를 변경하여 ArgoCD 기본 설정을 수정한다.
configs.params.server.insecure
항목을 true
로 변경하여 https 없이 http를 이용해서 접속할 수 있도록 변경한다.
외부에서 ArgoCD 대시보드에 접속하기 위해 server.ingress.enabled
항목을 true
로 변경하고 server.ingress.ingressClassName
항목을 nginx
로 변경하여 nginx 인그레스 컨트롤러를 사용한다.
마지막으로 server.extraArgs
항목에 --insecure
커맨드를 추가해 위에서 활성화한 인그레스 접속을 http 프로토콜로 가능하게 한다.
이제 ArgoCD를 설치한다.
kubectl create namespace argo # argocd를 위한 네임스페이스 생성
helm install argocd -n argo argo/argo-cd -f ./values.yaml # 위에서 작성한 values.yaml 파일을 적용하여 argocd 설치
ingress를 활성화 하였기 때문에 자동으로 Node Balancer가 생성이 되었다. Node Balancer 퍼블릭 IP에 접속하면 ArgoCD 대시보드에 접속할 수 있다.
초기 username은 admin 이며, 비밀번호는 아래 명령어로 확인할 수 있다.
kubectl -n argo get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
https://github.com/junho100/lke-ghactions-argocd