[Container] 3 Tier(Kubernetes)
3계층 아키텍처 구성
- mysql 이미지를 이용해서 DB서버 설정(시크릿, 볼륨, 파드, 서비스(클러스터IP))
- tomcat 이미지를 이용해서 was 서버 설정(파드, 서비스(클러스터IP))
- httpd 서비스를 이용해서 web 서버 설정(파드, 서비스(로드밸런서))
- 각 서버의 이중화 구성은 하지말고 1대씩만 설정
DB 설정
- 시크릿 생성
apiVersion: v1 kind: Secret metadata: name: mysql-sec data: MYSQL_ROOT_PASSWORD: cXdlcjEyMzQ=
- pv 생성
```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10G
accessModes:
- ReadWriteOnce
local:
path: /mysql-volume
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [node1]} ```
- matchExpressions:
- ReadWriteOnce
local:
path: /mysql-volume
nodeAffinity:
required:
nodeSelectorTerms:
- pvc 생성
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce resources: requests: storage: 10G storageClassName: “” ```
- sql 파드 생성
```yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
type: db
spec:
nodeSelector:
kubernetes.io/hostname: node1
containers:
- name: container
image: mysql:latest
ports:
- containerPort: 3306 envFrom:
- secretRef: name: mysql-sec volumeMounts:
- name: mysql-pvc-pv mountPath: /var/lib/mysql volumes:
- name : mysql-pvc-pv persistentVolumeClaim: claimName: mysql-pvc ```
- name: container
image: mysql:latest
ports:
- node1에 퍼시스턴트 볼륨 디렉토리 생성
cd / mkdir mysql-volume
- 서비스(클러스터IP)
```yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
selector:
type: db
ports:
- port: 3306 targetPort: 3306 ```
- 확인
master
yum install -y mysql-server mysql -u root -p -h 10.99.38.110 # 서비스의 아이피, 비밀번호를 치고 들어가지면 성공
- sql db 및 테이블 생성
CREATE DATABASE kjh_db; use kjh_db; CREATE TABLE student (sname VARCHAR(10), sage INT); INSERT INTO student VALUES('kim',10); INSERT INTO student VALUES('lee',20); INSERT INTO student VALUES('park',30); INSERT INTO student VALUES('sim',40);
tomcat 설정
- 도커 파일 생성
master
mkdir tomcat cd tomcat wget wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz tar zxvf mysql-connector-java-8.0.19.tar.gz vi Dockerfile
FROM tomcat:9.0 RUN rm -rf /usr/local/tomcat/conf/server.xml ADD ./server.xml /usr/local/tomcat/conf/server.xml RUN mkdir /usr/local/tomcat/webapps/kjh ADD ./test.jsp /usr/local/tomcat/webapps/kjh/test.jsp ADD ./mysql-connector-java-8.0.19/mysql-connector-java-8.0.19.jar /usr/local/tomcat/lib/mysql-connector-java-8.0.19.jar EXPOSE 8080 EXPOSE 8009 CMD catalina.sh run
- 톰캣에 db연결하기
vi server.xml
https://github.com/xc7230/Cloud/blob/main/kubernetes_3tier/tomcat/server.xml 참조
- 테스트용 jsp만들기
vi test.jsp
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Connection conn = null;
ResultSet rs = null;
String url = "jdbc:mysql://mysql-svc:3306/kjh_db?serverTimezone=UTC";
String id = "root";
String pwd = "qwer1234";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pwd);
Statement stmt = conn.createStatement();
String sql = "SELECT sname FROM student";
rs = stmt.executeQuery(sql);
while(rs.next()) {
out.println(rs.getString("sname"));
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
- 이미지 생성
docker build --tag xc7230/tomcat:0.1 . docker push xc7230/tomcat:0.1
- 톰캣 파드 생성
```yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-pod
labels:
type: was
spec:
containers:
- name: container
image: xc7230/tomcat:0.6
ports:
- containerPort: 8009 ```
- name: container
image: xc7230/tomcat:0.6
ports:
- 톰캣 서비스
```yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
type: was
ports:
- port: 8009 targetPort: 8009 ```
- 확인
curl 192.168.104.7:8080/test.jsp
httpd 설정
master
mkdir httpd
cd httpd
vi Dockerfile
- Dockerfile 작성
FROM httpd:2.4 ADD ./test.html /usr/local/apache2/htdocs/test.html RUN apt update RUN apt install -y libapache2-mod-jk RUN cp /usr/lib/apache2/modules/mod_jk.so /usr/local/apache2/modules/mod_jk.so RUN sed -i 's/localhost/tomcat-svc/g' /etc/libapache2-mod-jk/workers.properties RUN rm -rf /usr/local/apache2/conf/httpd.conf ADD ./httpd.conf /usr/local/apache2/conf/httpd.conf EXPOSE 80 CMD httpd-foreground
- test 화면 작성
vi test.html
```html
test
- httpd.conf 파일 수정<br/>
https://github.com/xc7230/Cloud/blob/main/kubernetes_3tier/http/httpd.conf 참조
```conf
LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /usr/local/apache2/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkMount /*.jsp ajp13_worker
JkShmFile /usr/local/apache2/logs/jk-runtime-status
</IfModule>
# 마지막에 추가
- 이미지 파일 업로드
docker build --tag xc7230/httpd:0.1 . docker push xc7230/httpd:0.1
- 파드 생성
```yaml
apiVersion: v1
kind: Pod
metadata:
name: httpd-pod
labels:
type: web
spec:
containers:
- name: container
image: xc7230/httpd:0.2
ports:
- containerPort: 80 ```
- name: container
image: xc7230/httpd:0.2
ports:
- 서비스 생성
```yaml
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
type: web
ports:
- port: 80 targetPort: 80 type: LoadBalancer ```
- 확인
curl 192.168.104.8/test.html curl 192.168.104.8/test.jsp
- 서비스
```yaml
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
type: web
ports:
- port: 80 targetPort: 80 type: LoadBalancer ```
- 확인
다음 url을 참조하여
http://192.168.197.221/test.jsp 접속
다음 화면처럼 was에 만들어 놨던 test.jsp가 실행되고 안에 DB정보가 나오면 성공적이다.
설정 파일 웹서버에서 불러오기
- tomcat
Dockerfile
FROM tomcat:9.0 RUN rm -rf /usr/local/tomcat/conf/server.xml RUN mkdir /usr/local/tomcat/webapps/kjh ADD ./mysql-connector-java-8.0.19/mysql-connector-java-8.0.19.jar /usr/local/tomcat/lib/mysql-connector-java-8.0.19.jar EXPOSE 8080 EXPOSE 8009 CMD wget http://192.168.197.1:1234/test.jsp -O /usr/local/tomcat/webapps/kjh/test.jsp && wget http://192.168.197.1:1234/server.xml -O /usr/local/tomcat/conf/server.xml && catalina.sh run
- httpd
Dockerfile
FROM httpd:2.4 ADD ./test.html /usr/local/apache2/htdocs/test.html RUN apt update RUN apt install -y libapache2-mod-jk wget RUN cp /usr/lib/apache2/modules/mod_jk.so /usr/local/apache2/modules/mod_jk.so RUN sed -i 's/localhost/tomcat-svc/g' /etc/libapache2-mod-jk/workers.properties RUN rm -rf /usr/local/apache2/conf/httpd.conf EXPOSE 80 CMD wget http://192.168.197.1:1234/test.html -O /usr/local/apache2/htdocs/test.html && wget http://192.168.197.1:1234/httpd.conf -O /usr/local/apache2/conf/httpd.conf && httpd-foreground
- apt update가 안될때는
docker build --no-cache --tag [태그명] # 빌드할때 다음 명령어 추가