23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
AKS클러스터를 생성하였으니 소스코드로 애플리케이션 컨테이너를 만들고 ACR(Azure Container Registry)에 컨테이너 업로드를 진행하겠습니다.
지난 과정 블로그 내용 : AKS로 쿠버네티스 시작하기 - Azure Kubernetes Service 부터
기존 Azure VM에서 동작하는 애플리케이션을 k8s로의 이전에 대한 전체 흐름도를 먼저 소개합니다.
크게 CI 단계와 CD단계로 구분됩니다.
CI에서는 gitlab repo, jib, gilab CI 파이프라인, gitlab-runner, ACR을 사용하겠습니다.
ㅇ 개발자는 gitlab repo에 소스를 준비
ㅇ ACR만들기와 ACR에 연결 설정
ㅇ jib 기반으로 소스 환경 설정 : pom.xlm, gradle.build
- 빌드에 필요한 jib라이브러리 설정
- 빌드 후 생성하게 되는 컨테이너를 push할 타겟 ACR 정보 설정
ㅇ gitlab CI 파이프라인을 구성 : .gitlab-ci.yaml 파일에 작성
ㅇ gitlab에서 CI 수행 요청 : CI파이프라인이 동작하면 빌드와 함께 컨테이너를 생성하고 ACR에 push
ㅇ ACR에 업로드 완료
pom.xml, spring boot 소스, index.html 로 구성을 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>hellospring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hellospring</name>
<description>hellospring</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>package com.example.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HellospringApplication {
public static void main(String[] args) {
SpringApplication.run(HellospringApplication.class, args);
}
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
<h1>hello, springboot working on k8s!!!</h1>
</body>
</html>아래와 같이 8080 포트에서 서비스를 제공하는 것을 확인할 수 있습니다.
portal.azure.com 에서 간단히 만들기 가능
- subscription, resource group, registry name, locaion, sku 설정
만들었으니 상세 구성을 보겠습니다.
우선 registry 로그인 서버가 궁금한데요. 현재 구축에서는 acraopdev.azurecr.io 가 되겠습니다.
현재는 Public access 구성이며, Preminum SKU 상품으로 변경하면 방화벽을 사용하는 private access 구성 가능
Access keys 메뉴에 접근하여 Admin user 'Enabled' 를 선택하면, password 생성이 됩니다.
해당 username/password를 이용해서 docker login 명령으로 ACR에 접속 가능합니다.
Access keys 메뉴를 통해 ACR에 접속할 수 있는 환경을 azure portal에서 구성으니
로컬PC에서 docker login 명령어를 이용해서 접속을 완성하겠습니다.
acraopdev/<패스워드> 입니다. 패스워드는 Access keys 메뉴를 통해 구성한 환경 정보에서 확인 가능합니다.
$ docker login acraopdev.azurecr.io
Username: acraopdev
Password:
Login Succeeded!참고로 docker 명령은 podman을 맥북에 설치하고 alias 해서 사용하였습니다. (즉, podman login ~ 로 동작)
로컬PC에서 ACR 로그인까지 완료가 되었으니 컨테이너를 업로드 할 준비가 완료 되었습니다.
spring boot 코드를 컨테이너로 만들어서 ACR에 업로드 해야 합니다.
일반적인 과정은 Dockerfile을 만들고, 소스를 빌드, 컨테이너를 생성해서, ACR로 push를 해야하는 과정입니다.
다행스럽게도 구글에서 만든 jib라이브러리를 이용하면 Dockerfile 작성 없이도 한 번에 ACR까지 업로드 가능합니다.
pom.xlm에 아래와 같이 plugin을 추가 적용하면 됩니다.
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<from>
<image>adoptopenjdk/openjdk16:x86_64-alpine-jdk-16.0.1_9</image>
</from>
<to>
<image>acraopdev.azurecr.io/hellospring</image>
</to>
<container>
<jvmFlags>["-Xms128m", "-Xmx128m]</jvmFlags>
</container>
</configuration>
</plugin>jib 플러그인과 버전, 구성정보에는 이미지/타겟registry(여기서는 ACR)/컨테이너 정보를 작성합니다.
mvn build 명령으로 한 번에 업로드를 수행합니다.
$ mvn compile jib:build아래의 한가지 수행 결과 사례를 보여드립니다.
hellospring git:(main) ✗ mvn compile jib:build
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.example:hellospring >-----------------------
[INFO] Building hellospring 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.3.0:resources (default-resources) @ hellospring ---
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ hellospring ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- jib-maven-plugin:3.3.1:build (default-cli) @ hellospring ---
[WARNING] 'mainClass' configured in 'maven-jar-plugin' is not a valid Java class: ${start-class}
[INFO]
[INFO] Containerizing application to acrcopdev.azurecr.io/hellospring...
[WARNING] Base image 'eclipse-temurin:17-jre' does not use a specific image digest - build may not be reproducible
[INFO] Using credentials from Docker config (/Users/110ㅇㅇㅇㅇ/.config/containers/auth.json) for acrcopdev.azurecr.io/hellospring
[INFO] The base image requires auth. Trying again for eclipse-temurin:17-jre...
[INFO] Using base image with digest: sha256:c532a4b5617d7b8058b50727f6c162606d4196292bd47e462354b1a724d685f8
[INFO]
[INFO] Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.example.hellospring.HellospringApplication]
[INFO]
[INFO] Built and pushed image as acrcopdev.azurecr.io/hellospring
[INFO] Executing tasks:
[INFO] [============================ ] 91.7% complete
[INFO] > launching layer pushers
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.401 s
[INFO] Finished at: 2023-02-06T08:03:29+09:00
[INFO] ------------------------------------------------------------------------azure portal을 통해 확인해 보겠습니다. 아래와 같이 컨테이너를 업로드한 결과까지 확인할 수 있습니다.
전체 CI/CD 흐름도를 기준으로 CI수행 단계인 "소스준비 → 애플리케이션 동작확인 → ACR로 한 번에 업로드(build, container, push) → ACR에서 확인"까지 완료를 하였습니다.
구글에서 만든 jib는 자동화에 강력한 도구라고 생각합니다. 쿠버네티스가 아니더라도 활용해 보실 만할 것 같습니다.
참고로 gitlab을 CI에 활용하는 내용은 사내에서 repo를 gitlab으로 이전하는 과정에 있어 이전이 완료되는 대로 추가로 진행해 보겠습니다.
CI 과정을 통해 업로드한 애플리케이션을 k8s클러스터에 배포하는 과정을 진행해 보겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.