'

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 프로젝트에서)

     
    properties
    spring.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 test

    jar 파일 이름 확인:



    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.jar
     
     
     
     
     

    3단계 — Dockerfile 작성 (호스트 프로젝트 루트에)

     
    dockerfile
    FROM 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 save

     

    PS 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

    완료되면 이미지 확인:

     
     
    bash
    sudo ctr images ls | grep springboot

     

     

     

     

     

     

     

    만들어야 할 YAML 파일은 총 6개입니다.

    순서대로 만들 파일:

    1. secret.yaml — DB 비밀번호 base64 암호화
    2. configmap.yaml — DB URL, 포트 등 설정값
    3. mysql-deployment.yaml — MySQL Pod + PersistentVolume
    4. mysql-service.yaml — MySQL 내부 접속용 Service
    5. springboot-deployment.yaml — jar 파일 담은 Pod
    6. 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 services
    

     

     

     

     

    728x90

    댓글

Designed by Tistory.
티스토리 친구하기