hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

build server 부터 배포까지 - 3. GKE   Spring   MySQL 배포 - MySQL 배포 및 Mysql + Spring 배포
DevOps/Tutorial

build server 부터 배포까지 - 3. GKE Spring MySQL 배포 - MySQL 배포 및 Mysql + Spring 배포

먼저, gcp terminal에서 편집기를 이용할 수 있다! 어제 vs code로 연결할라고 아득바득 할 필요가 없었다...

편집기 열기
편집기

 

1. mysql 배포

GKE 기반 kubenertes에서 mysql을 수행하기 위해서는 pvc 생성, deploy 및 service가 필요하다.

 

/home/hyelie/k8s-test/mysql-pvc.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

GKE에서 1Gi의 pvc를 만들겠다는 것이다. 그냥 kubernetes만 사용하낟면 pvc, pv도 생성해야 하지만 gke이기 때문에 pvc만 생성해도 된다.

 

/home/hyelie/k8s-test/mysql-service.yml

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: database
spec:
  type: LoadBalancer
  ports:
  - port: 3306
  selector:
    app: mysql
    tier: backend

 

/home/hyelie/k8s-test/mysql-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deploy
spec:
  selector:
    matchLabels:
      app: mysql
      tier: backend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
        tier: backend
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-root-pw
                key: rootpw
          - name: MYSQL_DATABASE
            valueFrom:
              secretKeyRef:
                name: dbinfo
                key: dbname
          - name: MYSQL_USER
            valueFrom:
              secretKeyRef:
                name: userinfo
                key: username
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: userinfo
                key: userpw
          - name: LANG
            value: C.UTF-8
        ports:
          - containerPort: 3306
            name: mysql
        args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_general_ci
        volumeMounts:
          - name: mysql-persistent-storage
            mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pvc


# mysql-root-pw : rootpw
# kubectl create secret generic mysql-root-pw --from-literal=rootpw=root

# userinfo: username, userpw
# kubectl create secret generic userinfo --from-literal=username='depuser' --from-literal=userpw='depuserpw'

# dbinfo : dbname, url
# kubectl create secret generic dbinfo --from-literal=dbname=bizschema --from-literal=url='jdbc:mysql://35.184.171.248:3306/bizschema?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnectForPools=true&serverTimezone=UTC'

# kubectl get secrets

다음으로 mysql의 service, deploy 양식을 맞춰준다. 보안을 위해 secret을 사용한다. 아래에 주석쳐져 있는 것을 각각 terminal에 입력하면 된다. 이후

 

$ kubectl apply -f mysql-pvc.yml -f mysql-service.yml -f mysql-deploy.yml
$ kubectl get all

 

을 입력하면 아래와 같은 결과가 출력된다.

 

 

service external IP도 열려있고, deploy, pod도 잘 열려있다. pod에 접속해보자.

 

 

$ kubectl exec -it [pod 이름] bash

 

내 경우엔 pod 이름이 mysql-deploy-85fd874857-kvl7x니까 이것을 입력해 주었다.

 

# mysql -u root -p root
mysql> show databases;
mysql > select user, host from mysql.user;

이렇게 입력하면, 위 사진과 같이 board라는 database가 만들어져 있고 user도 만들어져 있다.

 

 

 


 

 

 

2. local spring에서 db로 접속, CI 서버에서 build

저번에 작성한 게시판 예제의 application.properties에서, datasource url의 IP와 username, password를 수정한다.

 

/src/main/resources/applictaion.properties

#MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://34.71.181.183:3306/board?autoReconnect=true&useSSL=false&useUnicode=yes&characterEncoding=UTF-8&autoReconnectForPools=true&serverTimezone=UTC
spring.datasource.username=user1
spring.datasource.password=userpw1

#JPA
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true

 

이렇게 하고 실행하니 아주 잘 된다. git에 push하면 미리 만들어 둔 CI 서버로 넘어간다.

 

/build.gradle

plugins {
	id 'org.springframework.boot' version '2.5.3'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
	id "org.sonarqube" version "3.0"

}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

	runtimeOnly 'mysql:mysql-connector-java'

	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

}

test {
	useJUnitPlatform()
}

 

build.gradle에 sonar qube plugin도 넣어야 한다. 그리고 sonar qube에서는 새 프로젝트를 만들어야 할 것이다.

 

build 완료!
gcr에도 push되었음.

build가 끝났고, gcr에 내 image가 들어갔다.

 

 

 


 

 

 

3. GCR image GKE에 올리고 배포

/home/hyelie/k8s-test/spring-board.yml

apiVersion: apps/v1
kind: Deployment
metadata: # deployment의 metadata
  name: spring-board-deploy
spec: # deployment의 spec
  replicas: 4
  selector:
    matchLabels:
      app: spring
      tier: backend
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 2
  template: # 다음 줄부터는 각각 pod의 설정
    metadata:
      labels: # 각 pod들의 metadata
        app: spring
        tier: backend
    spec: # pod의 spec
      containers:
        - name: echo
          image: gcr.io/numeric-replica-320807/boardex
          ports:  # 
            - containerPort: 8080
          readinessProbe: # 로드가 너무 많아 일시적 처리 불가 상태를 확인
            httpGet:
              port: 8080
              path: /
            initialDelaySeconds: 10
            failureThreshold: 5
          livenessProbe:  # 응답이 없으면 자동 재시작.
            httpGet:
              port: 8080
              path: /
            initialDelaySeconds: 10
            failureThreshold: 5
          env:
            - name: SPRING_DATASOURCE_USERNAME
              valueFrom:
                secretKeyRef:
                  name: userinfo
                  key: username
            - name: SPRING_DATASOURCE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: userinfo
                  key: userpw
            - name: SPRING_DATASOURCE_URL
              valueFrom:
                secretKeyRef:
                  name: dbinfo
                  key: url


---

apiVersion: v1
kind: Service
metadata: # Service의 metadata
  name: spring-board-service
spec:
  type: LoadBalancer
  ports:
    - port: 8080  # Service가 생성할 Port
      targetPort: 8080  # Service가 접근할 pod의 port
  selector: # Service가 접근할 pod의 label 조건
    app: spring
    tier: backend

 

secret은 앞에서 사용했던 것들이다.

 

$ kubectl apply -f spring-board.yml

 

로 실행시킨다.

 

실행 결과

 

1개의 mysql이 돌아가고 있고, loadbalancer가 외부 포트를 할당했으며, 입력을 4개의 pod로 나누어 주게 되었다. 이후에는 spring-board-service의 external IP로 접속해 보자.

 

출력 결과

 

넘모 감격스럽다.....

'DevOps > Tutorial' 카테고리의 다른 글

build server 부터 배포까지 - 5. GKE Spring Redis 배포 - Local, CI Server, Deploy Server에서 Redis와 연동  (0) 2022.10.05
build server 부터 배포까지 - 4. GKE Spring MySQL 배포 - Local, CI Server, Deploy Server에서 MySQL 연동  (0) 2022.10.05
build server 부터 배포까지 - 2. GKE Spring MySQL 배포 - GKE 클러스터 생성 및 spring 예제 배포  (0) 2022.10.05
build server 부터 배포까지 - 1. GCP + Docker + Jenkins + Gitlab + JUnit + SonarQube + GCR image push  (0) 2022.10.05
EC2 Docker Jenkins Spring Gitlab 자동 빌드 - 6. 수정사항, ECR push  (0) 2022.10.05
    hyelie
    hyelie

    티스토리툴바