ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [쿠버네티스] MySQL + 스프링 부트 연동
    DevOps/K8s 2023. 11. 14. 09:23

    MySQL 생성

    1. NFS 설정

    서버와 클라이언트에 패키지를 설치했다는 가정하에 진행이 된다.

    vi /etc/exports # 디렉토리와 아이피 지정
    
    # 하단에 추가할 디렉토리 지정 ( *부분에 아이피를 특정하거나 *로 전체 열어둘 수 있다, 그 뒤에는 권한 설정 관련) 
    /mnt/shared/tp-back-app-mysql *(ro,rw,sync,no_root_squash)
    
    또한 쓰기 권한을 주기 위해서 chmod 777을 부여
    sudo chmod 777 /mnt/shared/tp-back-app-mysql
    
    # 서비스 재시작
    service nfs restart
    
    # 목록 확인
    exportfs -v

     

    1. PV 생성

    nfs는 이미 설정을 해놓았기때문에 pv,pvc를 생성한다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nfs-tp-back-app-mysql
      namespace: tp-penguin-app
      labels:
        type: nfs-tp-back-app-mysql
    spec:
      storageClassName: "nfs-tp-back-app-mysql"
      capacity:
        storage: 20Gi
      accessModes:
        - "ReadWriteMany"
      persistentVolumeReclaimPolicy: Retain
      nfs:
        server: 192.168.219.127 # 사설에 등록한 nfs 서버 아이피 등록
        path: /mnt/shared/tp-back-app-mysql # nfs 서버 디렉토리 지정

     

    2. PVC 생성

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc-tp-back-app-mysql
      labels:
        name: nfs-pvc-tp-back-app-mysql
    spec:
      storageClassName: "nfs-tp-back-app-mysql"
      accessModes:
      - "ReadWriteMany"
      resources:
        requests:
          storage: 20Gi
      volumeMode: Filesystem

     

    3. ConfigMap 생성

    mysql yaml 파일에 configmap과 secret 설정

     

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tp-back-app-mysql-config
    data:
      MYSQL_ROOT_HOST: "%"
      profile: dev
      TP-BACK-APP-MYSQL-DEV-URI: lb.k8s.ha
      TP-BACK-APP-MYSQL-DEV-PORT: "30201"
      TP-BACK-APP-USER-PASSWORD: "1234"
      TP-BACK-APP-USER-NAME: tp-back-app
      TP-BACK-APP-MYSQL-SCHEMA: tp-back-app

     

    4. Secret 생성

    시크릿은 생성시 base64로 인코딩이 필요하기 때문에

    echo -n 'password' | base64 로 인코딩 후에 value에 세팅한다.

    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: tp-back-app-mysql-secret
    data:
      MYSQL_ROOT_PASSWORD: dG9yeVZpYw==

     

    5. Deployment 생성

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tp-back-app-mysql
    spec:
      selector:
        matchLabels:
          app: tp-back-app-mysql
      template:
        metadata:
          name: tp-back-app-mysql
          labels:
            app: tp-back-app-mysql
        spec:
          containers:
          - name: mysql
            image: mysql:5.7
            ports:
            - name: mysql-port
              containerPort: 3306
            env:
            - name: MYSQL_ROOT_HOST
              valueFrom: # configMap에서 특정 value가져오기
                configMapKeyRef:
                  name: tp-back-app-mysql-config
                  key: MYSQL_ROOT_HOST
            - name: MYSQL_ROOT_PASSWORD
              valueFrom: # secret에서 특정 value가져오기
                secretKeyRef:
                  name: tp-back-app-mysql-secret
                  key: MYSQL_ROOT_PASSWORD
            volumeMounts:
            - name: tp-back-app-mysql
              mountPath: /var/lib/mysql
          volumes: # nfs pvc 설정 부분
          - name: tp-back-app-mysql
            persistentVolumeClaim:
              claimName: nfs-pvc-tp-back-app-mysql

     

    6. Service 생성

    svc의 경우 외부에서 접속 필요한경우 NodePort로 생성하고 내부에서만 적용할 경우 ClusterIP 적용

     

    DataGrip또는 DB 툴로 접속 여부 확인

    apiVersion: v1
    kind: Service
    metadata:
      name: tp-back-app-mysql-dev-svc
    spec:
      type: NodePort
      selector:
        app: tp-back-app-mysql
      ports:
      - protocol: TCP
        port: 3306
        targetPort: 3306
        nodePort: 30201
      clusterIP: 10.102.175.224

     

    스프링 부트 생성

    1. appclication yaml 생성

    application.yaml

    spring:
      profiles:
        active: ${profile}
        include:
          -  ${spring.profiles.active}-user-domain
    
    ---
    spring:
      config:
        activate:
          on-profile: local
    
    ---
    spring:
      config:
        activate:
          on-profile: dev
    
    ---
    spring:
      config:
        activate:
          on-profile: prod
    
    ---
    spring:
      config:
        activate:
          on-profile: common

     

    application-dev.yaml

    server:
      port: 3000
      
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://${TP-BACK-APP-MYSQL-DEV-URI}:${TP-BACK-APP-MYSQL-DEV-PORT}/${TP-BACK-APP-MYSQL-SCHEMA}?characterEncoding=UTF-8&serverTimezone=UTC
        username: ${TP-BACK-APP-USER-NAME}
        password: ${TP-BACK-APP-USER-PASSWORD}
    
      jpa:
        show-sql: true
        hibernate:
          ddl-auto: update

     

    스프링에는 받을 env를 configmap과 비밀번호의 경우 secret으로 정해서 yaml 파일을 등록한다.

     

    deployment에 envFrom에 configmap 지정 혹은 정확한 value지정 

     

    2. ConfigMap 생성 

    패스워드와 같은 기밀 정보는 secret에 구분하여 저장하는 것이 필요하다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tp-back-app-dev-config
    data:
      TP-BACK-APP-MYSQL-DEV-PORT: "30201"
      TP-BACK-APP-MYSQL-DEV-URI: [cluster-ip]
      TP-BACK-APP-MYSQL-SCHEMA: tp-back-app
      TP-BACK-APP-USER-NAME: tp-back-app
      TP-BACK-APP-USER-PASSWORD: "1234"

     

    3. Deployment 생성 

    mysql deployment에서는 valueFrom으로 작성하였지만

    이번에 스프링 앱에서는 설정정보가 많아 envFrom을 통해서 파일을 그대로 사용한다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tp-back-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tp-back-app
      template:
        metadata:
          labels:
            app: tp-back-app
        spec:
          containers:
          - image: acoursove2/tp-back-app:latest
            name: tp-back-app
            ports:
            - containerPort: 3000
            envFrom:
              - configMapRef:
                  name: tp-back-app-dev-config

     

    4. Service 생성

    외부에서 접근할 포트를 지정한다.

    apiVersion: v1
    kind: Service
    metadata:
      name: tp-back-app-svc
    spec:
      type: NodePort
      selector:
        app: tp-back-app
      ports:
        - port: 3000
          targetPort: 3000
          nodePort: 31002

     

    최종 동작확인 

    댓글

Designed by Tistory.