-
[Study46] k8s서비스 올리기카테고리 없음 2026. 4. 2. 17:40
study45에서 했던거의 연장으로, 여기에 서비스 올릴거예요

클로드가 야물딱지게 뽑아줍니다.
저에게 springbootApp jar파일이 있을때, 실무구조로 mysql디비까지 연결해서 k8s에서 구동하고, 데이터까지 잘 나오는 걸 확인하고싶어요.
제가가진 Springboot프로젝트는 진짜 간단하게 구성되어있고, properties는 현재
spring.application.name=step04_empApp server.servlet.context-path=/emp server.port=8083 # JSP íì¼ ê²½ë¡ ì¤ì spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp # 1. Database Connection spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://mysqldb:3306/fisa?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=user01 spring.datasource.password=user01 # 2. JPA/Hibernate SQL Log spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.orm.jdbc.bind=trace spring.jpa.properties.hibernate.use_sql_comments=true # 3. Table Auto Creation spring.jpa.hibernate.ddl-auto=update spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect와 같이 되어있습니다.
1단계 — properties 수정 (호스트 springboot 프로젝트에서)
propertiesspring.datasource.url=jdbc:mysql://mysqldb:3306/fisa?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=${DB_USERNAME} spring.datasource.password=${DB_PASSWORD}2단계 — jar 빌드 (호스트에서)
.\gradlew build -x testjar 파일 이름 확인:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2026-04-02 오전 10:58 15207 step04_empApp-0.0.1-SNAPSHOT-plain.jar
-a---- 2026-04-02 오전 10:58 66914894 step04_empApp-0.0.1-SNAPSHOT.jar3단계 — Dockerfile 작성 (호스트 프로젝트 루트에)
dockerfileFROM eclipse-temurin:17-jdk-jammy WORKDIR /app COPY build/libs/step04_empApp-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]이제 이걸 빌드에서 tar로 만들고 server01에 보내놔요
PS C:\Users\서지혜\Desktop\FISA\ce6\04.SpringBoot> docker build -t springboot-emp:1.0 . [+] Building 43.7s (8/8) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 184B 0.0s => [internal] load metadata for docker.io/library/eclipse-temurin:17-jdk-jammy 2.7s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [1/3] FROM docker.io/library/eclipse-temurin:17-jdk-jammy@sha256:ef5f72c89f9d7532046e6779ca 39.2s => => resolve docker.io/library/eclipse-temurin:17-jdk-jammy@sha256:ef5f72c89f9d7532046e6779cae 0.0s => => sha256:94c27faa059be473551ae5c1e4c236ba47e5ea786ca558b4cbec3c2b61ed1 145.63MB / 145.63MB 34.2s => => sha256:ef5f72c89f9d7532046e6779cae0ee84f72484011c6664aa6e0115f0884fe6ea 6.55kB / 6.55kB 0.0s => => sha256:1f4aa5f271706415a72663910ccf59119717953b62c386ef41e4a68f98e23f6a 1.94kB / 1.94kB 0.0s => => sha256:a94bc8b916f490a19089291c3de0516a88873a24a24d5dfc9803579fde064b70 6.01kB / 6.01kB 0.0s => => sha256:de47083ed7d7e66ba5116fed0a5b036b7c75ac74b2cfb0d9c3b89c79371c4a1 29.74MB / 29.74MB 12.4s => => sha256:bf574942e5319276c272844124b5243c55e898c9e1dca768428712d17246fca2 20.69MB / 20.69MB 8.9s => => sha256:6828893045b86c6fead19498a5a1ea454b5602d9f450b30ff7b848cd6115d5de 159B / 159B 9.5s => => sha256:6e8d4ea1b4bfc2188478f4fa665e4590031008651c8f7121476d689958611d54 2.28kB / 2.28kB 10.0s => => extracting sha256:de47083ed7d7e66ba5116fed0a5b036b7c75ac74b2cfb0d9c3b89c79371c4a17 9.0s => => extracting sha256:bf574942e5319276c272844124b5243c55e898c9e1dca768428712d17246fca2 7.1s => => extracting sha256:94c27faa059be473551ae5c1e4c236ba47e5ea786ca558b4cbec3c2b61ed10e4 4.5s => => extracting sha256:6828893045b86c6fead19498a5a1ea454b5602d9f450b30ff7b848cd6115d5de 0.0s => => extracting sha256:6e8d4ea1b4bfc2188478f4fa665e4590031008651c8f7121476d689958611d54 0.0s => [internal] load build context 32.9s => => transferring context: 66.93MB 32.8s => [2/3] WORKDIR /app 0.9s => [3/3] COPY build/libs/step04_empApp-0.0.1-SNAPSHOT.jar app.jar 0.3s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:15fee192e27e697aea786c9146dcdfeee85a9c8f9272d06f4c333ab8bdc3e64d 0.0s => => naming to docker.io/library/springboot-emp:1.0 0.0s View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/mc4idf90lc1kjdq0y88j79gjf PS C:\Users\서지혜\Desktop\FISA\ce6\04.SpringBoot> docker savePS C:\Users\서지혜\Desktop\FISA\ce6\04.SpringBoot> scp -P 2015 springboot-emp.tar server01@server01:~/

