데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AKS로 쿠버네티스 시작하기 : CI 구성하기

      broccoli 23.04.17
      3,401 19 0

      AKS만들기에 이어서 CI 진행

      AKS클러스터를 생성하였으니 소스코드로 애플리케이션 컨테이너를 만들고 ACR(Azure Container Registry)에 컨테이너 업로드를 진행하겠습니다.

      지난 과정 블로그 내용 : AKS로 쿠버네티스 시작하기 - Azure Kubernetes Service 부터


      전체 CI/CD 구성 및 흐름도

      기존 Azure VM에서 동작하는 애플리케이션을 k8s로의 이전에 대한 전체 흐름도를 먼저 소개합니다.

      image.png

      크게 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에 업로드 완료


      Spring Boot 애플리케이션 소스 준비

      pom.xml, spring boot 소스, index.html 로 구성을 합니다.

      pom.xml

      <?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>

      HellospringApplication.java

      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);
          }
      
      }

      index.html

      <!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 포트에서 서비스를 제공하는 것을 확인할 수 있습니다.

      image.png

      ACR 만들기

      Azure portal에서 create

      portal.azure.com 에서 간단히 만들기 가능

      - subscription, resource group, registry name, locaion, sku 설정

      image.png

      ACR 상세 구성 확인

      만들었으니 상세 구성을 보겠습니다.

      우선 registry 로그인 서버가 궁금한데요. 현재 구축에서는 acraopdev.azurecr.io 가 되겠습니다.

      image.png

      ACR 접속 정보

      현재는 Public access 구성이며, Preminum SKU 상품으로 변경하면 방화벽을 사용하는 private access 구성 가능

      image.png


      ACR 접속할 수 있도록 구성

      Access keys 메뉴에 접근하여 Admin user 'Enabled' 를 선택하면, password 생성이 됩니다.

      해당 username/password를 이용해서 docker login 명령으로 ACR에 접속 가능합니다.

      image.png


      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 로그인까지 완료가 되었으니 컨테이너를 업로드 할 준비가 완료 되었습니다.


      로컬PC에서 ACR에 컨테이너 업로드

      spring boot 코드를 컨테이너로 만들어서 ACR에 업로드 해야 합니다.

      일반적인 과정은 Dockerfile을 만들고, 소스를 빌드, 컨테이너를 생성해서, ACR로 push를 해야하는 과정입니다.

      다행스럽게도 구글에서 만든 jib라이브러리를 이용하면 Dockerfile 작성 없이도 한 번에 ACR까지 업로드 가능합니다.


      jib 라이브러리 적용

      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)/컨테이너 정보를 작성합니다.


      ACR로 한 번에 업로드

      mvn build 명령으로 한 번에 업로드를 수행합니다.

       $ mvn compile jib:build

      빌드 & push 수행 결과

      아래의 한가지 수행 결과 사례를 보여드립니다.

      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] ------------------------------------------------------------------------

      ACR reop 에서 확인

      azure portal을 통해 확인해 보겠습니다. 아래와 같이 컨테이너를 업로드한 결과까지 확인할 수 있습니다.

      image.png


      정리

      전체 CI/CD 흐름도를 기준으로 CI수행 단계인 "소스준비 → 애플리케이션 동작확인 → ACR로 한 번에 업로드(build, container, push) → ACR에서 확인"까지 완료를 하였습니다.

      구글에서 만든 jib는 자동화에 강력한 도구라고 생각합니다. 쿠버네티스가 아니더라도 활용해 보실 만할 것 같습니다.

      참고로 gitlab을 CI에 활용하는 내용은 사내에서 repo를 gitlab으로 이전하는 과정에 있어 이전이 완료되는 대로 추가로 진행해 보겠습니다.


      다음은

      CI 과정을 통해 업로드한 애플리케이션을 k8s클러스터에 배포하는 과정을 진행해 보겠습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      broccoli 님의 최신 블로그

      더보기