본문 바로가기

쿠버네티스

쿠버네티스 Tomcat - MySQL 연동

tomcat - mysql 연동 준비

이전블로그 참조(연동 방법)
https://bo20cy.tistory.com/13
이전블로그 참조(쿠버네티스 구성)
https://bo20cy.tistory.com/19 

 

  • 커넥터, 연동파일 2개 포함
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.2.0.tar.gz 
tar -zxvf mysql-connector-j-8.2.0.tar.gz 
sudo mv mysql-connector-j-8.2.0/mysql-connector-j-8.2.0.jar mysql-connector-j-8.2.0.jar

 

mysqlconnector 공홈

https://dev.mysql.com/downloads/connector/j/

 

mysqldb.jsp
(mysql연동 확인 파일)

<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=utf-8" %>
<%
    String DB_HOST = System.getenv("MYSQL_HOST");
    String DB_PORT = System.getenv("MYSQL_PORT");
    String DB_NAME = "dokudb";
    String DB_USER = "root";
    String DB_PASSWORD = "1q2w3e4r";
    String DB_URL = "jdbc:mysql://" + DB_HOST + ":" + DB_PORT + "/" + DB_NAME;
    Connection conn;
    Statement stmt;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
        stmt = conn.createStatement();
        conn.close();
        out.println("MySQL Connection Success!");
    } catch(Exception e) {
        out.println(e);
    }
%>

 

성공시 "MySQL Connection Success!"

 

 

mysqll.jsp
(db데이터 확인)

<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.sql.*" %>
<html>
<head>
    <title>Member List</title>
</head>
<body>
    MEMBER Table Contents
    <table width="100%" border="1">
        <tr>
            <td>Name</td>
        </tr>
        <%
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String jdbcDriver = "jdbc:mysql://" + System.getenv("MYSQL_HOST") + ":" + System.getenv("MYSQL_PORT") + "/dokudb"; // 환경변수에서 URL 읽어오기
            String dbUser = "root";
            String dbPass = "1q2w3e4r";
            String query = "SELECT * FROM dokutable";

            conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
            stmt = conn.createStatement();
            rs = stmt.executeQuery(query);

            while (rs.next()) {
        %>
        <tr>
            <td><%= rs.getString("name") %></td>
        </tr>
        <%
            }
        } catch (ClassNotFoundException | SQLException ex) {
            out.println(ex.getMessage());
            ex.printStackTrace();
        } finally {
            if (rs != null) try { rs.close(); } catch (SQLException ex) {}
            if (stmt != null) try { stmt.close(); } catch (SQLException ex) {}
            if (conn != null) try { conn.close(); } catch (SQLException ex) {}
        }
        %>
    </table>
</body>
</html>

 

name데이터를 넣고 출력하는 것이다.

 

 

 

Dockerfile 제작

위에 3개 포함하여 Dockerfile 제작하자
Dockerfile

FROM tomcat:latest

COPY ./index.html /usr/local/tomcat/webapps/ROOT/
COPY ./mysqldb.jsp /usr/local/tomcat/webapps/ROOT/
COPY ./mysqll.jsp /usr/local/tomcat/webapps/ROOT/
COPY ./mysql-connector-j-8.2.0.jar /usr/local/tomcat/lib/

CMD ["catalina.sh", "run"]

 

준비는 끝났다 이미지를 제작하자

docker build -t bo20cy/tomcat-image:0.1 .


이제는 버젼관리를 위해 태그를 붙여보자

docker push bo20cy/tomcat-image:0.1

 

 

이미지를 적용하자

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: ##dockerhub_ID##/tomcat-image:0.1
        ports:
        - containerPort: 8080

바꿔서 적용해준다.

MySQL 파드를 만들어 준다

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-statefulset
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: 1q2w3e4r
            - name: MYSQL_DATABASE
              value: dokudb

 

 

statefulset으로 만들어준다.


공식 설명
https://kubernetes.io/ko/docs/concepts/workloads/controllers/statefulset/

  • 안정된, 고유한 네트워크 식별자.
  • 안정된, 지속성을 갖는 스토리지.
  • 순차적인, 정상 배포(graceful deployment)와 스케일링.
  • 순차적인, 자동 롤링 업데이트.

kubectl apply -f mysql.yml

tomcat가서 확인해 주자라고 했지만 tomcat에 jsp파일을 잘보면
System.getenv함수를 써서 mysql파드를 변수로 지정해 줬다.

mysql 파드는 생성가 삭제가 반복될수 있으므로 앞단에 서비스를 생성해서
사용성을 늘리자

graph LR
C(Tomcat) --> A((서비스)) --> B(MySQL)

쿠버네티스 서비스 공식
https://kubernetes.io/ko/docs/concepts/services-networking/service/

 

 

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

 

 

그리고 tomcat에는 환경변수를 지정해 줘야한다.

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: ##dockerhub_ID##/tomcat-image:0.1
        ports:
         - containerPort: 8080
        env:
         - name: MYSQL_HOST
           value: mysql-service
         - name: MYSQL_PORT
           value: "3306"

kubectl apply -f mysql.yml
kubectl apply -f tomcat.yml

그리고 적용시켜준다

 

kubectl run -it busybox --restart=Never --rm --image=busybox sh

wget -qO - http://ip/mysqldb.jsp
잘나온다

 

 


wget -qO - http://ip/mysqll.jsp

안나온다. table을 정의되지 않았기 때문이다.

 

 

접속해서 확인하자

table이 없다 만들어주자


kubectl exec -it mysql~~~ -- /bin/bash
mysql -u root -p

 

use dokudb;
CREATE TABLE IF NOT EXISTS dokutable (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

INSERT INTO dokutable (name) VALUES 
  ('John Doe'),
  ('Jane Smith'),
  ('Michael Johnson'),
  ('Emily Williams'),
  ('Christopher Brown');

 

wget -qO - http://ip/mysqll.jsp

 

잘된다.

 

 

  • 파드는 계속 바뀌니 kubectl configmap을 사용!
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-init-scripts
data:
  init.sql: |-
    CREATE DATABASE IF NOT EXISTS dokudb;
    USE dokudb;
    CREATE TABLE IF NOT EXISTS dokutable (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(255)
    );

    INSERT INTO dokutable (name) VALUES
      ('John Smith'),
      ('Jane Doe'),
      ('Michael Johnson'),
      ('Emily Williams'),
      ('Christopher Brown');

 

결국 mysql.yml 파일은

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-statefulset
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: 1q2w3e4r
            - name: MYSQL_DATABASE
              value: dokudb
          volumeMounts:
            - name: mysql-init-scripts
              mountPath: /docker-entrypoint-initdb.d
              readOnly: true
      volumes:
        - name: mysql-init-scripts
          configMap:
            name: mysql-init-scripts
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-init-scripts
data:
  init.sql: |-
    CREATE DATABASE IF NOT EXISTS dokudb;
    USE dokudb;
    CREATE TABLE IF NOT EXISTS dokutable (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(255)
    );

    INSERT INTO dokutable (name) VALUES
      ('John Smith'),
      ('Jane Doe'),
      ('Michael Johnson'),
      ('Emily Williams'),
      ('Christopher Brown');

 

kubectl apply -f mysql.yml

 

한번 pod를 지워준다.


kubectl delete po mysql~~

잘된다(ip가 바뀌었다.)

 

 

출처:k-paas교육, 15단계로 공부하는 쿠버네티스

'쿠버네티스' 카테고리의 다른 글

쿠버네티스 tomcat 작동  (1) 2024.04.19
쿠버네티스 시작하기  (1) 2024.04.15