23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
지난 블로그에서 argocd로 도메인명으로 쉽게 접속할 수 있게 되었습니다.
CI/CD 환경이 어느 정도 구성이 되었으니 현재까지 구성한 클러스터을 기반으로 간단한 앱을 배포해 보도록 하겠습니다.
지난 블로그 링크 : AKS로 쿠버네티스 시작하기 : argocd툴에 ingress 통해 접속
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.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>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 포트에서 서비스를 제공하는 것을 확인할 수 있습니다.
간단한 애플리케이션이 준비가 되었습니다. 로컬 환경에서 잘 동작하는 것이 확인이 되었습니다.
이번에는 CI/CD 자동화 이전에 Dockerfile을 활용하여 컨테이너 이미지를 만드는 과정을 포함해서 전체 세부 절차를 확인할 수 있는 내용으로 진행해 보겠습니다.
단계별 절차를 이해하면 자동화 시에도 자신의 환경에 맞게 최적화 구성을 할 수 있겠습니다.
Spring boot 의 특성상 내장형 톰캣 구조로 로컬 환경에서 아래의 java명령어로 jar로 생성된 애플리케이션을 동작시키는 것도 가능합니다.
로컬에서 잘 작동하는 지 먼저 확인하고 컨테이너 이미지를 작성하는 것을 권장합니다.
# 애플리케이션 빌드를 수행하면 target디렉토리에 jar 파일이 생성됩니다.
# 해당 디렉토리에서 아래의 명령어를 수행하면 jar로 생성한 애플리케이션을 동작시킬 수 있습니다.
$ java -jar *.jar애플리케이션 빌드환경과 일치하는 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위에서 생성한 이미지(태깅포함)를 podman push 명령어로 ACR에 업로드 가능합니다.
$ podman push acrapp.azurecr.io/hellospring:latestACR에 올려진 이미지를 이제 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: 8080k9s 툴을 띄워두고 kubectl apply -f <yaml 파일명> 명령어를 통해 배포하면 pod상태를 바로 확인할 수 있습니다.
혹시라도 pod 동작에 에러가 발생하면 k9s의 기능을 이용해서 디버깅도 가능합니다.
- 소문자 'l '키 : logs
- 'd' 키 : describe
- 참고로 위의 오른쪽 패널의 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 사례를 진행해 보도록 하겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.