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 |