-
[쿠버네티스] 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
최종 동작확인
'DevOps > K8s' 카테고리의 다른 글