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

신고하기

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

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

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

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

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

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

      임시저장함

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

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

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

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

      회원정보 연결

      AKS로 쿠버네티스 시작하기 : 간단한 spring boot 앱 배포하기

      broccoli 23.06.02
      4,376 11 0

      'AKS로 쿠버네티스 시작하기 : argocd툴에 ingress 통해 접속' 에 이어서

      지난 블로그에서 argocd로 도메인명으로 쉽게 접속할 수 있게 되었습니다.

      CI/CD 환경이 어느 정도 구성이 되었으니 현재까지 구성한 클러스터을 기반으로 간단한 앱을 배포해 보도록 하겠습니다.

      

      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.1.0</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>17</java.version>
          </properties>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
              </plugins>
          </build>
      </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

      간단한 애플리케이션이 준비가 되었습니다. 로컬 환경에서 잘 동작하는 것이 확인이 되었습니다.

      이번에는 CI/CD 자동화 이전에 Dockerfile을 활용하여 컨테이너 이미지를 만드는 과정을 포함해서 전체 세부 절차를 확인할 수 있는 내용으로 진행해 보겠습니다.

      단계별 절차를 이해하면 자동화 시에도 자신의 환경에 맞게 최적화 구성을 할 수 있겠습니다.


      로컬 환경에서 jar 기동 확인

      Spring boot 의 특성상 내장형 톰캣 구조로 로컬 환경에서 아래의 java명령어로 jar로 생성된 애플리케이션을 동작시키는 것도 가능합니다.

      로컬에서 잘 작동하는 지 먼저 확인하고 컨테이너 이미지를 작성하는 것을 권장합니다.

      # 애플리케이션 빌드를 수행하면 target디렉토리에 jar 파일이 생성됩니다. 
      # 해당 디렉토리에서 아래의 명령어를 수행하면 jar로 생성한 애플리케이션을 동작시킬 수 있습니다. 
      
      $ java -jar *.jar


      Dockerfile 만들기

      애플리케이션 빌드환경과 일치하는 openjdk를 base로 해서 애플리케이션 패키징을 통해 생성한 jar파일을 app.jar로 복사한 다음 8080포트로 기동시키는 Dockerfile입니다.

      - EXPOSE 8080 : 기동하는 컨테이너는 8080포트를 통해서 서비스 제공을 합니다.

      - ENTRYPOINT를 통해서 컨테이너가 기동하면 java -jar app.jar 가 동작할 수 있도록 구성을 할 수 있습니다.

      FROM openjdk:17-alpine3.14
      WORKDIR /ARG JAR_FILE=*.jar
      COPY ./target/${JAR_FILE} app.jar
      EXPOSE 8080
      ENTRYPOINT ["java", "-jar","/app.jar"]


      애플리케이션 이미지 만들고 태깅하기

      Dockerfile을 만든 애플리케이션 프로젝트 루트에서 podman build 명령어로 타겟 클러스터 플랫폼(리눅스) 맞게 acrapp.azurecr.io/hellospring:latest로 이미지를 만들고 태깅하여 생성합니다.

      $ podman  build --platform linux/amd64  --tag acrapp.azurecr.io/hellospring:latest . 
      
      STEP 1/6: FROM openjdk:17-alpine3.14
      STEP 2/6: WORKDIR /
      --> 241ccc727841
      STEP 3/6: ARG JAR_FILE=*.jar
      --> efe8fbff9872
      STEP 4/6: COPY ./target/${JAR_FILE} app.jar
      --> 5b38963da7df
      STEP 5/6: EXPOSE 8080
      --> 72ca8d7eaf0c
      STEP 6/6: ENTRYPOINT ["java", "-jar","/app.jar"]
      COMMIT acrapp.azurecr.io/hellospring:latest
      --> ec212b7dca25
      Successfully tagged acrapp.azurecr.io/hellospring:latest
      ec212b7dca25e83f1b0e01a5bbd483888e0355abfbd98c67327103e30f57f0b8


      ACR로 업로드하기

      위에서 생성한 이미지(태깅포함)를 podman push 명령어로 ACR에 업로드 가능합니다.

      $ podman push acrapp.azurecr.io/hellospring:latest


      Service/Deployment yaml 파일 작성하기

      ACR에 올려진 이미지를 이제 k8s클러스터에 배포할 차례입니다.

      k8s에서는 해당 이미지를 사용하여 컨테이너를 구동시켜 서비스를 제공할 수 있게 하기 위해 service오브젝트와 deployment오브젝트를 yaml파일로 작성해야 합니다.

      apiVersion: v1
      kind: Service
      metadata:
        name: svc-hellospring
        namespace: hellospring
      spec:
        type: LoadBalancer
        ports:
          - name: http
            port: 8080
            targetPort: 8080
        selector:
          app: app-hellospring
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deploy-hellospring
        namespace: hellospring
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: app-hellospring
        template:
          metadata:
            labels:
              app: app-hellospring
          spec:
            nodeSelector:
              "kubernetes.io/os": linux
            containers:
              - name: container-hellospring
                image: acrapp.azurecr.io/hellospring:latest
           
                resources:
                  requests:
                    cpu: 100m
                    memory: 256Mi
                  limits:
                    cpu: 250m
                    memory: 512Mi
                env:
                  - name: TZ
                    value: Asia/Seoul
                ports:
                  - containerPort: 8080


      작성한 Service/Deployment 을 k8s에 배포하기

      k9s 툴을 띄워두고 kubectl apply -f <yaml 파일명> 명령어를 통해 배포하면 pod상태를 바로 확인할 수 있습니다.

      혹시라도 pod 동작에 에러가 발생하면 k9s의 기능을 이용해서 디버깅도 가능합니다.

      - 소문자 'l '키 : logs

      - 'd' 키 : describe

      image.png

      - 참고로 위의 오른쪽 패널의 k apply 명령은 kubectl apply 를 의미합니다.(kubectl을 'k'로 alias 해서 사용)


      배포한 서비스 확인

      kubectl get svc -n 으로 서비스를 확인할 수 있습니다. (-n은 namespace를 의미)

      여기서는 external IP가 20.196.228.89 입니다.

      k get svc -n hellospring
      NAME              TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
      svc-hellospring   LoadBalancer   10.0.57.154   20.196.228.89   8080:30720/TCP   10m

      해당 external IP로 접속해 보면 서비스 동작을 확인할 수 있습니다.


      정리

      소스작성 → 컴파일 → jar생성 → java -jar로 확인 → Dockerfile작성 → 컨테이너 이미지 생성과 태깅 → ACR에 업로드 → Service/Deployment yaml 작성 → k8s에 배포 순으로 전체 과정을 간단한 앱을 통해 진행해 보았습니다.

      해당 절차를 응용하면 컨테이너 동작과 관련한 문제 발생에 단계적으로 확인하여 대응할 수 있습니다.


      다음은

      k8s 구성 최적화 측면과 k8s를 활용한 유용한 usecase 사례를 진행해 보도록 하겠습니다.

      댓글 0

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

      broccoli 님의 최신 블로그

      더보기
      동영상 기고하기