잘 들어온 모습!
이제
4단계 — server01 conainterd로 import하기
sudo ctr images import springboot-emp.tar완료되면 이미지 확인:
bashsudo ctr images ls | grep springboot만들어야 할 YAML 파일은 총 6개입니다.
순서대로 만들 파일:
- secret.yaml — DB 비밀번호 base64 암호화
- configmap.yaml — DB URL, 포트 등 설정값
- mysql-deployment.yaml — MySQL Pod + PersistentVolume
- mysql-service.yaml — MySQL 내부 접속용 Service
- springboot-deployment.yaml — jar 파일 담은 Pod
- springboot-service.yaml — 외부에서 접속할 Service
1단계 — 작업 폴더 생성
mkdir -p ~/k8s-emp && cd ~/k8s-emp
2단계 — Secret 생성 (비밀번호 암호화)
cat <<EOF > secret.yaml apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque stringData: db-username: user01 db-password: user01 EOF
3단계 — ConfigMap 생성 (DB 설정)
cat <<EOF > configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-config data: db-url: jdbc:mysql://mysqldb:3306/fisa?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true db-name: fisa EOF
4단계 — MySQL Deployment + PersistentVolume
cat <<EOF > mysql-deployment.yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /data/mysql --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: db-password - name: MYSQL_DATABASE valueFrom: configMapKeyRef: name: mysql-config key: db-name - name: MYSQL_USER valueFrom: secretKeyRef: name: mysql-secret key: db-username - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: db-password ports: - containerPort: 3306 volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc EOF
5단계 — MySQL Service
cat <<EOF > mysql-service.yaml apiVersion: v1 kind: Service metadata: name: mysqldb spec: selector: app: mysql ports: - port: 3306 targetPort: 3306 type: ClusterIP EOF
6단계 — SpringBoot Deployment
cat <<EOF > springboot-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: springboot-emp spec: replicas: 1 selector: matchLabels: app: springboot-emp template: metadata: labels: app: springboot-emp spec: containers: - name: springboot-emp image: docker.io/library/springboot-emp:1.0 imagePullPolicy: Never env: - name: DB_USERNAME valueFrom: secretKeyRef: name: mysql-secret key: db-username - name: DB_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: db-password - name: SPRING_DATASOURCE_URL valueFrom: configMapKeyRef: name: mysql-config key: db-url ports: - containerPort: 8083 EOF
7단계 — SpringBoot Service
cat <<EOF > springboot-service.yaml apiVersion: v1 kind: Service metadata: name: springboot-emp-service spec: selector: app: springboot-emp ports: - port: 8083 targetPort: 8083 nodePort: 30083 type: NodePort EOF
8단계 — 전부 배포
kubectl apply -f secret.yaml kubectl apply -f configmap.yaml kubectl apply -f mysql-deployment.yaml kubectl apply -f mysql-service.yaml kubectl apply -f springboot-deployment.yaml kubectl apply -f springboot-service.yaml
9단계 — 상태 확인
kubectl get pods kubectl get services728x90